VBA Solver 禁用每次迭代后弹出的对话框

问题描述 投票:0回答:2

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

我使用求解器传递方法运行了一个宏(在 VBA 中使用 Excel Solver 时捕获最大时间/迭代对话框),但随后它给了我另一个对话框,显示“您键入的公式包含错误”

我也尝试过http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx。 这是“求解器传递方法”的不太复杂的版本,但每次迭代后它都会给我提供与“您输入的公式包含错误”相同的消息 这是我的代码

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
excel excel-2007 solver vba
2个回答
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 参数在消化名称很长和/或名称中包含空格的工作簿时存在一些问题,因此将工作簿的名称设置得尽可能短。

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

在 VBA 中使用 Excel Solver 时捕获最大时间/迭代对话框

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

附注在上述问题中提到的我的代码中,只需从函数“SolverIteration”中删除行“MsgBox Reason”即可。(它只会导致弹出另一个对话框,其中包含一个整数值 Reason :P)


0
投票

非常好,使用函数 ShowRef 作为参数,效果非常好 谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.