实例需求:源数据表如左图所示,包含两列:产品编号和类别,其中类别为多级列别列表,使用大于号分隔,类别级别不固定。现在需要按照列表进行拆分,产品编号依次重复,如右图所示。
示例代码如下。
Sub Demo()
Dim i As Long, j As Long
Dim arrData, arrRes, aTxt, sTxt As String
Dim idCol As New Collection, cateCol As New Collection
arrData = ActiveSheet.Range("A1").CurrentRegion.Value
For i = LBound(arrData) To UBound(arrData)
aTxt = Split(arrData(i, 2), ">")
sTxt = ""
For j = LBound(aTxt) To UBound(aTxt)
idCol.Add arrData(i, 1)
sTxt = sTxt & ">" & aTxt(j)
cateCol.Add Mid(sTxt, 2)
Next j
Next i
ReDim arrRes(1 To idCol.Count, 1)
For i = 1 To idCol.Count
arrRes(i, 0) = idCol(i)
arrRes(i, 1) = cateCol(i)
Next
Sheets.Add
Range("A1").Resize(idCol.Count, 2).Value = arrRes
End Sub
【代码解析】
第5行代码将数据加载到数组中。
第6~14行代码循环处理每行数据。
第7行代码将对类别进行拆分。
第9~13行代码循环处理每个级别类别,产品编号和类别分别保存在idCol和cateCol两个Collection对象中。此处也可以使用动态数组实现,使用Collection对象的好处是,可以在指定位置添加(插入)和删除其中的元素,动态数组除了追加之外,插入和删除操作都比较复杂。
第10行代码添加产品编号。
第11行代码逐级组合类别。
第12行代码添加类别。
第15行代码为结果数组分配内存空间。
第16~19行代码将对象变量中的数据转存都数组中。
第20行代码增加一个新工作表用于保存结果数据。
第21行代码将结果输出到工作表中。