Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1912to1916
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

VBA Copy/Paste schneller MC-Simulation

VBA Copy/Paste schneller MC-Simulation
08.01.2023 11:44:06
Oscar
Hallo,
für eine Monte Carlo Simulation habe ich ein kleines VBA programmiert welches mir die Ergebnisse von insgesamt 122 Berechnungsergebissen in eine Tabelle kopiert.
Der Code funktionert auch soweit, dauert nur relativ lange: bei 5.000 Iterationen ca. 15 Minuten und bei 10.000 Iterationen ca. 40 Minuten. (Prozessor: 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz 2.61 GHz; RAM: 32,0 GB).
Ich frage mich, ob es eine Möglichkeit gibt, den Code zu beschleunigen?
Für jegliche Unterstützung, den Code perfromanter zu machen, wäre ich sehr dankbar.
Vielen Dank vorab!
Oscar

Sub MC_Sim()
Dim StartTime As Double
Dim SecondsElapsed As Double
Dim loopNum As Integer
Dim outputRow As Integer
Dim outputColumn As Integer
Dim MyTimer As Double
'Funktionen Aus
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheets("Simulation Output (2)").EnableCalculation = False
Sheets("Grafiken").EnableCalculation = False
'Timer für Simulationszeit
StartTime = Timer
'Szenario auf Monte Carlo Simulation
Sheets("Annahmen").Select
Range("F41").Select
Range("F41").Value = "Monte Carlo Simulation"
'Löschen vorhandener Werte
Sheets("Simulation Output (1)").Select
Range("B7:DS7").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
'Output der Simulationswerte in Schleife
outputRow = 7
outputColumn = 2
For loopNum = 1 To Range("C1")
Range("B6:DS6").Select
Application.CutCopyMode = False
Selection.Copy
Cells(outputRow + (loopNum - 1), outputColumn).Select
'Range("B7").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Simulationszeit in Sekunden
Sheets("Simulation Output (1)").Select
SecondsElapsed = Round(Timer - StartTime, 2)
Range("C2").Value = SecondsElapsed
'Ausgabe Stausbar
Application.StatusBar = "Simulation aktiv... I Fortschritt: " & loopNum & " von " & Range("C1") & " Iterationen (" _
& Format(loopNum / Range("C1"), "0%") & ") I Rechenzeit (Min:Sek): " & Format(SecondsElapsed / 60 / 60 / 24, "nn:ss")
Next loopNum
'Szenario auf Base Case
Sheets("Annahmen").Select
Range("F41").Select
Range("F41").Value = "Base Case"
'Simulationszeit in Sekunden
Sheets("Simulation Output (1)").Select
SecondsElapsed = Round(Timer - StartTime, 2)
Range("C2").Value = SecondsElapsed
'Funktionen An
Application.ScreenUpdating = True
Application.EnableEvents = True
Sheets("Simulation Output (2)").EnableCalculation = True
Sheets("Grafiken").EnableCalculation = True
'Hinweis
MsgBox "Ende der Simulation! Rechenzeit (Min:Sek): " & Format(SecondsElapsed / 60 / 60 / 24, "nn:ss")
'Zurücksetzen der Statusleiste und Löschen des Clipboards
Application.StatusBar = False
Application.CutCopyMode = False
End Sub

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 12:17:01
onur
Ohne die Datei ist der Code wertlos.
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 12:44:33
Oscar
Die Datei ist relativ 11 MB gross, aber letztendlich läuft das Makro in nur einem sheet ab: "Simulation Output (1)"
Wichtig ist der Teil des Codes ab " 'Output der Simulationswerte in Schleife"
Im Loop 1 bis LoopNum werden dort in Zeile 6 die Berechnungsergebnisse (welche dorthin aus anderen Teilen der Datei verlinkt sind) einer jeden Iteration kopiert (Range("B6:DS6")) und dann darunter als Werte wieder eingefügt. Das halt solange bis LoopN erreicht ist.
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 12:46:12
Oscar
Hier noch ein Bild des relevanten Tabellenblattes:
Userbild
Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 13:28:57
ralf_b
versuch mal das. ohne garantie, ungetestet.
die Statusleiste benötigt übrigens auch ne gewisse Zeit. Wenn du das nicht unbedingt das als Mäusekino brauchst. schalte das ab.

