问题描述
因此,我有50个变量,它们具有最小值和最大值。
我想将这些设置为约束。
50个变量位于A1到A50单元格中
最大约束在B1到B50中,最小值在C1到C50中。
我可以命名A1:A50 A,B1:B50 B和C1:C50 C,然后按如下所示设置约束:
SolverAdd cellRef:="A",relation:=1,formulaText:="B"
和
SolverAdd cellRef:="A",relation:=3,formulaText:="C"
而不是100行:
SolverAdd cellRef:=range("A1)",formulaText:=Range("B1")
SolverAdd cellRef:=Range("A1"),formulaText:=Range("C1")
...
SolverAdd cellRef:=range("A25)",formulaText:=Range("B25")
SolverAdd cellRef:=Range("A25"),formulaText:=Range("C25")
...
以此类推?
解决方法
您可以使用命名范围,实际上,这是提高可读性的一个好主意。 "A","B","C"
本身不是有效的名称,但是类似"A_"
的东西(尽管在模型中有意义的东西,例如"Purchase"
可能更好)。要使用命名范围,请使用以下语法(与您建议的语法类似):
SolverAdd CellRef:=Range("A_"),Relation:=1,FormulaText:="B_"
SolverAdd CellRef:=Range("A_"),Relation:=3,FormulaText:="C_"
应该可以正常工作。
这是一个完整的示例:A_
是A1:A50
,B_
的{{1}}和B1:B50
的{{1}}的名称。我使用C_
作为目标函数,它只是C1:C50
的总和。我将A51
初始化为全部A_
,将A_
初始化为全部0
,将B_
初始化为全部10
。然后我运行以下代码:
C_
运行代码后,1
包含了所有Sub Test()
SolverOk SetCell:="$A$51",MaxMinVal:=1,ByChange:="A_",Engine:=2
SolverAdd CellRef:=Range("A_"),FormulaText:="B_"
SolverAdd CellRef:=Range("A_"),FormulaText:="C_"
SolverSolve True
End Sub
,符合预期。