VBA Solver循环运行中断,后续仅显示零值求助
排查VBA Solver循环中S列后输出零值的问题
嘿,作为常年和VBA、Solver打交道的老玩家,我帮你梳理下代码里几个关键问题,这些应该就是导致S列后出现零值的核心原因:
1. 循环变量的非法修改(最致命的逻辑bug)
你在多个循环里直接修改了循环变量(Z = Z - 1、X = X - 1、Y = Y - 1),这会彻底打乱循环的执行节奏:
- 比如外层的
For Z = 2 To DiasProduzir,每次循环先减1再后续加1,实际会导致Z的增长异常,很多目标列根本没被Solver处理,自然输出零值。 - X和Y的循环同理,会导致品牌的Solver执行次数偏离预期,部分生产任务没被分配。
修正方案:删除所有循环内对循环变量的直接修改,改用额外的计数器+Do While循环来控制逻辑,这样能更精准地把控执行条件。
2. 逻辑判断的语法错误
你的If条件里用了&来连接逻辑判断,但&在VBA里是字符串连接符,不是逻辑与And,这会导致条件判断完全失效,Solver的执行逻辑彻底偏离预期:
' 错误写法 If Z <= DiasProduzir & Xt < QtdCIH Then ' 正确写法 If Z <= DiasProduzir And Xt < QtdCIH Then
同样的错误出现在New Holland的判断里,必须全部改成And。
3. 单元格引用的语法错误
代码里有两处明显的语法错误,会导致机器信息赋值失败,进而影响后续的品牌计数(QtdCIH、QtdNH)和Solver的范围:
' 错误写法(多了空格和引号) Sheets("Solver Planter").Cells(5 + QtdProduzir, 35) = Sheets("PO Planter ").Cells(i, 1)" ' 正确写法 Sheets("Solver Planter").Cells(5 + QtdProduzir, 35) = Sheets("PO Planter").Cells(i, 1)
同样的错误出现在AG列的赋值行,必须修正引号和空格问题。
4. 循环边界的范围错误
在New Holland品牌的结果统计循环里,起始行写错了,会导致误判CIH的最后一行数据:
' 错误写法(起始行包含了CIH的最后一行) For i = (5 + QtdCIH) To (6 + QtdCIH + QtdNH) ' 正确写法 For i = (6 + QtdCIH) To (5 + QtdCIH + QtdNH)
修正后的核心代码片段
这里给你修正了循环逻辑和语法错误的核心部分,你可以替换到原代码中测试:
' 修正后的CIH品牌Solver循环 X = 1 Do While X <= ContaCase And Xt < QtdCIH And Z <= DiasProduzir With Worksheets("Solver Planter") .Activate SolverReset SolverOptions AssumeLinear:=True SolverOk SetCell:=.Cells(1, 7 + Z), MaxMinVal:=1, ValueOf:=0, ByChange:=.Range(.Cells(6, 7 + Z), .Cells(5 + QtdCIH, 7 + Z)), _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd cellRef:=.Range(.Cells(6, 7 + Z), .Cells(5 + QtdCIH, 7 + Z)), _ relation:=5 SolverAdd cellRef:=.Range(.Cells(6, 7), .Cells(5 + QtdCIH, 7)), _ relation:=1, _ formulaText:=1 SolverAdd cellRef:=.Range("$H$3:$AD$3"), _ relation:=1, _ formulaText:=.Range("B1") SolverAdd cellRef:=.Range("$H$4:$AD$4"), _ relation:=1, _ formulaText:=.Range("B2") SolverSolve userFinish:=True SolverFinish KeepFinal:=1 For i = 6 To (5 + QtdCIH) If .Cells(i, 7 + Z) = 1 Then X = X + 1 Xt = Xt + 1 End If Next Z = Z + 1 End With Loop ' 修正后的NH品牌Solver循环 Y = 1 Do While Y <= ContaNewHolla And Yt < QtdNH And Z <= DiasProduzir With Worksheets("Solver Planter") .Activate SolverReset SolverOptions AssumeLinear:=True SolverOk SetCell:=.Cells(1, 7 + Z), MaxMinVal:=1, ValueOf:=0, ByChange:=.Range(.Cells(6 + QtdCIH, 7 + Z), .Cells(5 + QtdCIH + QtdNH, 7 + Z)), _ Engine:=1, EngineDesc:="GRG Nonlinear" SolverAdd cellRef:=.Range(.Cells(6 + QtdCIH, 7 + Z), .Cells(5 + QtdCIH + QtdNH, 7 + Z)), _ relation:=5 SolverAdd cellRef:=.Range(.Cells(6 + QtdCIH, 7), .Cells(5 + QtdCIH + QtdNH, 7)), _ relation:=1, _ formulaText:=1 SolverAdd cellRef:=.Range("$H$3:$AD$3"), _ relation:=1, _ formulaText:=.Range("B1") SolverAdd cellRef:=.Range("$H$4:$AD$4"), _ relation:=1, _ formulaText:=.Range("B2") SolverSolve userFinish:=True SolverFinish KeepFinal:=1 For i = (6 + QtdCIH) To (5 + QtdCIH + QtdNH) If .Cells(i, 7 + Z) = 1 Then Y = Y + 1 Yt = Yt + 1 End If Next Z = Z + 1 End With Loop
另外建议你在调试时,添加一些Debug.Print语句输出关键变量(比如Z、Xt、Yt)的值,这样能更直观地看到循环执行是否符合预期。
内容的提问来源于stack exchange,提问作者Alison Carone da Silva
相关产品推荐
相关产品推荐

