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.