Установка значения сходимости в переменную для встроенного решателя

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

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

SolverReset
SolverOk SetCell:="$D$14", MaxMinVal:=2, ValueOf:=0, ByChange:="$F$2:$F$5", _
    Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:="$F$2", Relation:=1, FormulaText:="100"
SolverAdd CellRef:="$F$2", Relation:=3, FormulaText:="0.0000000001"
SolverAdd CellRef:="$F$3", Relation:=1, FormulaText:="100"
SolverAdd CellRef:="$F$3", Relation:=3, FormulaText:="-100"
SolverAdd CellRef:="$F$4", Relation:=1, FormulaText:="100"
SolverAdd CellRef:="$F$4", Relation:=3, FormulaText:="-100"
SolverAdd CellRef:="$F$5", Relation:=1, FormulaText:="10"
SolverAdd CellRef:="$F$5", Relation:=3, FormulaText:="0.0000000001"
SolverOptions MaxTime:=0, Iterations:=0, Precision:=1E-18, Convergence:= _
    1E-16, StepThru:=False, Scaling:=True, AssumeNonNeg:=True, Derivatives:= _
    1
SolverSolve True

Этот код просто изменяет значения в ячейках F2, F3, F4 и F5 (в пределах, которые я предоставляю), пытаясь минимизировать значение, которое у меня есть в D14.

В идеале я хотел бы иметь возможность вставить что-то вроде Convergence CellRef:="$B$16", но, похоже, это не работает. Кто-нибудь знает, как это сделать? Кажется, что это должно быть просто, но я придумываю пробел.


person TheTreeMan    schedule 18.06.2014    source источник
comment
Вы пробовали что-то вроде Convergence:= CDbl(range("B16").value2)?   -  person Ioannis    schedule 18.06.2014
comment
Оно работает! Можете ли вы опубликовать это как ответ, чтобы я мог отметить вас как правильного?   -  person TheTreeMan    schedule 18.06.2014


Ответы (1)


Convergence, а также все остальные SolverOptions можно задать с помощью значений ячеек, например Convergence:= Range("A1").value.

Value2 немного быстрее, чем Value, и хорошей практикой является явное приведение, чтобы удвоить значение ячейки (а также отловить любые ошибки).

Другой способ — добавить значения как именованные диапазоны или как имена. Этот вопрос более подробно описывает эти методы. Преимущество имен в том, что они не должны отображаться непосредственно в электронной таблице, что очень элегантно. Например, пользователь может устанавливать и редактировать их из пользовательской формы.

Надеюсь, это поможет!

person Ioannis    schedule 18.06.2014