VBA求解约束未设置错误(没有指定约束)

首先,我试图研究我所遇到的问题,但是我find的解决scheme(例如, 这里没有为我工作)。 我正在尝试编写一个macros,它使用(通常)解决一个值的简单Solverfunction。

我得到的代码如下:

Sub SolverAEP() Dim GeneratedPower As Double GeneratedPower = Worksheets("AEP").Range("D57") SolverReset SolverOk SetCell:="$D$58", _ MaxMinVal:=3, _ ValueOf:=GeneratedPower, _ ByChange:="$D$65" _ , Engine:=1, EngineDesc:="GRG Nonlinear" SolverSolve userFinish:=False End Sub 

目前的错误是Solver could not find a feasible solution. Sovler can not find a point for which all Constraints are satisified. Solver could not find a feasible solution. Sovler can not find a point for which all Constraints are satisified.

我曾经尝试过:

  • 一些在线指南说,ValueOf需要是一个string – 我试着CSTR的方法来Range("D57")Cells(57,"D").Value和两个想出了一个求解错误。
  • 当我手动尝试打开Solver时,它总是打开一个逗号而不是一个句号,所以我用一个小脚本来replace所有逗号,但没有改变任何东西(只有当我正在处理用一个string作为ValueOf [我不确定为什么会发生这种情况,但是我认为这是一种文化冲突,因为我同时使用了Continental和UK键盘,而且本地化设置非常随意。]
  • 在Solver中手动loggingmacros的操作,给我下面的Solver代码:

     Sub Macro2() SolverOk SetCell:="$D$58", MaxMinVal:=3, ValueOf:=21000#, ByChange:="$D$65" _ , Engine:=1, EngineDesc:="GRG Nonlinear" SolverOk SetCell:="$D$58", MaxMinVal:=3, ValueOf:=21000#, ByChange:="$D$65" _ , Engine:=1, EngineDesc:="GRG Nonlinear" SolverSolve End Sub 
  • 如果有必要的话,我现在所拥有的价值可能会被四舍五入 – 正如我在通过我的书面macros观时所看到的那样,小数点仍然使用逗号而不是句号。 我尝试着将价值四舍五入,然后把它放在那里,但同样的错误出现了。

最后,我要补充一点,用Solver手动解决这个问题是没有问题的。 被引用的单元格D58是其他单元格的总和,其值取决于D65的值。

任何人都可以突出显示我做错了吗?

万一它很重要,我使用Excel 2016。

它看起来好像没有激活公式所在的工作表,因此Solve正在执行任何当前活动工作表的过程。

我build议将您的代码更改为:

 Sub SolverAEP() With Worksheets("AEP") .Activate SolverReset SolverOk SetCell:="$D$58", _ MaxMinVal:=3, _ ValueOf:=[$D$57], _ ByChange:="$D$65", _ Engine:=1, _ EngineDesc:="GRG Nonlinear" SolverSolve userFinish:=False End With End Sub 

Activate将确保运行求解器时select正确的工作表。 (就像我讨厌使用ActivateSelectSelection等等,这是其中一个需要的时间 – 解算器将只在活动工作表上工作。)


如果你有一个包含Application.ScreenUpdating = False语句,再次运行Solver之后,你可以关于值的说明不被更新,除了相当明显的问题:“你是否包含了一个Application.ScreenUpdating = True语句呢?“

我试着运行它只是=False和运行SolverAEP导致屏幕更新,一旦macros结束。

但是,如果我写了另一个子例程如下:

 Sub Test SolverAEP MsgBox "Finished first solve" SolverAEP MsgBox "Finished second solve" End Sub 

并运行它,然后(只有一个=False和没有相应的=True )屏幕不会更新,直到达到Sub TestEnd Sub 。 这是停止ScreenUpdating的预期行为。