'Timer für Simulationszeit
StartTime = Timer
'Szenario auf Monte Carlo Simulation
Sheets("Annahmen").Range("F41").Value = "Monte Carlo Simulation"
'Löschen vorhandener Werte
With Sheets("Simulation Output (1)")
.Select
.Range("B7:DS" & .Range("B7").End(xlDown).Row).ClearContents
End With
'Output der Simulationswerte in Schleife
outputrow = 7
For loopNum = 1 To Range("C1")
Cells(outputrow, 2).Resize(1, 122).Value = Range("B6:DS6").Value
outputrow = outputrow + 1
'Simulationszeit in Sekunden
SecondsElapsed = Round(Timer - StartTime, 2)
Range("C2").Value = SecondsElapsed
'Ausgabe Stausbar
Application.StatusBar = "Simulation aktiv... I Fortschritt: " & loopNum & " von " & Range("C1") & " Iterationen (" _
& Format(loopNum / Range("C1"), "0%") & ") I Rechenzeit (Min:Sek): " & Format(SecondsElapsed / 60 / 60 / 24, "nn:ss")
Next loopNum
'Szenario auf Base Case
Sheets("Annahmen").Range("F41").Value = "Base Case"
'Simulationszeit in Sekunden
SecondsElapsed = Round(Timer - StartTime, 2)
Sheets("Simulation Output (1)").Range("C2").Value = SecondsElapsed
'Funktionen An
Application.ScreenUpdating = True
Application.EnableEvents = True
Sheets("Simulation Output (2)").EnableCalculation = True
Sheets("Grafiken").EnableCalculation = True
'Hinweis

Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 14:39:24
Oscar
Super, Ralf vielen Dank!!! Das hat funktioniert, und die Rechenzeit un ca. die Hälfte verürzt auf jetzt 23 Minuten für 10.000 Iterationen.
Ich habe im Internet gelesen, dass es am schnellsten wäre solche Copy/Paste Operationen einer der Schleife zunächst in einem Array zu speichern, und dann ganz am Ende erst in den definierten Bereich zu kopieren.
Eine Idee, wie/ob man das hier einfach einbauen könnte?
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 15:17:54
ralf_b
ja ,das stimmt, soweit. aber bei deiner Anwendung sehe ich das erstmal so das in der Zeile, die du immer kopieren willst, doch irgend welche Werte aktualisiert werden müssen, oder? Wenn das pro Schleifendurchlauf passiert kann man nur die eine Zeile nehmen und sie in ein Array schreiben und das dann am Ende in ein Blatt übergeben. Den Timer in der Schleife brauchst du doch auch nicht, oder?

Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 15:33:31
Daniel
Hi
Als erstes, lass mal das Schreiben der Laufzeit in die Zelle weg, bzw, mach das erst nach der Schleife, während der Schleife bringt dir das nichts.
Lass auch mal das Schreiben der Statusbar weg und schaue, obs was bringt.
Wenn du die Statusbar behalten willst, dann lies die konstanten Werte, die du aus den Zellen Holst, in Variablen ein und verwende diese statt dem Zellzugriff in der Schleife
Wenn du das ganze im Array ausführen willst, dann so

Dim arr
Dim Erg
Redim Erg(1 to Range("C1").Value, 1 to Range("B6:DS6").Columns.Count)
For loopNum = 1 To Range("C1")
arr = Range("B6:DS6").Value
For S = 1 to ubound(arr, 2)
Erg(loopNum, S) = arr(1, S)
Next
'Ggf muss hier die Neuberechnung der Zellen B6:DS6 ausgelöst werden
Next
Range("B7").Resize(ubound(Erg,1), ubound(Erg, 2)) = erg
Gruß Daniel
Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 18:15:17
Oscar
Hallo Daniel, vielen Dank!
Der Code funktioniert jetzt so, ich habe nur noch ein komisches Problem. Wie du angemerkt hattest muss nach der Schleife eine Neuberechnung für die nächste Iteration durchgeführt werden. Das habe ich mit "Calculate" gemacht. Er rechnet auch alle Iterationen durch, und braucht ca. 13 Minuten für 10.000 Iterationen. Aber wenn ich während der Berechnung einmal Esc drücke rechnet er auf einmal viel schneller und die Iterationen laufen in 3 Minuten durch. Kann es sein, dass der Code noch angepasst werden muss, bzw. dass er so jetzt mehrmals rechnet in jeder Iteration?
Ich habe den Code unten nochmal angehanden.
2 Weitere Fragen:
- Ich habe auch Diagramme in der Datei. Kan man deren Aktualisierung für die Dauer der VBA ausschalten?
- Brauchen die Arrays noch eine Variablendeklaration, z.B. Double?
Danke schonmal vorab für eure Hilfe!!!

