Excel Solver VBA не позволит одной ячейке быть ограниченной двумя ограничениями (минимум и максимум)

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

Когда я использую Solver вручную, я могу добавить третье ограничение. Я пытался записать макрос, чтобы увидеть, что мне не хватает, но я все еще в тупике. Я использую 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

person user1080253    schedule 28.12.2011    source источник
comment
Попробуйте изменить порядок ограничений. Таким образом, мы можем увидеть, является ли это проблемой с 2+ ограничениями или это связано с этим конкретным ограничением.   -  person hnk    schedule 12.07.2014
comment
Это просто ошибка, которая тоже свела меня с ума. У меня была эта проблема только при использовании значения 1 в FormulaText.   -  person JFS    schedule 15.01.2015


Ответы (3)


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

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

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

Application.Calculation = xlAutomatic  

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

person David__    schedule 28.12.2011
comment
Я пытался изменить порядок безрезультатно. Когда я записал макрос вручную, он соблюдал ограничение, но затем, когда я снова попытался запустить запись, ограничение было проигнорировано. В записанном макросе дважды была строка MaxMinVal, заключающая в скобки три линии ограничения. - person user1080253; 29.12.2011

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

person Jonhtra    schedule 11.07.2014

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

 For j = 1 To 100
 result = someCalculation
        If result > minConstraint Then
           result = j - 1
           Exit For
        Else
        End If
 Next j
person GMT    schedule 11.07.2014