|
BOM父子一维表转树状结构的代码实例:
代码加了简单注释:- Sub test()
- arr = Sheet1.[a1].CurrentRegion '获取原始Bom数据到数组arr
-
- m = 9 '暂且假定bom最大阶数9,1-9阶。如果需要你可以继续增大此参数。
- ReDim brr(1 To UBound(arr), 1 To m * 2 + 1) '定义结果数组brr
-
- For i = 2 To UBound(arr) '遍历原始数据
-
- If arr(i, 1) <> arr(i - 1, 1) Then '产品名不同时
- k = k + 1 '重新开始一行
- brr(k, 1) = arr(i, 1)
- brr(k, 2) = arr(i, 2)
- brr(k, 3) = arr(i, 3)
- l = 1 '指定阶数从1开始
- Else '产品名相同时继续
- If Val(arr(i, 2)) > Val(arr(i - 1, 2)) Then
- '如果阶数增加,则在同一行内继续展开
- brr(k, l * 2 + 2) = arr(i, 2)
- brr(k, l * 2 + 3) = arr(i, 3)
- l = l + 1 '阶数+1
- If l > n Then n = l '比较获取历史最高阶数
- Else '如果阶数相同或者减小
- k = k + 1 '那么需要新增一行
- brr(k, 1) = brr(k - 1, 1) '产品名照抄上一行
- l = Val(arr(i, 2)) '获取当前阶数
- For j = 1 To l - 1 '可以照抄到L-1阶
- brr(k, j * 2) = brr(k - 1, j * 2)
- brr(k, j * 2 + 1) = brr(k - 1, j * 2 + 1)
- Next
- '照抄完L-1阶数据以后,写入L阶的数据
- brr(k, j * 2) = arr(i, 2)
- brr(k, j * 2 + 1) = arr(i, 3)
- End If
- End If
- Next
-
- MsgBox k & " 行 " & n * 2 + 1 & " 列" '实际得到数据的行数和列数
- Sheet2.[a2].Resize(k, n * 2 + 1) = brr '输出结果到sheet2
-
- End Sub
复制代码 本来是某个新手的求助帖。
我下载附件,写好代码以后,因为网络断线,再上来看,这个帖子找不到了……
真是奇妙》》》
既然楼主也关心,我就把例子附在这里,如能帮到其他人也好。呵呵。
|
|