首先,我尝试过研究我遇到的问题,但我找到的解决方案(例如,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.
我尝试过:
Range("D57")
和Cells(57,"D").Value
的CStr方法,并且都提出了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.
答案 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
将确保在运行解算器时选择了正确的工作表。 (因为我讨厌使用Activate
,Select
,Selection
等,这是需要的时间之一 - 解算器只能在活动工作表上使用。)< / 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
的预期行为。