User Tools

Site Tools


vba:tutorials:cachedobjectforfunction

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
vba:tutorials:cachedobjectforfunction [17.11.2014 08:38:57]
yaslaw [Funktion mit Cache im Funktionscode]
vba:tutorials:cachedobjectforfunction [12.09.2019 08:17:36] (current)
yaslaw [Komplexeres Beispiel mit Kapselung]
Line 1: Line 1:
 ====== [VBA] Cached Object in einer Function ====== ====== [VBA] Cached Object in einer Function ======
 +//Objekte Cachen, so dass sie nicht jedesmal neu erstellt werden müssen. Sinnvoll bei FSO, %%RegExp%% etc.//
  
 Ein Klassiker: Wir haben eine selbstgeschriebene Funktion (user definied function) die ein %%RegExp%%-Objekt enthält. %%RegExp%%-Objekte können sehr schnell Texte parsen. Am schnellsten sind sie aber, wenn nicht jedesmal der Pattern und die Settings neu initialisiert werden müssen. Bei einzelnen Aufrufen ist das nicht relevant. Wenn man die Funktion hingegen in einem Query (Abgfrage) verwendet, hat man schnell den Fall dass das %%RegExp%%-Objekt 1000 mail initialisiert und 1000 mal entfernt wird. Ein Klassiker: Wir haben eine selbstgeschriebene Funktion (user definied function) die ein %%RegExp%%-Objekt enthält. %%RegExp%%-Objekte können sehr schnell Texte parsen. Am schnellsten sind sie aber, wenn nicht jedesmal der Pattern und die Settings neu initialisiert werden müssen. Bei einzelnen Aufrufen ist das nicht relevant. Wenn man die Funktion hingegen in einem Query (Abgfrage) verwendet, hat man schnell den Fall dass das %%RegExp%%-Objekt 1000 mail initialisiert und 1000 mal entfernt wird.
Line 28: Line 29:
  
 ===== Funktion mit Cache im Funktionscode ===== ===== Funktion mit Cache im Funktionscode =====
-Jetzt baue ich mal ein Cache mit der Static Dimensionierung ein. Das ganzw ist aber noch mässig lesbar+Jetzt baue ich mal ein Cache mit der Static Dimensionierung ein. Das ganze ist aber noch mässig lesbar
 <code vb tutorial_cachedObject.bas>​ <code vb tutorial_cachedObject.bas>​
 Attribute VB_Name = "​tutorial_cachedObject"​ Attribute VB_Name = "​tutorial_cachedObject"​
Line 91: Line 92:
 </​code>​ </​code>​
  
-===== Anwendung =====+Ein weiterer Vorteil, ich muss mich in meinem eigentlichen Programm nicht darum kümmern, ob ein Objekt bereits initialisiert ist oder nicht. 
 + 
 +===== Komplexeres Beispiel mit Kapselung ===== 
 +Ein Beispiel aus der [[vba:​access:​classes:​xlsxeporter|]]. Dort brauche in ein Objekt Excel, ein Workbook und ein Worksheet. 
 +Je nach Aufruf der Methoden der Klasse müsste ich an mehreren Stellen prüfen, ob das Excel-Objekt bereits initialisiert ist oder nicht. Und wenn nicht, dass muss ich es erstellen. Mit den Property und Static kümmert sich das Program selber drum 
 +<code vb>'/​** 
 +' * DieExcel-Instance 
 +' */ 
 +Private Property Get xlsx() As Excel.application 
 +    Static pXlsx As Excel.application 
 +    If pXlsx Is Nothing Then Set pXlsx = New Excel.application 
 +    Set xlsx = pXlsx 
 +End Property</​code>​ 
 + 
 +Dasselbe noch fürs Workbook, das wiederum auf auf dem obigem Property basiert 
 +<code vb>'/​** 
 +' * Das Workbook mitden Exportierten Daten 
 +' */ 
 +Private Property Get wb() As Excel.Workbook 
 +    Static pWb As Excel.Workbook 
 +    If pWb Is Nothing Then Set pWb = xlsx.Workbooks.add 
 +    Set wb = pWb 
 +End Property</​code>​ 
 + 
 +Und für das Worksheet FORMATS. 
 +Falls das noch nicht existiert, wird es sofort angelegt 
 +<code vb>'/​** 
 +' * Temporäres Sheet um die Formate zu speichern 
 +' * Erste Zeile: Spalte(DAO.DataTypeEnum) beinhaltet das entsprechende Format 
 +' */ 
 +Private Property Get wsFomats() As Excel.Worksheet 
 +    Static ws As Excel.Worksheet 
 +On Error GoTo Err_Handler 
 +    If ws Is Nothing Then Set ws = wb.Worksheets(C_FORMAT_SHEET_NAME) 
 + 
 +Exit_Handler:​ 
 +    Set wsFomats = ws 
 +    Exit Property 
 +     
 +Err_Handler:​ 
 +    If Err.Number = 9 Then 
 +        Set ws = wb.Worksheets.add():​ ws.Name = C_FORMAT_SHEET_NAME 
 +        Resume Exit_Handler 
 +    Else 
 +        Err.Raise Err.Number, Err.source, Err.Description,​ Err.HelpFile,​ Err.helpContext 
 +    End If 
 +End Property</​code>​ 
 + 
 +In meinem eigentlichen Code kann ich gemütlich auf wsFomats zugreifen ohne mich darum zu kümmern, ob es das schon gibt oder nicht. 
 +Hier zum Beispiel werden Daten aus einer an vor das Format-Sheet kopiert 
 +<code vb> ​   '​Temporäres Workbook/​sheet öffnen 
 +    Dim wbTemp As Excel.Workbook: ​  Set wbTemp = xlsx.Workbooks.Open(tempExportFilePath) 
 +    Dim wsTemp As Excel.Worksheet: ​ Set wsTemp = wbTemp.Worksheets(source) 
 +    '​Export in das aktuelle Worksheet kopieren 
 +    wsTemp.Copy before:​=wsFomats 
 +    '​Temporäres WOrkbook schliessen/​löschen 
 +    wbTemp.Close</​code>​ 
 +===== Weitere ​Anwendung =====
 In vielen meiner Funktionen kommt dies zur Anwendung. Hier einige Beispiele: In vielen meiner Funktionen kommt dies zur Anwendung. Hier einige Beispiele:
   *[[vba:​cast:​cdict]]   *[[vba:​cast:​cdict]]
vba/tutorials/cachedobjectforfunction.1416209937.txt.gz · Last modified: 17.11.2014 08:38:57 by yaslaw