Excel 设置解算器循环以更改单元格引用、相邻列

Excel 设置解算器循环以更改单元格引用、相邻列,excel,vba,loops,solver,Excel,Vba,Loops,Solver,我正试图为二次优化写一个宏。我的VBA技能非常有限,但我手动使用了solver并录制了一个宏,我的代码目前如下所示: Sub Macro2() ' ' Macro2 Macro ' ' SolverReset SolverAdd CellRef:="$C$179:$C$185", Relation:=3, FormulaText:="0" SolverAdd CellRef:="$C$186", Relation:=2, FormulaText:="1" Sol

我正试图为二次优化写一个宏。我的VBA技能非常有限,但我手动使用了solver并录制了一个宏,我的代码目前如下所示:

Sub Macro2()
'
' Macro2 Macro
'

'
    SolverReset
    SolverAdd CellRef:="$C$179:$C$185", Relation:=3, FormulaText:="0"
    SolverAdd CellRef:="$C$186", Relation:=2, FormulaText:="1"
    SolverOk SetCell:="$C$174", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$179:$C$185" _
    , Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverSolve UserFinish:=True
    SolverFinish KeepFinal:=1

End Sub

我试图做的是做一个解算器循环,这样下次单元格中的C列引用和目标单元格将更改为D时,其他所有内容都将保持不变。我想这样做的20个相邻的列,从C到V。任何帮助将不胜感激

如果我在上面的评论中所做的假设是正确的,那么下面的代码将满足您的要求-但是我无法测试所有这些,因为我没有用于解算器函数的代码。。。见下文:

Public Sub sampleCode()
Dim targetWS As Worksheet
Dim colCounter As Long
Dim colAddress As String
Dim colLetter As String

Set targetWS = ThisWorkbook.Sheets(1)   'Make sure to replace sheet(1) with sheet(<your sheet name>)
For colCounter = 3 To 22    'Loop through columns C through V
    'Get the column letter you want to run solver on
    colAddress = Replace(targetWS.Range("A1")(1, colCounter).address, "$", "")
    colLetter = Left(colAddress, InStr(1, colAddress, "1") - 1)
    SolverReset
    'Run solver but with the references being set by using colLetter
    SolverAdd CellRef:=colLetter & "179:" & colLetter & "185", Relation:=3, FormulaText:="0"
    SolverAdd CellRef:=colLetter & "186", Relation:=2, FormulaText:="1"
    SolverOk SetCell:=colLetter & "174", MaxMinVal:=2, ValueOf:=0, ByChange:=colLetter & "179:" & colLetter & "185", Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverSolve UserFinish:=True
    SolverFinish KeepFinal:=1
Next
End Sub
公共子样本代码()
将目标设置为工作表
暗冷计数器一样长
Dim colAddress作为字符串
像线一样暗的夹头
设置targetWS=ThisWorkbook.Sheets(1)'确保将工作表(1)替换为工作表()
对于colCounter=3至22’,通过C列至V列循环
'获取要在其上运行解算器的列字母
colAddress=Replace(targetWS.Range(“A1”)(1,colCounter.address,“$”,”)
colLetter=左(colAddress,InStr(1,colAddress,“1”)-1)
解算集
'运行解算器,但使用colLetter设置引用
SolverAdd CellRef:=colLetter&“179:&colLetter&“185”,关系:=3,公式文本:=“0”
SolverAdd CellRef:=colLetter&“186”,关系:=2,公式文本:=“1”
SolverOk SetCell:=colLetter&“174”,MaxMinVal:=2,ValueOf:=0,ByChange:=colLetter&“179:&colLetter&“185”,Engine:=1,EngineDesc:“GRG非线性”
SolverSolve UserFinish:=真
SolverFinish KeepFinal:=1
下一个
端接头
希望这有帮助,
silkcode

Hi@orkanoid,在破译您要做的事情时有点困难-当您说:“这样下次单元格引用中的C列和目标单元格将更改为D时,其他所有内容都将保持不变”您是说您只需要将上面针对B列的代码扩展到V列吗?您好@TheSilkCode,我希望这适用于C和V之间(包括C和V)的所有列。因此,下一步将是:Sub Macro2()“”Macro2 Macro“”SolverSet SolverRadd CellRef:=“$D$179:$D$185”,关系:=3,公式文本:=“0”SolverAdd CellRef:=“$D$186”,Relation:=2,FormulaText:=“1”SolverRok SetCell:=“$D$174”,MaxMinVal:=2,ValueOf:=0,ByChange:=“$D$179:$D$185”\u,Engine:=1,EngineDesc:=“GRG非线性”SolverSolverSolver UserFinish:=真正的SolverFinish:=1结束子列,然后是E列,依此类推。谢谢你的快速回复!我看不出你刚才输入的代码与你原来的代码有什么不同,但是看看下面的示例代码,希望能让你离目标线足够近,你可以用很少的调整就把它推过去。我现在就试试你的建议,看看会发生什么,再次感谢!我尝试了上面的代码,它说“运行时错误'9':下标超出范围”。然后我点击debug,以“Set targetWS”开头的行被标记为黄色。您是否替换了
Set targetWS=ThisWorkbook中的
sheet(1)
。Sheets(1)
引用了您的工作表,如我在此处所述:“‘确保用sheet()替换工作表(1)’哦,是的!这很有魅力!非常感谢@TheSilkCode,当我将工作表名称放在括号之间时,我得到了“运行时错误'9':下标超出范围”。然后我用“ThisWorkbook.Sheets(1)”试了一下。无论如何,我的工作簿中只有一张工作表,它工作得很好(在一些excel崩溃之后)。你真的帮了我大忙,再次感谢你!是的,不要把床单的名字放在括号里,我只是把它们放在那里引起你的注意。所以我的床单的名字是Stil。正确的语法应该是什么?