You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:42:19