Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Excel宏-将逗号分隔的条目拆分为新行_Vba_Excel_Macros - Fatal编程技术网

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。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。并包括你正在试图通过的代码…这样人们就可以提供帮助。这正是我想要的。你能解释一下它是怎么工作的吗?这正是我想要的。你能解释一下它是如何工作的吗?