Excel Solver VBA не позволяет одной ячейке ограничиваться двумя ограничениями (мин и макс) - PullRequest
3 голосов
/ 29 декабря 2011

Я пытаюсь решить задачу оптимизации, когда одна из входных переменных должна быть ограничена минимальным и максимальным ограничением.Поскольку я не запускаю SolverReset в конце, я могу потом сказать, что Solver игнорирует третье ограничение ($ F $ 5 <= 1).Я также могу сказать, потому что иногда он дает мне ответ, где $ F $ 5> 1.

Когда я использую Солвер вручную, я могу добавить третье ограничение.Я попытался записать макрос, чтобы увидеть, что мне не хватает, но я все еще в тупике.Я использую Excel 2007. Есть идеи?Спасибо,

Public Sub SEDMSolver()

SolverReset
SolverAdd CellRef:="$F$5", Relation:=3, FormulaText:="0.1"
SolverAdd CellRef:="$F$4", Relation:=3, FormulaText:="0"
SolverAdd CellRef:="$F$5", Relation:=1, FormulaText:="1"
SolverOk SetCell:="$G$8", MaxMinVal:=2, ValueOf:="0", ByChange:="$F$4:$F$5"
SolverSolve userFinish:=True

End Sub

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

Решатель может быть немного случайным. Попробуйте установить строку MaxMinVal = 2 над первой. Когда я запускаю решающие макросы, я всегда должен устанавливать это выше ограничений. Иногда он выдаст ошибки.

Я пытался повторить вашу проблему (используя Excel 2010), но она работает для меня. С MxMinVal в начале и в конце. Вы можете попробовать перезагрузить компьютер и проверить, не исчезла ли проблема. Но твой код работает на меня, загружаются все три ограничения.

Еще одно общее предложение, которое я хотел бы добавить к вашему коду:

Application.Calculation = xlAutomatic  

Это переведет расчеты в автоматический режим. Я отключил его при запуске более сложных макросов с участием решателя.

0 голосов
/ 12 июля 2014

Исходя из моего опыта использования solver и попыток его автоматизации с помощью VBA, лучшее решение - не автоматизировать приложение Excel, а написать собственную итерацию для решения задачи. например

 For j = 1 To 100
 result = someCalculation
        If result > minConstraint Then
           result = j - 1
           Exit For
        Else
        End If
 Next j
0 голосов
/ 12 июля 2014

Установите для некоторой ячейки (например, H9) значение 1 и используйте ссылку на эту ячейку в коде.SolverAdd CellRef: = "$ F $ 5", отношение: = 1, FormulaText: = "$ H $ 9"

...