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

时间:2016-11-02 17:29:15

标签: excel vba excel-vba solver excel-2016

首先,我尝试过研究我遇到的问题,但我找到的解决方案(例如,here,对我来说没有用)。我正在尝试编写一个宏,它使用(通常)直接求解函数来求解值。

我需要的代码如下:

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.

我尝试过:

  • 一些在线指导说ValueOf需要是一个字符串 - 我尝试了对Range("D57")Cells(57,"D").Value的CStr方法,并且都提出了Solver错误。
  • 当我手动尝试打开Solver时,它总是以逗号而不是句号打开,所以我使用一个小脚本用句号替换所有逗号,但这并没有改变任何东西(仅在尝试时我正在处理一个字符串ValueOf。[我不确定为什么会发生这种情况,但我认为在我使用美国大陆航空和英国时存在某种文化冲突键盘和本地化设置相当随机。]
  • 在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
    
  • 如果需要,我现在拥有的值可能会被舍入 - 因为当我通过我的书面宏时,似乎小数仍然使用逗号而不是句号。我尝试舍入值并将其放在那里,但同样的错误出现了。

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

任何人都可以强调我做错了吗?

如果重要,请使用Excel 2016.

1 个答案:

答案 0 :(得分:1)

看起来好像你没有激活公式存在的工作表,因此Solve正在对当前活动工作表中的任何工作进行处理。

我建议您将代码更改为:

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将确保在运行解算器时选择了正确的工作表。 (因为我讨厌使用ActivateSelectSelection等,这是需要的时间之一 - 解算器只能在活动工作表上使用。)< / p>

如果您包含Application.ScreenUpdating = False声明,那么在您第二次运行解算​​器之后,请重新评论有关值未更新的评论,除了相当明显的问题之外,我无法想到任何其他原因&# 34;您是否也包含了Application.ScreenUpdating = True声明?&#34;。

我尝试仅使用=False运行它并且运行SolverAEP导致在宏结束后更新屏幕。

但是,如果我写了另外一个子程序,如下所示:

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

并运行它,然后(仅使用=False且没有相应的=True)屏幕在达到End Sub的{​​{1}}之前不会更新。这是停止Sub Test的预期行为。