Guten Tag VBA Profis
Vorstellung: Ich arbeite zur Zeit an einer Industrie VBA Lösung. Umfang: 12 Module, 7 Formulare, 9 Worksheets. Momentan +- 6000 Zeilen Code.
Ich bin neu in der VBA Programmierung, komme aber aus dem C# und Java Advanced Umfeld.
Teil Aufgabe:
Gegeben sind Werte an variabler Anzahl (10-500).
Suche jeden dieser Werte in einem gegebenen Range. Wenn gefunden: Folgt Aktion je nach Position.. (unwesentlich)
Ansatz:
For Loop durch die gegebenen Werte, für jeden Werte currentValue mach: givenRange.Find(currentValue, LookAt:=xlWhole).
Klappt alles wunderbar. Aber es muss schneller gehen.
Folgende Massnahmen habe ich bereits vorgenommen:
- Von ForEach in ForEach auf Range.Find in ForEach umgestellt. (ja ich weiss, kein Kommentar ;)
- Von Range.copy() und .paste auf direkte Zuweisung umgestellt.
- Option Explicit
- Verzicht auf Select/Active Quatsch.
- Screen Update aus.
Mit diesen Massnahmen spare ich bereites gut 20% Zeit vom Anfangszustand. (Auf eine Liste von 700 Elementen gute 7 Sekunden)
Nach eigener Analyse ist die Laufzeitkomplexität der signifikanten Methode O(n), zuerst war es O(n^2).
Also muss ich bei den einzelnen O(1) Methoden innerhalb der Schleifen - Iteration ansetzten, die einzigen sinnvollen darin enthaltenen sind .sort() und .find()
Konkrete Fragen
Sind Workarounds bekannt um diese nativen Excel Funktionen zu optimieren?
Ideen zu .find(): Implementationen mit Hash Tables in Kombination mit Binärersuche, Heap Sorts etc..?
Ideen zu .sort(): Eigene QuickSort Implementierungen.
Ich danke für Ihre kompetenten Antworten. Beste Grüsse Thomas
|