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-鉴于已经接受了一个答案,我将提出一个新问题,因为您现在使用的与原始请求不同。您的问题的答案是肯定的,特别是如果分隔符是固定的。现在我的问题是,你试过什么?在您的尝试中,您遇到了哪些问题?