使用求解器写入值

时间:2016-08-30 17:21:21

标签: excel-vba excel-formula solver vba excel

我对VBA不是很有经验但我对它有基本的了解。我正在尝试创建一个优化模型,其中Solver为一组约束生成最小值:

-Cell O40需要最小化,并且该值记录并打印在单元格Kx中 -Cell O41是我的动态约束,需要将其设置为等于求解器每次迭代的单元格Jx中的值。 -Cells J40:J45是将要改变的权重,受约束J46 = 1(其中J46 = SUM(J40:J45),使得权重加起来为1)

我运行了一次Solver并录制了一个宏并获得了以下输出:

Sub Solve()

SolverAdd CellRef:="$J$46", Relation:=2, FormulaText:="1"
SolverAdd CellRef:="$O$41", Relation:=2, FormulaText:="$J17"
SolverOk SetCell:="$O$40", MaxMinVal:=2, ValueOf:=0, ByChange:="$J$40:$J$45", _
    Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve

End Sub

现在我需要Solver做两件事:

  1. 将在单元格O40中求解的值写入例程结束时的单元格Kx,其中单元格Kx对应于确定单元格O41的固定值约束的相邻单元格Jx。

  2. 对范围J17:J33重复此过程,更改单元格O41中的固定值约束。

  3. 结果应该是单元格J17:J33中单元格K17:K33中的值被填充并最小化给定级别。

    我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我认为进行递归的最佳方法是执行While循环,如下所示:

Dim a as Variant 
a = 17

While a <= 33  
  'Solver functionality in here   
   a = a + 1 
Wend

这将涵盖问题的第一部分。下一个问题是保持求解器引用不变。在这种情况下,我会在J17:J33中将您的值放在一个单独的位置,并在需要时将值移动到相关的单元格中。这意味着在每个解决方案之后,您都会将建议的答案复制到另一个位置,并为下一个求解器尝试引入新信息。