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
关键修改说明
- 逻辑修正:将
Or替换为And,确保仅当D列单元格既不是"SCRAP"也不是空值时,才执行提取操作。 - 除以零防护:在计算库存比例前判断G列值是否为0,避免触发运行时错误。
- 简化引用:用
wsAlarms和wsBOMs变量替代重复的工作表调用,提升代码可读性和运行效率。 - 循环边界控制:在查找匹配部件的循环中添加行数判断,防止出现无限循环。
内容的提问来源于stack exchange,提问作者Cole Mertz
相关产品推荐
相关产品推荐

