Makro wird sehr langsam (mit Code)
11.01.2017 16:22:41
Max
ich habe folgendes Problem: Habe mir für den OpenSolver einen Optimierungsalgorithmus geladen, der ein definiertes Problem zeitlich dynamisch lösen soll. Konkret geht es um ein System aus Stromerzeugung, Bezug und Speicher, das kostenoptimal betrieben werden soll. Dafür liegt eine Strompreiszeitreihe vor.
Für dieses Problem soll für jeden Tag eines Jahres nacheinander für 300 Akteure mit unterschiedlichen Strombedarfen, Erzeugungsvariablen etc. die kostenoptimale Lösung ermittelt werden (365 Tage *300 Akteure) und einige Ergebniszahlen festgehalten werden.
Bei der Ausführung des folgenden Makros wird der Arbeitsspeicher mit der Zeit voll und das _
Makro wird unfassbar langsam. Anfangs benötigt das Makro noch ca. 2 Sekunden pro Tag --> ca. 12 _
Minuten/Akteur; das wäre noch in Ordnung, jedoch nimmt die Bearbeitungszeit schnell zu bis auf _
10 Sekunden pro Tag. Gibt es eine Möglichkeit, den folgenden Code umzuschreiben, sodass alles, _
was die Bearbeitung des Makros verlangsamt, umgangen wird`?
Private Sub CommandButton1_Click()
Set wks = Worksheets
Dim spalte_ka As Long
Dim z As Long
Dim i As Long
Application.Calculation = xlCalculationManual
Application.CutCopyMode = False
spalte_ka = 2
For spalte_ka = 2 To 318 'While wks("Lastgaenge_KA-Liste_DE").Cells(1, spalte_ka) "" And _
spalte_ka ""
'Aufsetzen Zielfunktion und Entscheidungsvariablen
OpenSolver.ResetModel
OpenSolver.SetObjectiveFunctionCell Range("Q" & z + 23)
OpenSolver.SetObjectiveSense (MinimiseObjective)
OpenSolver.SetDecisionVariables Range(Cells(z, 13), Cells(z + 23, 16))
'Nichtnegativitätsbedingungen
OpenSolver.AddConstraint Range("M" & z, "P" & z + 23), RelationGE, , 0
'Leistung BHKW nicht größer als Nennleistung
OpenSolver.AddConstraint Range("N" & z, "N" & z + 23), RelationLE, Range("I6")
'Gasspeicher nicht über Kapazität
OpenSolver.AddConstraint Range("M" & z, "M" & z + 23), RelationLE, Range("I2")
OpenSolver.AddConstraint Range("O" & z, "O" & z + 23), RelationLE, Range("I2")
'Gasmenge, die verstromt wird, nicht größer als die
Application.CutCopyMode = False
t = 1
For t = 1 To 24
'Strombedarf = Netzbezug + BHKW-Leistung
OpenSolver.AddConstraint Range("K" & z), RelationEQ, , Range("N" & z).Address & "+" & Range("P" _
_
_
_
_
_
_
_
_
_
_
& z).Address
' Speicherfüllstand am Ende
OpenSolver.AddConstraint Range("O" & z), RelationEQ, , Range("M" & z).Address & "+" & Range("L" _
_
_
_
_
_
_
_
_
_
_
& z).Address & "-" & Range("N" & z).Address
z = z + 1
Next t
Application.CutCopyMode = False
'Speicherfüllstand Übergabe
t = 1
If z = 26 Then
z = z - 23
Else
z = z - 24
End If
For t = 1 To 24
OpenSolver.AddConstraint Range("M" & z), RelationEQ, , Range("O" & z - 1).Address
z = z + 1
Next t
Application.CutCopyMode = False
Cells(9, 9) = (z - 2) / 24
OpenSolver.RunOpenSolver
If z
Die Submakros des OpenSolver kann ich hier aufgrund der Größe nicht veröffentlichen, sie sind zudem nicht von mir geschrieben. Da die anfängliche Bearbeitung jedoch schnell geht, hoffe ich, dass der Fehler nicht in diesen Funktionen, sondern in der Gestaltung der Rechenabfolge, die die sequenzielle BEarbeitung der einzelnen Tage und Akteure beinhaltet, liegt.
Ich hoffe auf Eure Hilfe, beste Grüße
Max