将具有多个数据的单元拆分为多个列中的多个行

时间:2014-04-28 12:34:36

标签: excel vba excel-vba

我在1个单元格中有一个包含多个数据的工作表,这在几列中发生。我需要做的是将单元格分成单独的行,同时仍保留其他列的详细信息

屏幕1显示我得到的数据

http://imageshack.com/a/img845/1783/wxc8.png(屏幕1)

屏幕2是我希望输出的宏。

http://imageshack.com/a/img842/7356/7yra.png(第2页)

我找到并编辑的宏只允许我拆分1列,我无法正确编辑范围。需要拆分的列是“J”“K”“N”和“O”。列“A” - “I”和“L”“M”只需将其内容复制到新行。

提前感谢您的帮助。

这里的宏我正在使用

Sub Splt1()
Dim LR As Long, i As Long
Dim X As Variant
Application.ScreenUpdating = False
LR = Range("J" & Rows.Count).End(xlUp).Row
Columns("J").Insert
For i = LR To 1 Step -1
    With Range("K" & i)
        If InStr(.Value, Chr(10)) = 0 Then
            .Offset(, -1).Value = .Value
        Else
            X = Split(.Value, Chr(10))
            .Offset(1).Resize(UBound(X)).EntireRow.Insert
            .Offset(, -1).Resize(UBound(X) - LBound(X) + 1).Value = Application.Transpose(X)
        End If
    End With
Next i
Columns("K").Delete
LR = Range("J" & Rows.Count).End(xlUp).Row
With Range("L1:M" & LR)
    On Error Resume Next
    .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
    On Error GoTo 0
    .Value = .Value
End With
Application.ScreenUpdating = True
End Sub

1 个答案:

答案 0 :(得分:0)

问题似乎是with运算符。它限制了你的选择。尝试在没有with的情况下重新构造宏,并直接参考范围。例如,用以下内容替换您的第一个for循环:

For i = LR To 1 Step -1
    If InStr(Range("K" & i).Value, Chr(10)) = 0 Then
        Range("K" & i).Offset(, -1).Value = Range("K" & i).Value
        'Range("J" ...
        'Range("N" ...
        'Range("O" ...

    Else
        K_collection = Split(Range("K" & i).Value, Chr(10))
        Range("K" & i).Offset(1).Resize(UBound(K_collection)).EntireRow.Insert
        Range("K" & i).Offset(, -1).Resize(UBound(K_collection) - LBound(K_collection) + 1).Value = Application.Transpose(K_collection)

        'J_collection = Split(Range("J"...
        'N_collection = Split(Range("N"...
        'O_collection = Split(Range("O"...
    End If
Next i

一般来说,我避免with,因为它往往会模糊代码的视觉模式。

您可能还会考虑删除.INSERT.DELETE列,并直接覆盖单元格。当一次使用多个列时,很难跟踪哪个列是临时的,哪个列是源。但这一切都取决于你的偏好。

与此相比,复制其他列的值应该很容易。