【问题标题】:Excel Solver VBA won't let one cell be bounded by two constraints (min and max)Excel Solver VBA 不会让一个单元格受到两个约束(最小值和最大值)的限制
【发布时间】:2014-07-12 07:30:53
【问题描述】:

我正在尝试解决一个优化问题,其中一个输入变量必须以最小和最大约束为界。因为我最后没有运行 SolverReset,所以我可以告诉之后 Solver 忽略了第三个约束 ($F$5 1 的答案。

当我手动使用 Solver 时,我可以添加第三个约束。我试过录制宏来看看我错过了什么,但我仍然很难过。我正在运行 Excel 2007。有什么想法吗?谢谢,

Public Sub SEDMSolver()

SolverReset
SolverAdd CellRef:="$F$5", Relation:=3, FormulaText:="0.1"
SolverAdd CellRef:="$F$4", Relation:=3, FormulaText:="0"
SolverAdd CellRef:="$F$5", Relation:=1, FormulaText:="1"
SolverOk SetCell:="$G$8", MaxMinVal:=2, ValueOf:="0", ByChange:="$F$4:$F$5"
SolverSolve userFinish:=True

End Sub

【问题讨论】:

  • 尝试改变约束的顺序。这样我们就可以查看是 2+ 约束的问题,还是特定于这个特定的约束
  • 这只是一个让我发疯的错误。只有在 FormulaText 中使用值“1”时我才遇到这个问题。

标签: vba excel excel-2007 solver


【解决方案1】:

求解器可能有点侥幸。尝试将您的 MaxMinVal=2 行设置在第一行之上。当我运行求解器宏时,我总是必须将其设置在约束之上。偶尔会抛出错误。

我试图复制您的问题(使用 excel 2010),但它对我有用。以 MxMinVal 开头和结尾。您可以尝试重新启动您的机器和excel,看看问题是否仍然存在。但是你的代码确实对我有用,所有三个约束都加载了。

我对您的代码的另一个一般建议是添加:

Application.Calculation = xlAutomatic  

这会将计算变为自动。我在运行涉及求解器的更复杂的宏时将其关闭。

【讨论】:

  • 我尝试更改顺序无济于事。当我手动录制宏时,它遵守了约束,但是当我再次尝试运行录制时,约束被忽略了。录制的宏有两次“MaxMinVal”行,将三个约束线括起来。
【解决方案2】:

将某个单元格(例如 H9)设置为 1 并在代码中使用对该单元格的引用。 SolverAdd CellRef:="$F$5", Relation:=1, FormulaText:="$H$9"

【讨论】:

    【解决方案3】:

    根据我使用求解器并尝试使用 VBA 使其自动化的经验,最好的解决方案是不要自动化 Excel 的求解器,而是编写自己的迭代来解决您的目标。 例如

     For j = 1 To 100
     result = someCalculation
            If result > minConstraint Then
               result = j - 1
               Exit For
            Else
            End If
     Next j
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多