如何用VBA循环缩短单元格引用代码?含非线性求解器代码修正
修正VBA非线性求解器的循环代码问题
我来帮你搞定这两段循环代码的问题,先从纵向单元格引用的修正说起:
一、纵向单元格引用的循环修正
你原来的循环代码核心问题是字符串拼接错误——直接把5+4*i写在引号里,VBA会把它当成纯文本,而不是计算后的单元格地址。另外ByChange的地址拼接也犯了同样的错误。
修正后的完整代码如下:
Sub solver_macro_vertical() Dim i As Integer Dim PERIOD As Integer PERIOD = 7 ' 5+4*7=33,对应最后一个约束单元格F33 ' 初始化Solver基础设置 SolverOk SetCell:="$H$1", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$2:$E$33", _ Engine:=1, EngineDesc:="GRG Nonlinear" ' 循环添加约束条件 For i = 0 To PERIOD ' 用&连接字符串和计算后的行号,动态生成单元格地址 SolverAdd CellRef:="$F$" & (5 + 4 * i), Relation:=2, FormulaText:="$G$" & (5 + 4 * i) Next i ' 注意:重复的SolverOk其实是冗余的,初始设置一次就足够,保留的话要修正地址 SolverOk SetCell:="$H$1", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$2:$E$" & (5 + 4 * PERIOD), _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverOk SetCell:="$H$1", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$2:$E$" & (5 + 4 * PERIOD), _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverSolve End Sub
几个关键修正点:
- 用
"$F$" & (5 + 4 * i)动态生成F列的目标行号,循环i从0到7,正好对应5、9、13…33这些行 ByChange的末尾行号也用同样的拼接方式,确保引用的单元格范围正确- 额外提醒:重复的
SolverOk完全可以删除,初始的设置已经生效,留着反而多余
二、横向列字母的循环实现
对于横向排列的约束(G、K、O这类间隔4列的情况),我们可以通过循环列号来实现,再用VBA自带的方法把列号转换成对应的列字母,这样就不用手动处理AA、AB这类多字母列的麻烦了。
示例代码如下:
Sub solver_macro_horizontal() Dim col As Integer Dim startCol As Integer Dim endCol As Integer startCol = 7 ' G列对应的列号 endCol = 27 ' AA列对应的列号(每次加4:7→11→15→19→23→27) ' 初始化Solver设置(请根据你的实际需求调整目标单元格和可变区域) SolverOk SetCell:="$H$1", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$2:$E$33", _ Engine:=1, EngineDesc:="GRG Nonlinear" ' 循环添加约束:列号从startCol到endCol,步长设为4 For col = startCol To endCol Step 4 ' 自动获取当前列88行和89行的绝对引用地址 Dim cellRefAddr As String Dim formulaTextAddr As String cellRefAddr = Cells(88, col).Address ' 生成$G$88、$K$88这类地址 formulaTextAddr = Cells(89, col).Address ' 生成$G$89、$K$89这类地址 SolverAdd CellRef:=cellRefAddr, Relation:=2, FormulaText:=formulaTextAddr Next col SolverSolve End Sub
说明:
- 列号循环的步长设为4,正好匹配G→K→O→S→W→AA的间隔
Cells(行号, 列号).Address会自动返回带$的绝对引用地址,不用手动拼接列字母,非常省心- 如果需要相对引用,只需改成
Cells(88, col).Address(False, False)即可去掉$符号,灵活适配你的需求
内容的提问来源于stack exchange,提问作者Übel Yildmar
相关产品推荐
相关产品推荐

