【发布时间】:2016-05-10 16:57:17
【问题描述】:
我是新来的。
我正在尝试构建一个快速 VBA 程序,以按层次结构(BOM 级别)和状态“扁平化”物料清单。
示例数据显示了一个 BOM,其中 Car 作为顶级装配体,Wheel 和 Engine 作为二级装配体,以及在 BOM 的第三和第四级构成这些装配体的各种子零件。
我想删除所有具有“ZE”、“ZM”值的行,或者在C 列中为空白。
我还想删除任何具有值“ZA”并且也是另一个“ZA”项的直接子项的行。 (示例 - 从 BOM 中删除 Rim 行,因为 Wheel 是父项“ZA”项)
这是我目前所拥有的:
Sub deletechildren()
Dim lr As Long, i As Long, k As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
For i = lr To 1 Step -1
If i > 2 Then
k = i - 1
End If
If Cells(i, 3).Value = "ZA" And Cells(i, 1).Value = Cells(k, 1).Value Then
Cells(i, 3).EntireRow.Delete
ElseIf Cells(i, 3).Value = "ZE" Then
Cells(i, 3).EntireRow.Delete
ElseIf Cells(i, 3).Value = "ZM" Then
Cells(i, 3).EntireRow.Delete
ElseIf Cells(i, 3).Value = "" Then
Cells(i, 3).EntireRow.Delete
End If
Next i
lr = Cells(Rows.Count, 1).End(xlUp).Row
End Sub
我在 If 语句的第一部分遇到了一些错误,我想从“ZA”父级解析出任何“ZA”状态子级。
有什么想法吗?
【问题讨论】:
-
当循环第一次遇到 If 语句时,
k的值是多少? -
对不起,第一个 If 语句只是我在玩弄的东西。实际上,“k”应该始终是“i-1”。我试图使用“k”作为当前正在评估的行“i”正上方的行的标识符。
-
我得到的是
k在循环迭代之前可能没有被初始化。您确定 k 在第一次遇到If语句时有值吗? -
你遇到了什么错误?
-
尝试在循环之前添加一个
k = 0值。我知道它应该得到一个值,因为lr应该大于 2,但是如果您单步执行宏(使用 F8),当它到达第一行If Cells(i,3)...时,将鼠标悬停在将鼠标悬停在k上,看看它是否有弹出值。 (或在即时窗口中执行?k)