【问题标题】:Separating values in a cell into multiple rows将单元格中的值分成多行
【发布时间】:2020-08-01 05:02:12
【问题描述】:

我在一个从 csv 文件导入的 excel 行中有这些值

    Col1             Col2    Col3   Col4
name@email.com     `value1  value2  value 3`
Name2@email.com
name3@email.com

我需要将它们分成 3 行,每行中列 2-4 的值相同。注意:第 1 列中的条目数并不一致。我的范围可以从 1 到 12 行。而且,可能有重复。 我发现了一些应该删除重复的代码,这会有所帮助,但它不是完整的解决方案,而且它不起作用。我还找到了一些公式,但它们都不是我想要的。

提前感谢您的帮助。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我建议使用SPLIT 函数将包含多行的单元格拆分为一个数组。您可以使用换行符(字符代码 10)在每个换行符处进行拆分。

    例如,如果您从以下数据开始:


    Reproduce this data

    然后运行以下命令:

    Sub SplitRow()
    
        Dim wb As Workbook
        Set wb = Workbooks("MyWorkbook.xlsm")
        
        Dim ws As Worksheet
        Set ws = wb.Sheets("MySheet")
        
        Dim rng As Range
        Set rng = ws.Range("A1")
    
        Dim MyArray As Variant
        MyArray = Split(rng, Chr(10))
            
        'Insert the number of rows needed
        If UBound(MyArray) > 0 Then
            rng.Offset(1, 0).Resize(UBound(MyArray), 1).EntireRow.Insert xlShiftDown, xlFormatFromLeftOrAbove
        End If
        
        'Write the array to sheet
        rng.Resize(UBound(MyArray) + 1, 1).Value2 = Application.Transpose(MyArray)
        
        'Copy over the other columns
        Dim i As Long, j As Long
        For i = 1 To 3
            For j = 1 To UBound(MyArray) + 1
                rng.Offset(i, j).Value2 = rng.Offset(0, j)
            Next j
        Next i
    
    End Sub
    

    你会得到这个:


    换行的潜在问题

    请注意,您的单元格中可能没有任何换行符。在这种情况下,您必须找到另一个角色作为delimiter 进行拆分。

    要知道您的单元格是否包含换行符,您可以选择该单元格并运行以下命令:

    Sub StringDrillDown(str As String)
    
        Dim ws As Worksheet
        With ActiveWorkbook
            Set ws = .Sheets.Add(AFTER:=.Sheets(.Sheets.Count))
        End With
    
        ws.Range("A1") = "Character"
        ws.Range("B1") = "Ascii Code"
        Dim i As Long
        For i = 1 To Len(str)
            ws.Cells(i + 1, 1).Value2 = Mid$(str, i, 1)
            ws.Cells(i + 1, 2).Value2 = Asc(Mid$(str, i, 1))
        Next i
    
    End Sub
    

    例如,如果我在 Range A1 的原始内容上运行它(拆分前),我会得到:

    希望您的 CSV 格式设置为每个元素之间有一个字符,以便您可以正确拆分它们。如果没有,您可能需要查看正则表达式。


    注意事项:

    • SPLIT 函数是从零开始的,这意味着 MyArray 的第一个元素是 MyArray(0)。
    • 如果您计划对多行数据运行此过程,请确保您的循环从底部开始,以避免插入行弄乱行位置的问题。

    【讨论】:

    • 感谢 DecimalTurn 但我在这一行收到错误:rng.Offset(1, 0).Resize(UBound(MyArray), 1).EntireRow.Insert xlShiftDown, xlFormatFromLeftOrAbove 这是一个对象定义错误
    • @aoswald 这可能是因为rng 不包含任何换行符,你得到 ubound(MyArray) = 0。我已经编辑了我的答案来解释这种可能性。
    • 感谢@DecimalTurn,但现在我没有收到错误消息。我什么都得不到
    • @aoswald 请注意,您的单元格中可能没有任何换行符。在这种情况下,您必须找到另一个字符作为分隔符来拆分。例如,也许使用 Chr(32) 作为空格字符。
    • @aoswald - 我添加了代码来重现我正在使用的数据,因此您至少可以复制我的结果。我还添加了有关换行符潜在问题的部分。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多