[英]VBA Loop in Excel with Solver
所以这是我的问题。 我正在尝试编写一个使用求解器执行功能的循环。 基本上,它从一个单元格开始,运行求解器,将目标单元格和约束单元格移至右侧,求解,将目标单元格和约束单元格移至右侧14个,求解,右侧一个,求解,右侧14个求解,直到找到一个空白。
这是前几行代码,向您展示我在长版中的工作。
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)
预先感谢您的任何帮助/建议。
未经测试,但也许像...
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”。
第一部分看起来与其他部分不同,因此我没有将其包括在“循环”中,但是如果差异是由于错字引起的,那么添加起来就很容易了。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.