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

Dynamische Do Loop Schleife mit Solver

Dynamische Do Loop Schleife mit Solver
15.05.2020 14:21:53
Marc
Hallo zusammen,
ich bin gerade dabei eine Do Loop Schleife zu dynamisieren. Kurze Erklärung dazu:
Die Schleife soll in Spalte I ab Reihe O + i schauen, ob sich ein Wert in den Zellen befindet. Befindet sich ein Wert in einer Zelle, soll in dieser Reihe der Wert in Spalte AW mittels Solver minimiert werden. Dabei darf der Solver die Gewichte verändern (Spalten AP, AR und AT). Nebenbedingungen sind, dass die Werte in den Spalten AQ, AS und AU gleich groß sein sollen (also jeweils 1/3) Die Summe aus den drei Werten muss somit 1 ergeben (Spalte AV). Die Schleife soll so lange durchgeführt werden, bis in Spalte A keine Werte mehr in den Zellen stehen.
Der Code läuft ganz durch, bringt aber folgende Fehlermeldung:
„Fehler im Modell: Überprüfen Sie, ob alle Zellen und Nebenbedingungen gültig sind. Vielleicht sind einige Zellen, die keine Variablenzellen darstellen, als „Integer“, „Binary“ oder „AllDifferent“ markiert.“
Schreibe ich den Code für eine einzelne Zelle um funktioniert er. Somit dürften die Nebenbedingungen kein Problem sein. Die einzigen Variablen, die ich als Integer markiert habe sind O und i. Diese stellen die Reihenzahl da, welche nur ganzzahlig sein können. Deshalb glaube ich, dass dies eigentlich auch nicht das Problem ist.
Die Beispieltabelle soll nur einmal zeigen, wie die eigentlichen Tabellen aufgebaut sind. Der _
Code soll für mehrere Mappen angewendet werden, weshalb ich diesen gerne dynamisch hätte.
Sub DoLoop1_1_Erweitert() Dim i As Integer Dim O As Integer i = i + 1 O = Cells(6, 13) Do If Cells(O + i, 9) = "" Then i = i + 1 ElseIf Cells(O + i, 9) 0 Then SolverReset SolverOk SetCell:="$AW$ O + i", MaxMinVal:=2, ValueOf:=0, ByChange:= _ "$AP$ O + i,$AR$ O + i,$AT$ O + i", Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$AQ$ O + i", Relation:=2, FormulaText:="$AS$ O + i" SolverAdd CellRef:="$AQ$ O + i", Relation:=2, FormulaText:="$AU$ O + i" SolverAdd CellRef:="$AS$ O + i", Relation:=2, FormulaText:="$AU$ O + i" SolverAdd CellRef:="$AV$ O + i", Relation:=2, FormulaText:="1" SolverOk SetCell:="$AW$ O + i", MaxMinVal:=2, ValueOf:=0, ByChange:= _ "$AP$ O + i,$AR$ O + i,$AT$ O + i", Engine:=1, EngineDesc:="GRG Nonlinear" SolverOk SetCell:="$AW$ O + i", MaxMinVal:=2, ValueOf:=0, ByChange:= _ "$AP$ O + i,$AR$ O + i,$AT$ O + i", Engine:=1, EngineDesc:="GRG Nonlinear" SolverSolve 'userfinish:=True i = i + 1 End If Loop While Cells(O + i, 1) "" End Sub
Link zur Beispielmappe: https:\/\/www.herber.de/bbs/user/137431.xlsx
Hat jemand von euch eine Idee, was ich falsch gemacht habe oder ändern könnte?
Vielen Dank schon einmal für eure Hilfe! :)

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Bessere Darstellung des Codes
15.05.2020 14:29:24
Marc
Hier nochmal der VBA Code in einer besseren Darstellung
Sub DoLoop1_1_Erweitert()
Dim i As Integer
Dim O As Integer
i = i + 1
O = Cells(6, 13)
Do
If Cells(O + i, 9) = "" Then
i = i + 1
ElseIf Cells(O + i, 9)  0 Then
SolverReset
SolverOk SetCell:="$AW$ O + i", MaxMinVal:=2, ValueOf:=0, ByChange:= _
"$AP$ O + i,$AR$ O + i,$AT$ O + i", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:="$AQ$ O + i", Relation:=2, FormulaText:="$AS$ O + i"
SolverAdd CellRef:="$AQ$ O + i", Relation:=2, FormulaText:="$AU$ O + i"
SolverAdd CellRef:="$AS$ O + i", Relation:=2, FormulaText:="$AU$ O + i"
SolverAdd CellRef:="$AV$ O + i", Relation:=2, FormulaText:="1"
SolverOk SetCell:="$AW$ O + i", MaxMinVal:=2, ValueOf:=0, ByChange:= _
"$AP$ O + i,$AR$ O + i,$AT$ O + i", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$AW$ O + i", MaxMinVal:=2, ValueOf:=0, ByChange:= _
"$AP$ O + i,$AR$ O + i,$AT$ O + i", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve 'userfinish:=True
i = i + 1
End If
Loop While Cells(O + i, 1)  ""
End Sub

Anzeige
AW: Bessere Darstellung des Codes
15.05.2020 17:21:04
onur
Ich habe dir doch schon beim letzten Mal geschrieben, was alles falsch ist (z.B. Relation=2).
AW: Bessere Darstellung des Codes
15.05.2020 17:26:16
Marc
Die ausgewählten Spalten waren beim letzten Mal falsch. Dies habe ich in diesem Beitrag korrigiert.
Für eine einzelne Zelle fünktioniert der Code auch richtig. Nur als Schleife bekomme ich eine Fehlermeldung.
AW: Bessere Darstellung des Codes
15.05.2020 17:32:48
onur

