Excel中的VBA循环与求解器

所以这是我的问题。 我正在尝试编写一个使用求解器执行函数的循环。 基本上它从一个单元开始,运行求解器,将目标和约束单元向右移动,解决,向右移动目标和约束单元格14,解决,右边一个,解决,右边14解决,直到它find一个空白。

这是前几行代码,告诉你我在长版本中做什么。

Range("RI6").Select SolverOk SetCell:="$RI$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RG$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$RI$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$RI$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("RJ16").Select SolverOk SetCell:="$RJ$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RJ$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$RJ$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$RJ$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("RX16").Select SolverOk SetCell:="$RX$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RX$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$RX$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$RX$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("RY16").Select SolverOk SetCell:="$RY$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RY$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$RY$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$RY$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("SM16").Select SolverOk SetCell:="$SM$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$SM$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$SM$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$SM$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("SN16").Select SolverOk SetCell:="$SN$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$SN$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$SN$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$SN$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("TB16").Select SolverOk SetCell:="$TB$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TB$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$TB$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$TB$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("TC16").Select SolverOk SetCell:="$TC$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TC$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$TC$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$TC$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("TQ16").Select SolverOk SetCell:="$TQ$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TQ$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$TQ$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$TQ$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("TR16").Select SolverOk SetCell:="$TR$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TR$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$TR$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$TR$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("UF16").Select SolverOk SetCell:="$UF$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$UF$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$UF$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$UF$1", Relation:=1, FormulaText:="87" SolverSolve (True) Range("UG16").Select SolverOk SetCell:="$UG$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$UG$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$UG$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$UG$1", Relation:=1, FormulaText:="87" SolverSolve (True) 

提前感谢您的任何帮助/build议。

未经testing,但可能类似…

 Option Explicit Sub SolverLop() Dim i As Long Dim cnt As Integer cnt = 0 For i = 477 To ActiveSheet.UsedRange.Columns.Count SolverReset SolverOk SetCell:=Cells(16, i).Address, MaxMinVal:=3, ValueOf:=0.15, ByChange:=Cells(16, i).Address, _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:=Cells(1, i).Address, Relation:=3, FormulaText:="74" SolverAdd CellRef:=Cells(1, i).Address, Relation:=1, FormulaText:="87" SolverSolve Userfinish:=True cnt = cnt + 1 If cnt = 2 Then i = i + 14 cnt = 0 End If Next End Sub 

确保你有工具 – >参考 – >求解器签入解算器的参考。

在上面的例子中,PS 477是与起始列“RJ”相关联的列号。要获得任何列的列号,只需在空白单元格=column(indirect("A2"))键入以下内容。将“A2”replace为您想要查找编号的列。

第一部分和其他部分看起来不一样,所以我没有将它包含在“循环”中,但是如果差异是由于拼写错误,那么添加就会很容易。

  Range("RI6").Select SolverOk SetCell:="$RI$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RG$1", _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:="$RI$1", Relation:=3, FormulaText:="74" SolverAdd CellRef:="$RI$1", Relation:=1, FormulaText:="87" SolverSolve (True) 

所以循环的一种方法如下:

  Dim Temp As String, TempArray As Variant TempArray = Array("RJ16", "RX16", "RY16", "SM16", "SN16", "TB16", "TC16", "TQ16", "TR16", "UF16", "UG16") For i = 0 To UBound(TempArray) Range(TempArray(i)).select Temp = Cells(1, Range(TempArray(i)).Column).Address SolverOk SetCell:=TempArray(i), MaxMinVal:=3, ValueOf:=0.15, ByChange:=Temp, Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd CellRef:=Temp, Relation:=3, FormulaText:="74" SolverAdd CellRef:=Temp, Relation:=1, FormulaText:="87" SolverSolve (True) Next i