我对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做两件事:
将在单元格O40中求解的值写入例程结束时的单元格Kx,其中单元格Kx对应于确定单元格O41的固定值约束的相邻单元格Jx。
对范围J17:J33重复此过程,更改单元格O41中的固定值约束。
结果应该是单元格J17:J33中单元格K17:K33中的值被填充并最小化给定级别。
我感谢任何帮助。
答案 0 :(得分:0)
我认为进行递归的最佳方法是执行While循环,如下所示:
Dim a as Variant
a = 17
While a <= 33
'Solver functionality in here
a = a + 1
Wend
这将涵盖问题的第一部分。下一个问题是保持求解器引用不变。在这种情况下,我会在J17:J33中将您的值放在一个单独的位置,并在需要时将值移动到相关的单元格中。这意味着在每个解决方案之后,您都会将建议的答案复制到另一个位置,并为下一个求解器尝试引入新信息。