Sub MC_Sim()
'Varianblendeklaration
Dim Arr
Dim Outp
Dim i As Integer
Dim StartTime As Double
Dim SecondsElapsed As Double
Dim MyTimer As Double
'Funktionen Aus
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheets("Simulation Output (2)").EnableCalculation = False
Sheets("Grafiken").EnableCalculation = False
'Timer für Simulationszeit
StartTime = Timer
'Szenario auf Monte Carlo Simulation setzen
Sheets("Annahmen").Select
Range("F41").Select
Range("F41").Value = "Monte Carlo Simulation"
'Löschen vorhandener Werte in Outputsheet
Sheets("Simulation Output (1)").Select
Range("B7:DS7").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
'Kopieren und Output der Simulationswerte in Schleife über ein Array als Zwischenpspeicher
ReDim Outp(1 To Range("C1").Value, 1 To Range("B6:DS6").Columns.Count)
For i = 1 To Range("C1")
Arr = Range("B6:DS6").Value
For S = 1 To UBound(Arr, 2)
Outp(i, S) = Arr(1, S)
Next
'Neuberechnung der Planzufallswerte in B6:DS6
Calculate
Next
'Zurückschreiben der Werte aus dem Array in das Tabellenblatt
Range("B7").Resize(UBound(Outp, 1), UBound(Outp, 2)) = Outp
'Simulationszeit in Sekunden
Sheets("Simulation Output (1)").Select
Range("C2").Value = SecondsElapsed
'Szenario zurück auf Base Case
Sheets("Annahmen").Select
Range("F41").Select
Range("F41").Value = "Base Case"
'Funktionen An
Application.ScreenUpdating = True
Application.EnableEvents = True
Sheets("Simulation Output (2)").EnableCalculation = True
Sheets("Grafiken").EnableCalculation = True
End Sub

Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 20:01:39
Oscar
Jetzt bekomme ich bei grössren Iterationen, z.B 8000 folgende Fehlermeldung ganz am Ende des Iterationsdurchlaufes angezeigt:
Userbild
Userbild
Jemand eine Idee woher das kommen könnte?
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 20:21:16
ralf_b
chart-type deutet auf Diagramm hin.
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 20:35:39
Oscar
Ich habe jetz mal alle Diagramme gelöscht bekomme jetzt diese Fehlermedung mit gleichem Fehler wie oben im Code bei debugging:
Userbild
Der Fehler tritt nur bei hohen Iterationszahlen auf 9000 plus z.B.
Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 20:47:42
onur
Poste doch mal die Datei über Dropbox.
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 22:58:04
Oscar
Hallo Onur, leider kann ich die Ganze Datei nicht teilen, da teilweise vertrualiche Informationen enthalten sind, aber das Makro zieht sich eigentlich alle Informationen aus dem Tabellenblatt Simulation Output (1) welches ich oben hochgeladen habe.
AW: VBA Copy/Paste schneller MC-Simulation
08.01.2023 23:02:30
onur
Dann poste irgendwas, was mit dem Makro funkioniert. ICH werde keine Datei zusammenbasteln, nur damit ich für dich dein Makro kostenlos testen und optimieren kann.
Deine geheimen Daten interessieren mich nicht die Bohne, auch wenn ich mir nicht vorstellen kann, was für geheime Daten eine Simulation enthalten könnte.
Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 11:06:57
Oscar
Hallo Onu,
ich habe anbei mal eine vereinfachte Version der Datei angehangen. In der Originaldatei gibt es noch ein vorgeschaltetes Rechenmodell, welches die Berechnungsergebnisse liefert. Auch in dieser Datei tritt das komische Phänomen auf, dass das Drücken von 1x Esc die Berechnungen beschleunigt.
https://www.herber.de/bbs/user/157164.zip
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 11:52:06
onur
Und wie lange braucht diese Datei bei dir für 9000 Durchläufe?
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 12:41:41
Oscar
Hallo Onu,
in der Originaldatei schafft er die 10.00 Iterationen wenn ich einmal Esc drücke in 6 Minuten und ohne Esc dauert es ca. 25 Minuten, manchmal mehr. In beiden Szenarien scheinen die Ergebnisse korrekt (Die Zahlen folgen alle der erwarteten Verteilung.)
Bei grossen über ca. 60000 Iterationen kommt dann einer dieser Runtime Fehlermledung ganz am Ende der letzten Iteration. Beim Debuggen wird immer auf die gelb markierte Zeile verwiesen,
Userbild
Userbild
Userbild
Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 12:54:52
onur
Ich meinte DIESE Datei! Die Originaldatei habe ich ja nicht.
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 13:09:53
Oscar
Ah, sorry, In der Datei unter 20 Sekunden und ohne Fehlermeldung/Runtime Error.
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 13:34:03
onur
Tja, und was soll ich da noch verbessern? Bei mir braucht sie 12 sec. Offenbar taugt deine Beispielsdatei nicht wirklich als Beispiel.
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 13:43:40
onur
Das Problem ist, ich brauche eine Datei, mit der ich unter "realen Bedingungen" arbeiten kann, d.h. die müsste ähnlich lang brauchen wie das Original, sonst bringt das nix. Die muss schon die gleichen Berechnungen machen und deshalb genauso lang brauchen.
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 13:54:37
Oscar
Gibt es eine Möglichkeit dir die Datei per Mail zu senden?
Anzeige
AW: VBA Copy/Paste schneller MC-Simulation
09.01.2023 13:57:52
onur
Schicke an mc22ATmailbox.org.
"AT" natürlich durch "@" ersetzen.

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige