Vba Excel宏-将逗号分隔的条目拆分为新行
我目前在一张表格中有这些数据Vba Excel宏-将逗号分隔的条目拆分为新行,vba,excel,macros,Vba,Excel,Macros,我目前在一张表格中有这些数据 Col A Col B Col C 1 A angry birds, gaming 2 B nirvana,rock,band 我要做的是拆分第三列中以逗号分隔的条目,并插入新行,如下所示: Col A Col B Col C 1 A angry birds 1 A gaming 2 B nirvana 2 B
Col A Col B Col C
1 A angry birds, gaming
2 B nirvana,rock,band
我要做的是拆分第三列中以逗号分隔的条目,并插入新行,如下所示:
Col A Col B Col C
1 A angry birds
1 A gaming
2 B nirvana
2 B rock
2 B band
我确信这可以用VBA来完成,但我自己无法解决。这是我对两列数据的答案。但是我想写三个专栏,有人能帮我吗 您最好使用变量数组而不是单元循环-一旦数据集有意义,它们在代码方面就会快得多。即使代码更长: 下面的示例转储到C列和D列,以便您可以查看原始数据。将[c1]。ResizelngCnt,2.Value2=Application.transpsey更改为[a1]。ResizelngCnt,2.Value2=Application.transpsey以转储原始数据 [使用regexp进行更新,以在band变为band后删除任何空格] 子切片 作为对象的Dim objRegex 暗X 暗淡的 长得一样长 暗长 暗节拍如弦 暗斯特拉尔 设置objRegex=CreateObjectvbscript.regexp objRegex.Pattern=^\s++?$ '定义要分析的范围 X=范围[a1],单元格箭头.计数,b.EndxlUp.Value2 重拨Y1到2,1到1000 对于lngRow=1到UBoundX,1 '将每个字符串拆分为, tempArr=SplitXlngRow,2, 以tempArr表示的每个strArr lngCnt=lngCnt+1 '每1000条记录向重置阵列添加1000条记录 如果lngCnt Mod 1000=0,则Redim保留Y1至2,1至lngCnt+1000 Y1,lngCnt=XlngRow,1 Y2,lngCnt=objRegex.ReplacestrArr,$1 下一个 下一个成长 '将重新排序的范围转储到C:D列 [c1]。ResizelngCnt,2.Value2=Application.transpsey
End Sub这是我对两列数据的答案。但是我想写三个专栏,有人能帮我吗 您最好使用变量数组而不是单元循环-一旦数据集有意义,它们在代码方面就会快得多。即使代码更长: 下面的示例转储到C列和D列,以便您可以查看原始数据。将[c1]。ResizelngCnt,2.Value2=Application.transpsey更改为[a1]。ResizelngCnt,2.Value2=Application.transpsey以转储原始数据 [使用regexp进行更新,以在band变为band后删除任何空格] 子切片 作为对象的Dim objRegex 暗X 暗淡的 长得一样长 暗长 暗节拍如弦 暗斯特拉尔 设置objRegex=CreateObjectvbscript.regexp objRegex.Pattern=^\s++?$ '定义要分析的范围 X=范围[a1],单元格箭头.计数,b.EndxlUp.Value2 重拨Y1到2,1到1000 对于lngRow=1到UBoundX,1 '将每个字符串拆分为, tempArr=SplitXlngRow,2, 以tempArr表示的每个strArr lngCnt=lngCnt+1 '每1000条记录向重置阵列添加1000条记录 如果lngCnt Mod 1000=0,则Redim保留Y1至2,1至lngCnt+1000 Y1,lngCnt=XlngRow,1 Y2,lngCnt=objRegex.ReplacestrArr,$1 下一个 下一个成长 '将重新排序的范围转储到C:D列 [c1]。ResizelngCnt,2.Value2=Application.transpsey
End Sub这不是一个完美的解决方案,但我需要花一些时间和妻子在一起 但还有另一种思考方式 此代码假定该图纸称为Sheet4,需要拆分的范围为C列
Dim lastrow As Integer
Dim i As Integer
Dim descriptions() As String
With Worksheets("Sheet4")
lastrow = .Range("C1").End(xlDown).Row
For i = lastrow To 2 Step -1
If InStr(1, .Range("C" & i).Value, ",") <> 0 Then
descriptions = Split(.Range("C" & i).Value, ",")
End If
For Each Item In descriptions
.Range("C" & i).Value = Item
.Rows(i).Copy
.Rows(i).Insert
Next Item
.Rows(i).EntireRow.Delete
Next i
End With
这不是一个完美的解决方案,但我需要花一些时间和妻子在一起 但还有另一种思考方式 此代码假定该图纸称为Sheet4,需要拆分的范围为C列
Dim lastrow As Integer
Dim i As Integer
Dim descriptions() As String
With Worksheets("Sheet4")
lastrow = .Range("C1").End(xlDown).Row
For i = lastrow To 2 Step -1
If InStr(1, .Range("C" & i).Value, ",") <> 0 Then
descriptions = Split(.Range("C" & i).Value, ",")
End If
For Each Item In descriptions
.Range("C" & i).Value = Item
.Rows(i).Copy
.Rows(i).Insert
Next Item
.Rows(i).EntireRow.Delete
Next i
End With
使用脚本的变体。字典
资料来源:
结果:
使用脚本的变体。字典
资料来源:
结果:
这会满足你的要求
Option Explicit
Const ANALYSIS_ROW As String = "C"
Const DATA_START_ROW As Long = 1
Sub ReplicateData()
Dim iRow As Long
Dim lastrow As Long
Dim ws As Worksheet
Dim iSplit() As String
Dim iIndex As Long
Dim iSize As Long
'Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With ThisWorkbook
.Worksheets("Sheet1").Copy After:=.Worksheets("Sheet1")
Set ws = ActiveSheet
End With
With ws
lastrow = .Cells(.Rows.Count, ANALYSIS_ROW).End(xlUp).Row
End With
For iRow = lastrow To DATA_START_ROW Step -1
iSplit = Split(ws.Cells(iRow, ANALYSIS_ROW).Value2, ",")
iSize = UBound(iSplit) - LBound(iSplit) + 1
If iSize = 1 Then GoTo Continue
ws.Rows(iRow).Copy
ws.Rows(iRow).Resize(iSize - 1).Insert
For iIndex = LBound(iSplit) To UBound(iSplit)
ws.Cells(iRow, ANALYSIS_ROW).Offset(iIndex).Value2 = iSplit(iIndex)
Next iIndex
Continue:
Next iRow
Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
'Application.ScreenUpdating = True
End Sub
这会满足你的要求
Option Explicit
Const ANALYSIS_ROW As String = "C"
Const DATA_START_ROW As Long = 1
Sub ReplicateData()
Dim iRow As Long
Dim lastrow As Long
Dim ws As Worksheet
Dim iSplit() As String
Dim iIndex As Long
Dim iSize As Long
'Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With ThisWorkbook
.Worksheets("Sheet1").Copy After:=.Worksheets("Sheet1")
Set ws = ActiveSheet
End With
With ws
lastrow = .Cells(.Rows.Count, ANALYSIS_ROW).End(xlUp).Row
End With
For iRow = lastrow To DATA_START_ROW Step -1
iSplit = Split(ws.Cells(iRow, ANALYSIS_ROW).Value2, ",")
iSize = UBound(iSplit) - LBound(iSplit) + 1
If iSize = 1 Then GoTo Continue
ws.Rows(iRow).Copy
ws.Rows(iRow).Resize(iSize - 1).Insert
For iIndex = LBound(iSplit) To UBound(iSplit)
ws.Cells(iRow, ANALYSIS_ROW).Offset(iIndex).Value2 = iSplit(iIndex)
Next iIndex
Continue:
Next iRow
Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
'Application.ScreenUpdating = True
End Sub
如果您有大量数据,您将发现使用数组是有益的
Sub Macro2()
Dim i As Long, j As Long, rws As Long
Dim inp As Variant, outp As Variant
With Worksheets("sheet2")
inp = .Range(.Cells(1, "A"), .Cells(.Rows.Count, "C").End(xlUp)).Value2
For i = LBound(inp, 1) To UBound(inp, 1)
rws = rws + UBound(Split(inp(i, 3), ",")) + 1
Next i
ReDim outp(1 To rws, 1 To 3)
rws = 0
For i = LBound(inp, 1) To UBound(inp, 1)
For j = 0 To UBound(Split(inp(i, 3), ","))
rws = rws + 1
outp(rws, 1) = inp(i, 1)
outp(rws, 2) = inp(i, 2)
outp(rws, 3) = Trim(Split(inp(i, 3), ",")(j))
Next j
Next i
.Cells(1, "A").Resize(UBound(outp, 1), UBound(outp, 2)) = outp
End With
End Sub
如果您有大量数据,您将发现使用数组是有益的
Sub Macro2()
Dim i As Long, j As Long, rws As Long
Dim inp As Variant, outp As Variant
With Worksheets("sheet2")
inp = .Range(.Cells(1, "A"), .Cells(.Rows.Count, "C").End(xlUp)).Value2
For i = LBound(inp, 1) To UBound(inp, 1)
rws = rws + UBound(Split(inp(i, 3), ",")) + 1
Next i
ReDim outp(1 To rws, 1 To 3)
rws = 0
For i = LBound(inp, 1) To UBound(inp, 1)
For j = 0 To UBound(Split(inp(i, 3), ","))
rws = rws + 1
outp(rws, 1) = inp(i, 1)
outp(rws, 2) = inp(i, 2)
outp(rws, 3) = Trim(Split(inp(i, 3), ",")(j))
Next j
Next i
.Cells(1, "A").Resize(UBound(outp, 1), UBound(outp, 2)) = outp
End With
End Sub
大家好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。并包含您试图通过的代码…以便人们能够提供帮助。您好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。并包括你正在试图通过的代码…这样人们就可以提供帮助。这正是我想要的。你能解释一下它是怎么工作的吗?这正是我想要的。你能解释一下它是如何工作的吗?