Um die Performance von langlaufenden Berechnungen mit MS Excel zu erhöhen, habe ich für eine immer wiederkehrende Berechnung einen rudimentären Key-Value Cache eingebaut mit Hilfe eines Dictionary Objektes.
Eine Dictionary Objekt in VBA ist ein Object aus der Microsoft Scripting Library, die dafür in das Projekt eingebunden muss über:
- Visual Basic Editor in Excel öffnen
- Extras -> Verweise
- Microsoft Scripting Library Kreutzchen setzen
Ein Dictionary Object ist wie ein assoziatives Array, was für VBA schon das höchste der Gefühle ist 🙂
Folgender Code cached das Ergebnis eines Funktionsaufrufes in einer öffentliche (public, globaler Scope) Variablen namens „cache“:
'this code does not run, it is pseudo code understand the cache behaviour 'public variable, global scope Dim cache As Scripting.Dictionary sub mySub() 'initialize cache Set cache = = New Scripting.Dictionary For Each myRow In rows resultFromCache = myFunction(1 , 2, 3) Next myRow end Sub Function myFunction(input1, input2, input3) 'chache this result cacheKey = input1 & " " & input2 & " " & input3 If Not cache.Exists(cacheKey) Then result = cacheAbleFunction(input1, input2, input3) cache.Add cacheKey, result Else result = cache.Item(cacheKey) End If myFunction = result end Function Function cacheAbleFunction(input1, input2, input3) 'do something here very slow or very often cacheAbleFunction = input1 * input2 * input3 * input1 * input2 * input3 * input1 * input2 * input3 end Function
Weitere Tipps zur Performance-Optimierung von Excel Makros habe ich in dem Artikel Excel Markos Speed Up Guide zusammengefasst.