VBA解算器禁用每次迭代后弹出的对话框

时间:2014-09-02 10:09:22

标签: excel-vba excel-2007 solver vba excel

我在VBA循环中使用Excel 2007中的内置解算器来解决许多不同的问题。有时,解算器会达到最大时间,这会导致出现一个弹出对话框,询问用户是想要继续,停止还是结束。在所有情况下,我希望它结束​​,并继续循环的下一行。这将阻止用户每次都坐在那里并做出回应。

我使用求解器通过方法(Catch max time/iteration dialog box when using Excel Solver in VBA)运行了一个宏,然后它给了我另一个对话框说"你输入的公式包含错误"

我也试过http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx。 这是一个不那么复杂的版本'求解器通过方法'但是在每次迭代之后,它给我的信息和#34相同;你输入的公式包含一个错误" 这是我的代码

Sub Optimize()
'
' OptimizeShortfall Macro
'

'
Set MyFirstObj = Range("I124")
Set MyFirstRange = Range("H600:H698")
Dim i As Integer
For i = 0 To 1
    MyObj = MyFirstObj.Offset(0, i).Address
    MyTestRange = MyFirstRange.Offset(0, i).Address
    SolverReset
    SolverOk SetCell:=MyObj, MaxMinVal:=1, ValueOf:="0", ByChange:= _
        MyTestRange
    SolverAdd CellRef:=MyTestRange, Relation:=1, FormulaText:="100%"
    SolverOptions MaxTime:=20, Iterations:=100, Precision:=0.000001, AssumeLinear _
        :=False, StepThru:=False, Estimates:=1, Derivatives:=1, SearchOption:=1, _
        IntTolerance:=5, Scaling:=False, Convergence:=0.0001, AssumeNonNeg:=True
     SolverSolve UserFinish:=True, ShowRef:="SolverIteration"
    Next i
End Sub

Function SolverIteration(Reason As Integer)
    MsgBox Reason
    SolverIteration = 1
End Function

1 个答案:

答案 0 :(得分:2)

http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx,如果您在循环中运行求解器,会在出现对话框时明确说明,含义以及如何避免它。

在达到最大时间/迭代次数的情况下进入下一个循环的一个强制解决方案是在整个宏的持续时间内按住Alt + T按钮。

另一种更聪明的方法是在SolverSolve函数中使用ShowRef参数。 ShowRef所做的不是弹出一个对话框,而是运行作为参数给出的宏,在本例中为“SolverIteration”。如果希望求解器继续给定迭代,请将SolverIteration设置为0.如果要停止给定迭代的求解器并移至下一个迭代,请将SolverIteration设置为1.

请注意,ShowRef Argument在消化具有很长名称和/或名称空间的工作簿时存在一些问题,因此请尽可能缩短工作簿的名称。

很抱歉,如果我的解释不够充分。以下是我需要解决问题的三个链接的详尽列表: http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx

Catch max time/iteration dialog box when using Excel Solver in VBA

http://www.excelforum.com/excel-programming-vba-macros/555406-solved-solver-solversolve-showref.html

P.S。在上面问题中提到的代码中,只需从函数“SolverIteration”中删除“MsgBox Reason”行。(它只会导致另一个对话框弹出一个值为Integer的值:P)