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

VBA自动化报表IF语句无法忽略空值与SCRAP值问题排查

解决VBA代码无法忽略空值和"SCRAP"组件的问题

你的代码核心问题出在第二个If语句的逻辑判断上,错误使用Or导致无法正确排除空值和"SCRAP"条目:当单元格是空值时,它满足<> "SCRAP",会执行提取;当单元格是"SCRAP"时,满足<> "",同样会被提取。正确逻辑应该是同时不满足空值和"SCRAP",需要把Or替换成And。

此外,还可以优化代码结构,避免重复引用工作表、添加除以零防护(防止G列值为0时触发运行时错误),以下是修正并优化后的完整代码:

Dim wsAlarms As Worksheet, wsBOMs As Worksheet
Dim l As Long, i As Long, j As Long
Dim alarmPart As String

' 定义工作表变量,简化引用并提升运行效率
Set wsAlarms = alarm.Worksheets("Alarms")
Set wsBOMs = alarm.Worksheets("BOMs")

l = 2 ' 假设Alarms表数据从第2行开始
Do While l <= wsAlarms.Cells.CurrentRegion.Rows.Count
    i = 2
    j = 2
    alarmPart = wsAlarms.Range("A" & l).Text
    
    ' 在BOMs表中定位匹配的部件
    Do While i <= wsBOMs.Cells.CurrentRegion.Rows.Count And wsBOMs.Range("A" & i).Text <> alarmPart
        i = i + 1
    Loop
    
    ' 遍历当前部件的所有BOM条目
    Do While i <= wsBOMs.Cells.CurrentRegion.Rows.Count And wsBOMs.Range("A" & i).Text = alarmPart
        ' 先判断分母是否为0,避免除以零错误
        If wsBOMs.Range("G" & i).Value <> 0 Then
            If (wsBOMs.Range("K" & i).Value / wsBOMs.Range("G" & i).Value) < 20 Then
                ' 修正逻辑:同时排除空值和"SCRAP"
                If wsBOMs.Range("D" & i).Text <> "SCRAP" And wsBOMs.Range("D" & i).Text <> "" Then
                    wsAlarms.Cells(l, j) = wsBOMs.Cells(i, 4).Text
                    j = j + 1
                End If
            End If
        End If
        i = i + 1
    Loop
    l = l + 1
Loop

关键修改说明

  1. 逻辑修正:将Or替换为And,确保仅当D列单元格既不是"SCRAP"也不是空值时,才执行提取操作。
  2. 除以零防护:在计算库存比例前判断G列值是否为0,避免触发运行时错误。
  3. 简化引用:用wsAlarms和wsBOMs变量替代重复的工作表调用,提升代码可读性和运行效率。
  4. 循环边界控制:在查找匹配部件的循环中添加行数判断,防止出现无限循环。

内容的提问来源于stack exchange,提问作者Cole Mertz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:50:25