2016-11-18 3 views
1

Я пытаюсь использовать решатель в Excel VBA для установки ячейки путем изменения 3 других ячеек. Тем не менее, три ячейки не меняются на значения, которые я выбираю (я поставил решателя добавить для каждого colomn, чтобы быть больше и меньше, чем определенное значение), похоже, что решатель не может прочитать то, что я ему дал ,Установить ячейку в решателе VBA, изменив более чем одну ячейку?

Мне нужно знать, как заставить его прочитать три константы и внести изменения, основанные на них.

Sub solver() 

For i = 5 To 48 
    SolverReset 
    objstring = "$I$" & i 

    SolverOk SetCell:=Range(objstring), MaxMinVal:=2, ValueOf:=0, ByChange:=Range("C5:E7") 
    SolverAdd CellRef:="$C$5:$C$48", Relation:=1, FormulaText:=934000 
    SolverAdd CellRef:="$C$5:$C$48", Relation:=3, FormulaText:=953000 
    SolverAdd CellRef:=Range("$D$" & i), Relation:=1, FormulaText:="$B$13" 
    SolverAdd CellRef:=Range("$D$" & i), Relation:=3, FormulaText:="$B$14" 
    SolverAdd CellRef:=Range("$E$" & i), Relation:=1, FormulaText:="$B$15" 
    SolverAdd CellRef:=Range("$E$" & i), Relation:=3, FormulaText:="$B$16" 

    SolverSolve userfinish:=True 

Next i 

End Sub 

[1]: https://i.stack.imgur.com/dS7x3.jpg

+0

Является ли это проблемой VBA или проблемой решателя? Другими словами, можете ли вы заставить решателя делать то, что хотите, но не можете воспроизвести его в VBA, или вы просто не можете заставить решателя работать так, как вы этого хотите? Также - ваш вопрос говорит об изменении 3-х ячеек, но ваш код задает 9 сменных ячеек. –

ответ

0

Я думаю, что ваш набор до есть и другие проблемы, но это трудно сказать, не видя строки/столбцы в экранном колпачке, или зная формулу - специально для колонки I.

Однако для этой проблемы вы обрисовать:

  • Хотя не обязательно, это проще не использовать диапазоны для SetCell и CellRef. Используйте строки.
  • В инструкции SolverOK вы должны явно указать Engine.
  • В заявлении SolverOKMaxMinVal:=2 является спецификацией для сведения к минимуму. Поэтому ValueOf игнорируется и может быть опущен.
  • Это предположение. Вы говорите: «Я пытаюсь ... установить ячейку, изменив 3 других ячейки», но ваш код меняет 9 ячеек. В SolverOK, где у вас есть ByChange:="C5:E7", я подозреваю, что вы хотите ByChange:="C5:E5", и что вы хотите, чтобы строка увеличивалась с помощью счетчика i.
  • Еще одна догадка, вероятно, вы хотите ограничить $C$5 аналогичным образом, что вы ограничили $D$5 и $E$5.
  • Другое предположение - ячейка $B$13 содержит значение 5000, которое является вашим минимальным значением для Pi. Ячейка $B$14 содержит значение 8000, которое является вашим максимальным значением. В SolverAdd, Relation:=1 эквивалентно «меньше или равно» или «< =». Relation:=3 эквивалентно значению "> =". Вы хотите быть «< =« ваше максимальное значение и «> =» ваше минимальное значение ... у вас есть ограничения, указанные в обратном порядке.

Все, как показано ниже ...

Sub solver() 

For i = 5 To 48 
    SolverReset 

    SolverOk SetCell:="$I$" & i, MaxMinVal:=2, ByChange:="$C$" & i & ":$E$" & i, Engine:=1 
    SolverAdd CellRef:="$C$" & i, Relation:=1, FormulaText:="$B$18" 
    SolverAdd CellRef:="$C$" & i, Relation:=3, FormulaText:="$B$17" 
    SolverAdd CellRef:="$D$" & i, Relation:=1, FormulaText:="$B$14" 
    SolverAdd CellRef:="$D$" & i, Relation:=3, FormulaText:="$B$13" 
    SolverAdd CellRef:="$E$" & i, Relation:=1, FormulaText:="$B$16" 
    SolverAdd CellRef:="$E$" & i, Relation:=3, FormulaText:="$B$15" 

    SolverSolve userfinish:=True 

Next i 

End Sub 

Другие потенциальные проблемы ...

  • SolverReset можете оставить свой Excel в ручном состоянии расчета, если SolverSolve не запуская.
  • Я бы предположил, что ваш расчет ошибок - это столбец I, но результаты, которые вы проиллюстрируете, не имеют никакого смысла (например, qttemp - q (t)?). Значение, которое вы минимизируете, должно быть ABS (ошибка) или ошибка^2 - поскольку вы не указали формулу, я не могу сказать, что у вас есть.
Смежные вопросы