VBA Solver禁用每次迭代后弹出的对话框
Posted
技术标签:
【中文标题】VBA Solver禁用每次迭代后弹出的对话框【英文标题】:VBA Solver disabling the dialog box that pops after each iteration 【发布时间】:2014-09-02 10:09:21 【问题描述】:我在 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 。 这是“求解器通过方法”的一个不太复杂的版本,但在每次迭代后,它给我的消息与“您键入的公式包含错误”相同 这是我的代码
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
【问题讨论】:
ShowRef
参数是可选的。您可以省略它,在这种情况下,循环将运行到下一个求解器问题。消息The formula you typed contains an error
暗示有其他问题,可能在模型设置中。
如果我省略 ShowRef 参数,我会看到对话框说“达到最大时间限制,你想停止/继续”。为避免这种情况,我使用 ShowRef 调用宏“SolverIteration”,但随后它给了我一条消息“您键入的公式包含错误”。
你能报告哪一行给出了错误吗?您还可以检查所有公式是否输入没有任何拼写错误?有时,例如公式中使用分号而不是逗号,或多层嵌套等问题可能会导致此类错误。
我明白了。从理论上讲,您的代码应该可以工作,但是您收到的错误消息很难调试,因为它可能意味着任何事情。 This post 的症状完全相同,但真正的问题完全不同。您的代码中有任何事件吗?如果事件触发并尝试更改求解器单元格,那么这可能是一个问题..
@loannis: 非常感谢老兄!!!!你给我的链接解决了这个问题。我的工作簿名称中有空格,大约有 20 个字符长。我把它改成单个字母,现在宏可以工作了!非常感谢大佬!!!这已经耽误了我很多天的工作!
【参考方案1】:
http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx,会在出现对话框时向您清楚说明,如果您在循环中运行求解器,它的含义以及如何避免它。
在达到 Max Time/Iterations 的情况下进入下一个循环的一个强制解决方案是在整个宏的持续时间内按住 Alt+T 按钮。
另一种更明智的方法是在 SolverSolve 函数中使用 ShowRef 参数。 ShowRef 所做的不是弹出一个对话框,而是运行作为参数提供给它的宏,在本例中为“SolverIteration”。如果您希望求解器继续给定迭代,请将 SolverIteration 设置为 0。如果您想停止给定迭代的求解器并移动到下一个迭代,请将 SolverIteration 设置为 1。
请注意 ShowRef 参数在消化名称很长的工作簿和/或名称中包含空格的工作簿时存在一些问题,因此请将工作簿的名称设置为尽可能短。
抱歉,如果我的解释对您来说不够充分。这是我解决问题所需的三个链接的详尽列表: 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
附:在上面问题中提到的我的代码中,只需从函数“SolverIteration”中删除“MsgBox Reason”行。(它只会导致另一个对话框弹出一个整数值原因:P)
【讨论】:
以上是关于VBA Solver禁用每次迭代后弹出的对话框的主要内容,如果未能解决你的问题,请参考以下文章