【问题标题】:setting solver loop to change cell references, adjacent columns设置求解器循环以更改单元格引用、相邻列
【发布时间】:2017-02-04 10:52:14
【问题描述】:

我正在尝试编写一个用于二次优化的宏。我的 VBA 技能非常有限,但我手动使用求解器并录制了一个宏,我的代码目前如下所示:

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 时,其他所有内容都将保持不变。我想对从 C 到 V 的 20 个相邻列执行此操作。任何帮助将不胜感激!

【问题讨论】:

  • 嗨@orkanoid,有点难以破译你想要做什么,所以当你说:“这样下次单元格引用和目标单元格中​​的 C 列将更改为 D,其他所有内容都将保持不变”您是说您只需要将上面为 B 列工作的代码扩展到 V 列吗?
  • 嗨 @TheSilkCode ,我希望这适用于(包括)C 和 V 之间的所有列。所以下一步是:Sub Macro2() ' ' Macro2 Macro ' ' SolverReset SolverAdd CellRef: ="$D$179:$D$185", Relation:=3, FormulaText:="0" SolverAdd CellRef:="$D$186", Relation:=2, FormulaText:="1" SolverOk SetCell:="$D $174", MaxMinVal:=2, ValueOf:=0, ByChange:="$D$179:$D$185" _ , Engine:=1, EngineDesc:="GRG Nonlinear" SolverSolve UserFinish:=True SolverFinish KeepFinal:=1 End Sub,然后是 E 列,依此类推。感谢您的快速回复!
  • 我看不出您刚刚输入的内容与原始代码有什么不同,但请看一下下面的示例代码,希望您能足够接近目标线,只需稍作调整即可将其推过
  • 我现在就试试你的建议,看看会发生什么,再次感谢!

标签: excel vba loops solver


【解决方案1】:

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

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

希望这会有所帮助, 丝绸代码

【讨论】:

  • 我试过上面的代码,它说“运行时错误'9':下标超出范围”。然后我点击调试,以“Set targetWS”开头的行被标记为黄色。
  • 您是否将Set targetWS = ThisWorkbook.Sheets(1) 中的Sheets(1) 替换为对您的工作表的引用,正如我在此处指出的那样:“'确保将工作表(1)替换为工作表()”
  • 哦,是的!这就像一个魅力!非常感谢@TheSilkCode,当我将工作表名称放在方括号之间时,我最终得到了“运行时错误'9':下标超出范围”。然后我用“ThisWorkbook.Sheets(1)”试了一下。无论如何,我的工作簿中只有一张纸,而且效果很好(在几次 excel 崩溃之后)。你真的帮了我很大的忙,再次感谢!
  • 是的,不要把工作表名称放在括号内,我只是把它们放在那里引起你的注意..
  • 所以我的工作表名称是 Stil。正确的语法应该如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2016-08-20
  • 1970-01-01
相关资源
最近更新 更多