Hallo Mr. K,
DateSerial funktioniert allerdings nur für Jahre ab 100 (https://support.microsoft.com/de-de/office/dateserial-funktion-a0128476-83a0-407c-831a-93f2b046f503). Bei Jahren von 0 bis 100 gibt die Funktion das Jahr 2000 ff. aus.
Man könnte die Geschwindigkeit noch etwas verbessern, indem man die Typumwandlung weglässt und die Variablen ordentlich deklariert. Die Division ohne Rest könnte man (ein wenig schneller) mit dem dafür vorgesehene Operator (Backslash) berechnen. Und eine weitere (wenn auch nur sehr geringe) Optimierung kann man bei der Prüfung der Ausnahmen erreichen, indem man die Bedingungen einzeln prüft, dann müssen nicht so viele Vergleiche abgearbeitet werden.
Bei 100.000 Berechnungen konnte zwar die reine Berechnungszeit bei mir von ca. 1,38 auf 0,57 Sekunden prozentual erheblich verringert werden. Allerdings ist das absolut gesehen so marginal, dass es so gut wie gar nicht ins Gewicht fällt, zumal die Berechnungsdauer wohl eher mit den Zellaktualisierungen zusammenhängt.
Dass die Berechnung mit Excelformeln so viel schneller ist, liegt wohl auch daran, dass weniger Berechnungen stattfinden und die Berechnung auch multithreaded erfolgt, während VBA singlethreaded berechnet wird.
Allerdings wird man die 10.000 Osterformeln ja nicht dauernd berechnen müssen, es reicht ja einmal für alle Jahre, dann kann man das Ergebnis statisch in die Zelle schreiben.
Das einzige was ich ändern würde ist die gesonderte Funktion für die Umwandlung in Text bei Jahren vor 1900. Das kann man lösen, indem man den Rückgabewert der Funktion als Variant deklariert und dann entsprechend bei der Zuweisung prüft, ob ein Jahr vor 1900 vorliegt und dementsprechend ein Datum oder einen Text zuweist. Man kann mittels Application.Caller auch prüfen, ob die Funktion in einer Tabelle steht und das Textformat nur dann zuweisen, wenn aus der Tabelle aufgerufen wird.
Gruß
Michael
|