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

如何在For循环内嵌套Do Until反向遍历判断BoM子项归属?

Excel VBA:判断BoM子项是否属于采购装配体子项

需求概述

  • BoM数据从第12行开始:
    • A列:BoM层级(从0开始递增)
    • B列:装配状态,仅关注值为P的采购装配体
    • C列:输出判断结果
  • 第12行C列固定标记为TL
  • 第13行及以后的行,需向上反向遍历,直到找到B列为P的行,或遍历至层级0的行,据此判断是否为采购装配体的子项

优化实现代码

Sub CheckPurchasedAssemblyItems()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim currentRow As Long
    Dim searchRow As Long
    Dim foundPurchased As Boolean
    
    ' 指定目标工作表,根据实际名称修改
    Set ws = ThisWorkbook.Worksheets("BoM")
    
    ' 获取A列最后有数据的行号
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 处理首行(第12行)
    ws.Cells(12, "C").Value = "TL"
    
    ' 遍历所有子项行(从13行开始)
    For currentRow = 13 To lastRow
        foundPurchased = False
        searchRow = currentRow - 1
        
        ' 向上反向查找,满足终止条件则退出循环
        Do Until searchRow < 12 Or ws.Cells(searchRow, "A").Value = 0 Or foundPurchased
            ' 检查当前行是否为采购装配体(忽略大小写和空格)
            If UCase(Trim(ws.Cells(searchRow, "B").Value)) = "P" Then
                foundPurchased = True
            Else
                searchRow = searchRow - 1
            End If
        Loop
        
        ' 输出判断结果到C列
        ws.Cells(currentRow, "C").Value = IIf(foundPurchased, "采购装配体子项", "非采购装配体子项")
    Next currentRow
    
    Set ws = Nothing
End Sub

代码说明

  • 无层级限制:用Do Until循环替代原有的嵌套Select Case,无论BoM层级是4级还是99级,都能正常遍历,避免冗余代码
  • 反向查找逻辑:从当前行的上一行开始向上遍历,终止条件包含三种情况:超出数据起始行、到达层级0、找到采购装配体
  • 容错处理:通过UCase和Trim处理B列的输入值,避免因大小写、空格导致的判断错误
  • 灵活输出:可直接修改IIf函数的返回文本,适配不同的结果标记需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:25:15