Schnelles Makro vs. langsame Tabelle
17.11.2023 22:24:20
Dieter Krüsemann
es geht um eine umfangreiche auf mehrere Tabellenblätter aufgeteilte Optimierung eines Modells, bei der mehrere Parameter durchgetestet werden. Am Ende steht ein Parametersatz für ein optimales Ergebnis zur Verfügung.
Je Parameter werden 2 bis 10 einzelne Werte durchprobiert. Diese Werte werden in einem Makro erzeugt und vom Makro einzeln an mehrere rechnende Tabellen übergeben, die das zu optimierende Modell enthalten. Je Parameterwert wird in der Tabelle geprüft, ob er das Modell verbessert hat. Ist das der Fall, wird der Parameter vom Makro an eine definierte Stelle in einer der Tabellen geschrieben. Der Durchlauf für einen Parametersatz dauert etwa 20 bis 30 Sekunden.
Dabei ergeben sich mit Hilfe des Makros Parametersätze, die zu "optimalen" Ausgabewerten des Modells führen sollten. Ein in der Abfolge identischer Durchlauf der Parameter aber mit manueller Eingabe führt zu anderen - besseren - "optimalen" Ausgabewerten des Modells. Die Abweichung - automatisch zu manuell - ist zahlenmäßig immer genau reproduzierbar.
Meine Vermutung: die manuelle Eingabe ist langsam genug, damit das Modell vollständig gerechnet werden kann, während der wesentlich schnellere Durchlauf per Makro dem Modell zu wenig Zeit zur vollständigen Berechung lässt, bevor der nächste Parameterwert an das Modell übergeben wird. Indiz: in einigen Zellen fehlten Zahlen, die das Makro hätte schreiben müssen.
Damit das Modell nach Werteübergabe tatsächlich zuende rechnet, habe ich nach der Werteübergabe noch dies eingefügt:
Do
DoEvents
Application.Calculate
Loop While Not Application.CalculationState = xlDone
allerdings ohne großen Erfolg. Die Berechnungen wurden erwartungsgemäß langsamer, die Ergebnisse meistens aber schlechter. Teilweise lief sogar ein einzelnes 'Application.Calculate' schneller und lieferte bessere Ergebnisse.
In welchem Zustand (True oder False) müssen diese und ggf. weitere Variable vor der 'Do'-Schleife sein?
Application
.ScreenUpdating = ???
.Cursor = ???
.DisplayAlerts = ???
.EnableEvents = ???
.DisplayStatusBar = ???
.Calculation = ???
.andere Variable = ???
Bin neugierig auf Eure Ideen. Danke schon mal.
Dieter