Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1952to1956
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Schnelles Makro vs. langsame Tabelle

Schnelles Makro vs. langsame Tabelle
17.11.2023 22:24:20
Dieter Krüsemann
Moin,

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

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schnelles Makro vs. langsame Tabelle
17.11.2023 23:20:26
Yal
Hallo Dieter,

was Du beschreibst, hier sich wie einen Fall für den Solver. Schon probiert?

VG
Yal
AW: Schnelles Makro vs. langsame Tabelle
19.11.2023 19:42:55
onur
Teste das:
    Do

DoEvents
Loop Until Application.CalculationState = xlPending
AW: Schnelles Makro vs. langsame Tabelle
19.11.2023 21:21:33
Dieter Krüsemann
Moin Yal und onur,

habe das 'Application.Calculate' vor 'Do' ... 'Loop' gesetzt und sowohl xlDone als auch mit xlPending getestet.
Das Erste brachte eine Verbesserung um etwa 1% des erwarteten Wertes. xlDone macht im Ergebnis keinen
Unterschied zu xlPending. Das ist nur das erste Ergebnis mit einem von 26 Datensätzen.

Eine Anmerkung zur wahrscheinlichen Nicht-Modalität von Application.Calculate: Für meine Anwendung soll
der code tatsächlich nicht weiterlaufen, bis die angestoßene Berechnung abgeschlossen ist. Das sollte aber
durch 'Do' ... 'Loop' gewährleistet sein.

Dann noch etwas zu Struktur meiner "Datenbank". Die Datensätze sind einzelne Excel-Dateien (je 700 ... 750 KB),
deren Inhalte in die Arbeitsmappe geladen werden, während der Optimierungsalgorithmus nicht läuft.
Die Optimierung selbst wird mit einem Button in der Arbeitsmappe gestartet, und sie liefert während des Laufs
in definierten Abständen Zwischenwerte zur Information an aktive Arbeitsblatt.

Danke für die bisherigen Infos.
Dieter
Anzeige
AW: Schnelles Makro vs. langsame Tabelle
19.11.2023 21:27:15
onur
Erwarte nichts weiteres von mir, da, ohne die Datei zu haben (und zu wissen, was genau sie berechnen soll), alles Weitere nur Herumraterei wäre.
AW: Schnelles Makro vs. langsame Tabelle
20.11.2023 09:52:17
Yal
Hallo Dieter,

wie Onur es zurecht anmerkt, wird es schwer werden, bessere Hilfe anzubitten. Das wesentlich ist schon überreicht worden.
Ich gehe davon aus, dass aufgrund der sensiblen Daten, nur eine sehr abgespeckte Datei zur Verfügung gestellt werden kann, sodass die Problem darin wahrscheinlich nicht mehr auftretten wird.

Aus meiner Erfahrung muss man annehmen, dass Excel auch seine Grenze hat. Es ist natürlich ideal, weil die Blätter-Spalten-Zeilen eine Struktur liefert, die das Programmierung erleichtert. Aber manchmal muss man "aussteigen". Dann bietet sich Python und die darin enthaltene Dataframes (Bib. "Pandas") eine sehr leistungsstarke Werkzeug zu Nullkosten (ausser Einarbeitung, was aber einen Invest darstellt, der schnell sein Return findet).

Was auch denkbar wäre, ist das gesamte Modell mit Power Query abzubilden.

VG
Yal
Anzeige
AW: Schnelles Makro vs. langsame Tabelle
18.11.2023 14:20:53
Dieter Krüsemann
Moin Yal,

danke für Deine Antwort.

Habe mir verschiedene Solver und auch das entsprechende Excel addin angesehen. Sie passen nicht zu der sehr kleinteiligen Datenstruktur meines Modells, und eine Anpassung der Struktur an die Solver ist nicht möglich, ohne die Flexibilität des Modells erheblich einzuschränken.

Kann das seltsame Verhalten meines Modells davon abhängen, dass während des Durchlaufs des Algorithmus wegen der Größe des Modells Daten temporär ausgelagert werden und 'Application.CalculationState = xlDone' nicht den tatsächlichen Zustand wiedergibt?

Beobachtung dazu: eine Vergrößerung des Modells um passive Daten, die während des Algorithmus weder geschrieben noch gelesen werden, ändert tatsächlich das Ergebnis des Modells. Vermutung: wegen der Vergrößerung werden zusätzliche Datenmengen ausgelagert.

Hast Du eine Idee, wie ich z.B. die beschriebene 'Do' ... 'Loop' Schleife ändern könnte, um das Problem zu lösen?

Beste Grüße
Dieter
Anzeige
AW: Schnelles Makro vs. langsame Tabelle
18.11.2023 14:50:02
GerdL
Hallo Dieter!

Lade doch mal eine Besipieldatei hoch.

Gruß Gerd
AW: Schnelles Makro vs. langsame Tabelle
19.11.2023 19:28:04
Yal
Hallo Dieter,

+1 für eine Beispieldatei.

Ich hatte mal das Problem mit einer Datenbank (Applix Tm1, inzwischen IBM COgnos Tm1), die Ihre Daten über Excelformel abzieht. Die Verkettung der Formel führte datzu, dass zuerst Excel berechnet werden müsste, dann die Datenbankformel, dann nochmal Excelberechnung, um den neuen Stand der Datenbankformel wahrzunehmen. Aber ich gehe nicht davon aus, dass bei Dir ein ähnlichen Problem vorliegt, es sei denn einige Abfragen in Form von Power Query verwendet wären. Diese sind gern asynchron.

Aber gerade entdecke ich in deinem Code:
Do

DoEvents
Application.Calculate
Loop While Not Application.CalculationState = xlDone

Du solltest nicht innerhalb der Schleife den Berechnungsvorgang nochmal anstossen. Zwar gehe ich davon aus, dass Excel es blockiert, aber es kann nur stören.
Besser wäre:
Application.Calculate

Do
DoEvents
Loop While Not Application.CalculationState = xlDone

wobei Application.Calculate wahrscheinlich modal ist: während es nicht abgeschlossen ist, läuft der Code nicht weiter.

VG
Yal
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige