将分隔的第二列和第三列数据拆分为新行
Split delimited 2nd and 3rd column data into new rows
我有以下table
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
活动 sheet 和 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
扁平化数据将填充在现有数据下方。您的结果应类似于以下内容。
我有以下table
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
活动 sheet 和 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
扁平化数据将填充在现有数据下方。您的结果应类似于以下内容。