Loop While Cells(O + i, 1)  ""

bedeutet nun mal nichts anderes als:
Springe sofort aus der Schleife, sobald Cells(O + i, 1) das erste Mal gleich "" ist.
AW: Bessere Darstellung des Codes
15.05.2020 17:42:16
Marc
Das war auch meine Idee dahinter: Die Schleife soll aufhören, sobald keine Werte mehr in der Spalte A stehen. Führe ich den Code aus, dann kommen zwei Fehlermeldungen vom Solver, danach hört die Schleife auf. Zumindest sieht es für mich deswegen so aus, als wäre die Schleife nicht das Problem - oder liege ich da falsch? :)
Anzeige
AW: Bessere Darstellung des Codes
15.05.2020 17:57:40
onur
Wir lösen ein Problem nach dem Anderen.
Soll der Code WIRKLICH aufhören, sobald Cells(O + i, 1) das ERSTE Mal gleich "" ist ?
AW: Bessere Darstellung des Codes
15.05.2020 18:04:36
Marc
Ok sehr gut!
Ja genau, die Schleife fängt in Reihe 18 an und soll so lange laufen, bis kein Datum mehr drin steht :)
Im Fall der Beispieltabelle ist also in Reihe 58 Schluss.
AW: Bessere Darstellung des Codes
15.05.2020 18:08:28
onur
So.
Ich gehe mal davon aus, dass du mit dem Solver manuell (auf Excel-Ebene - ohne VBA) klar kommst.
Dann schalte mal den Makrorecorder ein und lass Solver eine Zeile genauso lösen, wie du es gerne für alle Zeilen lösen würdest.
Dann schalte den Makrorecorder wieder aus und poste mir den erzeugten Code.
Anzeige
AW: Bessere Darstellung des Codes
15.05.2020 18:13:49
Marc
Ja sehr gerne. So sieht es aus, wenn man mit dem Solver eine einzelne Zelle minimiert:
SolverOk SetCell:="$AW$5297", MaxMinVal:=2, ValueOf:=0, ByChange:= _
"$AP$5297,$AR$5297,$AT$5297", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:="$AQ$5297", Relation:=2, FormulaText:="$AS$5297"
SolverAdd CellRef:="$AQ$5297", Relation:=2, FormulaText:="$AU$5297"
SolverAdd CellRef:="$AS$5297", Relation:=2, FormulaText:="$AU$5297"
SolverAdd CellRef:="$AV$5297", Relation:=2, FormulaText:="1"
SolverOk SetCell:="$AW$5297", MaxMinVal:=2, ValueOf:=0, ByChange:= _
"$AP$5297,$AR$5297,$AT$5297", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$AW$5297", MaxMinVal:=2, ValueOf:=0, ByChange:= _
"$AP$5297,$AR$5297,$AT$5297", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
Anzeige
AW: Bessere Darstellung des Codes
15.05.2020 18:26:38
onur
Und das ist genau das, was der Recorder aufgezeichnet hat?
Und es kam bei Excel/Solver ein richtiges Ergebnis heraus?
AW: Bessere Darstellung des Codes
15.05.2020 18:31:07
Marc
Ja es ist 1:1 das - Habe mich auch gewundert etwas gewundert...
Und ja es kam das richtige Ergebnis raus!
AW: Bessere Darstellung des Codes
15.05.2020 18:40:04
Marc
Der Solver liefert auch das richtige Ergebnis wenn man nur folgenden Code laufen lässt:
SolverOk SetCell:="$AW$5297", MaxMinVal:=2, ValueOf:=0, ByChange:= _
"$AP$5297,$AR$5297,$AT$5297", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:="$AQ$5297", Relation:=2, FormulaText:="$AS$5297"
SolverAdd CellRef:="$AQ$5297", Relation:=2, FormulaText:="$AU$5297"
SolverAdd CellRef:="$AS$5297", Relation:=2, FormulaText:="$AU$5297"
SolverAdd CellRef:="$AV$5297", Relation:=2, FormulaText:="1"
SolverSolve
Aber wie gesagt, der Makrorecorder liefert den "langen" Code!
Anzeige
AW: Dynamische Do Loop Schleife mit Solver
15.05.2020 19:12:34
onur
"Nebenbedingungen sind, dass die Werte in den Spalten AQ, AS und AU gleich groß sein sollen (also jeweils 1/3) Die Summe aus den drei Werten muss somit 1 ergeben (Spalte AV)" - Verstehe ich nicht. Wenn diese 3 in der Summe 1 ergeben und gleich gross sein müssen, dann ist das doch FIX und keine Bedingung.
Warum ist das eine Bedingung? Du brauchst doch nur je 0,333333 in die Zellen einzutragen.
AW: Dynamische Do Loop Schleife mit Solver
15.05.2020 19:30:59
Marc
Die Werte in den Spalten AQ, AS und AU sollen alle gleich groß sein - Also nicht absolut 1/3. Sorry, das habe ich blöd geschrieben!
Ergebnis der Reihe sieht dann so aus:
AP: Gewicht1 = 5,8954%
AQ: Risikobeitrag1 = 0,0018%
AR: Gewicht2 = 82,3197%
AS: Risikobeitrag2 = 0,0018%
AT: Gewicht3 = 11,7849%
AU: Risikobeitrag3 = 0,0018%
AV: Summe aus AP + AR + AT = 100%
Sprich die Gewichte sollen vom Solver so gestaltet werden, dass die Risikobeiträge alle gleich groß sind. Und die Gewichte Zusammen 100% ergeben.
Anzeige

218 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige