如何在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
相关产品推荐
相关产品推荐

