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禁用每次迭代后弹出的对话框的主要内容,如果未能解决你的问题,请参考以下文章

VBA 自动关闭 弹出的对话框 + VBA错误捕捉

如何实现:编写vba 弹出文件对话框,并打开选中文件?

求急:我想做一个AJAX的按钮提交,单击按钮后弹出对话框:正在提交,按钮变成灰色,

用js怎么实现弹出个选择文件的对话框?

android中怎么用接收到广播后弹出对话框

★在asp中,点击按钮后弹出对话框,怎么做?★