2014-09-02 47 views
3

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

我跑与求解宏直通法(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 
+0

' ShowRef'参数是可选的。你可以忽略它,在这种情况下,循环将运行到下一个求解器问题。 “您键入的公式包含错误”消息意味着其他的错误,可能在模型设置中。 – Ioannis 2014-09-03 15:40:09

+0

如果我省略ShowRef参数,我会看到对话框显示“达到最大时间限制,是否要停止/继续”。为了避免这种情况,我使用ShowRef调用宏'SolverIteration',但它给了我一个味精说:“你输入的公式包含错误”。 – 2014-09-03 17:40:36

+0

你能报告哪一行给出错误?你还可以检查所有的公式是否输入没有任何拼写错误?有时候,诸如在公式中使用分号而不是逗号,或嵌套的许多级别等问题都会导致出现此类错误。 – Ioannis 2014-09-03 19:05:13

回答

2

http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx,将当出现一个对话框时,清楚地向你解释,它的含义以及如何在循环中运行求解器时避免它。

One force在达到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)