VBA Solver каждый раз вставляет результаты

Я искал и искал, и я не могу понять это. Любая помощь очень ценится.

Я использую простой симплексный решатель. Я рассчитываю получить максимальное число $A$4 на основе прогнозов (столбец H) и зарплаты (столбец G). Мои ограничения твердые, но я не могу заставить его зацикливаться, а затем вставить результаты куда-нибудь. Двоичное решение находится в столбце A, всего 6 результатов из 200. У меня есть все эти данные в "Оптимизаторе 1", и я хочу вставить результат каждый раз в "Список", начиная с ячейки A1-A6, затем второй цикл будет A7-A13 и т. д. Я хочу сделать это 20 раз.

Код, который я использую сейчас:

For i = 0 To 20 Step 1
Application.Calculation = xlAutomatic
Calculate
SolverReset
SolverAdd CellRef:="$A$2:$A$201", Relation:=2, FormulaText:="binary"
SolverAdd CellRef:="$X$4", Relation:=2, FormulaText:="$X$6"
SolverAdd CellRef:="$Z$4", Relation:=1, FormulaText:="$Z$6"
SolverAdd CellRef:="$AE$3", Relation:=2, FormulaText:="$AF$3"
SolverAdd CellRef:="$AA$4", Relation:=1, FormulaText:=Worksheets("Optimizer 1").Range("$AA8").Offset(i, 0).Address
SolverOk SetCell:="$AA$4", MaxMinVal:=1, ValueOf:=0, ByChange:="$A$2:$A$201", _
    Engine:=2, EngineDesc:="Simplex LP"
SolverSolve
SolverSolve (True)
SolverFinish KeepFinal:=1

If i = 0 Then
Worksheets("List").Range("A1").Resize(6, 1).Value = _
    Worksheets("Optimizer 1").Range("b2:B201").Value

Else

Worksheets("List").Range("a1").End(xlUp).Offset(6).Resize(200, 1).Value = _
    Worksheets("Optimizer 1").Range("b2:b201").Value
End If
Next i

End Sub

Как только я попал в "Список", у меня есть vlookup, чтобы переместить его на другой лист "Строки", где он дает мне сумму. Первый результат самый оптимальный, а затем я хочу найти второй самый, третий самый и т. Д.

Другой вопрос, который у меня есть, как сделать так, чтобы я (время цикла) основывался на ячейке? Я хочу иметь возможность изменить это, если это возможно.

Надеюсь, кто-то может помочь. Я впервые пробую VBA. Спасибо!

1 ответ

Не уверен, хотите ли вы получить 6 или 200 результатов. В любом случае, вот способ найти последнюю строку в столбце А и начать следующий цикл в следующей пустой строке.

Dim List_Current_row As Long
List_Current_row = Worksheets("List").Cells(Rows.Count, 1).End(xlUp).Row + 1

If i = 0 Then
Worksheets("List").Cells(List_Current_row, 1).Resize(6, 1).Value = _
Worksheets("Optimizer 1").Range("b2:B201").Value

Else

Worksheets("List").Cells(List_Current_row,1).Resize(200, 1).Value = _
Worksheets("Optimizer 1").Range("b2:b201").Value
End If
Next i
Другие вопросы по тегам