在VBA中使用Solver将计算模式设置为手动

时间:2016-04-17 23:02:35

标签: excel excel-vba vba

在尝试帮助解决this question时,我在VBA中遇到了Solver的一些非常奇怪的行为。

我想知道是否有其他人可以重现或者我的系统出现问题(Windows 10,Excel 2016),如果有人能指出我发生了什么

工作簿设置非常简单。

enter image description here

以下是我正在测试的代码......

Sub mySolve()
    Dim SetRng As Range, ChangeRng As Range
    Dim i As Long
    For i = 2 To 4
        Set SetRng = Sheets("Sheet1").Cells(i, 5)
        Set ChangeRng = Sheets("Sheet1").Cells(i, 4)

        SolverReset
        SolverOk SetCell:=SetRng.Address, MaxMinVal:=3, _
            ValueOf:=1, ByChange:=ChangeRng.Address, _
            Engine:=1, EngineDesc:="GRG NONLINEAR"
        SolverSolve UserFinish:=True
        SolverFinish KeepFinal:=1

    Next i
End Sub

我使用F8逐步执行此代码,并在执行每一行后手动检查Options中的计算模式。

  1. 在SolverSolve之后,计算模式是手动的,除非我这样做,否则不会被设置。
  2. 如果我删除对SolverReset的调用,则在调用SolverSolve后,计算模式不会更改为手动。

1 个答案:

答案 0 :(得分:5)

我刚刚在Excel 2010中运行了您的代码并获得了相同的结果。如果有的话,更糟糕的是,无论是否调用sorted(hosts, key=getSpeed)我都会得到错误,而且,在运行代码之后,文本“设置问题...”会在Excel底部的状态栏中徘徊

完全合理的是,求解器需要将计算设置为手动SolverReset,因为它将通过更改工作表中的单元格来评估目标函数,并且在正确输入之前不想评估它们价值到位。从Excel界面调用时,Solver会自行清理。放在一起VBA界面的人一定忘记了这个小细节。这显然是一个错误。也许你可以在Solver.com(前线系统的网站,为微软的解决方案)提交错误报告。解决方法当然很简单:只需放线

GRG Nonlinear

在潜艇的底部。