Vba 将分隔的第2列和第3列数据拆分为新行

Vba 将分隔的第2列和第3列数据拆分为新行,vba,excel,excel-2010,Vba,Excel,Excel 2010,我有下表 ID. ID2. String 123. 567, 986 ABC;BCD;ACD 142. 134, 654,1134 AA;BB 我想把它展示出来 ID ID2 String 123 567 ABC 123 986 BCD 123 ACD 142 134 AA 142 654 bb 142 1134 ID列中的值是唯一的 有没有有效的宏观解

我有下表

  ID.      ID2.              String
  123.     567, 986          ABC;BCD;ACD
  142.     134, 654,1134     AA;BB
我想把它展示出来

 ID   ID2  String
 123  567  ABC
 123  986  BCD
 123       ACD
 142  134  AA
 142  654  bb
 142  1134
ID
列中的值是唯一的

有没有有效的宏观解决方案?我有大量的数据。

试试这个

Sub FlattenData()
    Dim rng As Range, arr() As Variant, i As Long, rw As Long, j As Long

    Set rng = Range("A1:C2") //Update for your range
    arr() = rng

    rng.ClearContents

            rw = 0

    For i = 1 To UBound(arr, 1)
        colBTemp = VBA.Split(arr(i, 2), ",")
        colCTemp = VBA.Split(arr(i, 3), ";")

        colBTempLength = UBound(colBTemp, 1) + 1
        colCTempLength = UBound(colCTemp, 1) + 1
        requiredRows = WorksheetFunction.Max(colBTempLength, colCTempLength)

        For j = 1 To requiredRows
            Range("A" & rw + j) = arr(i, 1)

            If j <= colBTempLength Then
                Range("B" & rw + j) = colBTemp(j - 1)
            Else
                Range("B" & rw + j) = vbNullString
            End If

            If j <= colCTempLength Then
                Range("C" & rw + j) = colCTemp(j - 1)
            Else
                Range("C" & rw + j) = vbNullString
            End If
        Next j

        rw = rw + requiredRows
    Next i
End Sub
Sub-data()
尺寸rng作为范围,arr()作为变型,i作为长度,rw作为长度,j作为长度
设置rng=Range(“A1:C2”)//更新您的范围
arr()=rng
rng.ClearContents
rw=0
对于i=1至UBound(arr,1)
colBTemp=VBA.Split(arr(i,2),“,”)
colCTemp=VBA.Split(arr(i,3),“;”)
colBTempLength=UBound(colBTemp,1)+1
colCTempLength=UBound(colCTemp,1)+1
requiredRows=工作表函数.Max(colBTempLength,colCTempLength)
对于j=1至所需行
范围(“A”和rw+j)=arr(i,1)

如果j只有活动工作表和ID中的起始连接数据在A1中,则运行此宏

Sub split_out()
    Dim v As Long, vVALs As Variant, vID2s As Variant, vSTRs As Variant
    Dim rw As Long, lr As Long, mx As Long

    With ActiveSheet
        lr = .Cells(Rows.Count, 1).End(xlUp).Row
        .Cells(1, 1).CurrentRegion.Rows(1).Copy Destination:=.Cells(lr + 2, 1)
        For rw = 2 To lr
            vVALs = Application.Index(.Cells(rw, 1).Resize(1, 3).Value, 1, 0)
            vID2s = Split(vVALs(2), Chr(44))
            vSTRs = Split(vVALs(3), Chr(59))
            mx = Application.Max(UBound(vID2s), UBound(vSTRs))
            For v = LBound(vID2s) To mx
                .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = vVALs(1)
                If UBound(vID2s) >= v Then _
                    .Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = vID2s(v)
                If UBound(vSTRs) >= v Then _
                    .Cells(Rows.Count, 1).End(xlUp).Offset(0, 2) = vSTRs(v)
            Next v
        Next rw
    End With

End Sub
展平数据将填充到现有数据下方。您的结果应该与以下类似


它会清除所有内容,但不会给出我要获取的内容。此外,它还会清除内容。excel工作表中是否打印了任何内容?我测试了它,似乎对我有用…@AlexP-我想也许你的
rng.ClearContents
应该移到
arr()=rng
代码行下面。我试图找到笛卡尔积,从上述数据集中得出所有组合。您能建议对上述内容进行一些修改吗?@user3317862-鉴于已经接受了一个答案,我将提出一个新问题,因为您现在使用的与原始请求不同。您的问题的答案是肯定的,特别是如果分隔符是固定的。现在我的问题是,你试过什么?在您的尝试中,您遇到了哪些问题?