将单个单元格中的数据吐入多行

时间:2015-08-02 07:07:25

标签: excel vba

我在Excel文件中有一个带有名称和地址的数据集,格式如下。

Name1
  134/47/1,
adrs1, adr2, country

Name2
 adrs1, adrs2, country 

Name3
  107/c,
adrs3, adrs3, country

etc…

我想以下列格式将这些数据拆分成多行

Name1
  134/47/1,
adrs1,
adrs2,
country

Name2
 No 134/63,
adrs1,
adrs2,
country


etc…

我试过了,但它仅适用于一行电池。

Sub tst()
    Dim X As Variant
    X = Split(Range("A1").Value, ",")
    Range("A1").Resize(UBound(X) - LBound(X) + 1).Value =         Application.Transpose(X)
End Sub

2 个答案:

答案 0 :(得分:1)

我不确定您的样本数据是否将单个值上的逗号逗号作为拼写错误,或者是否恰好代表您的数据,但应该考虑到这一点。作为后缀的流氓逗号将为变量数组创建一个额外的元素,从而抛弃通过引用UBound function创建的维度。

Sub split_from_below_space()
    Dim rw As Long, v As Long, vVALs As Variant

    With Worksheets("Sheet1")   'set this worksheet reference properly!
        For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
            .Cells(rw, 1) = Trim(.Cells(rw, 1).Value2)
            If CBool(InStr(1, .Cells(rw, 1).Value2, Chr(44) & Chr(32))) Then
                vVALs = Split(.Cells(rw, 1).Value2, Chr(44) & Chr(32))
                .Cells(rw + 1, 1).Resize(UBound(vVALs), 1).EntireRow.Insert
                .Cells(rw, 1).Resize(UBound(vVALs) + 1, 1) = _
                    Application.Transpose(vVALs)
                For v = UBound(vVALs) - 1 To LBound(vVALs) Step -1
                    .Cells(rw, 1).Offset(v, 0) = _
                        Trim(.Cells(rw, 1).Offset(v, 0).Value2) & Chr(44)
                Next v
            End If
        Next rw
    End With

End Sub

您需要插入行以容纳数据,并且该方法几乎总是(如本例所示)从底部到顶部更好地执行。

答案 1 :(得分:1)

以下宏可能会对您有所帮助。您必须在包含多部分地址的表中选择最后单元格。当你启动宏时,它将向上移动到顶部并在需要的地方插入地址行(仅在当前列中),然后退出。

Option Base 1
Sub trnsfrm()
  Dim i%, n%, ret(3, 1)
  Set r = Selection
  Do
    a = Split(r, ",")
    ret(1, 1) = Trim(a(0))
    ret(2, 1) = Trim(a(1))
    ret(3, 1) = Trim(a(2))
    r.Range([a2], [a3]).Insert Shift:=xlDown
    r.Range([a1], [a3]) = ret
    If r.Row <= 4 Then Exit Do
    Set r = r.Offset(-4)
  Loop
End Sub

如果要在整个表格中插入行,则应替换行(10)

r.Range([a2], [a3]).Insert Shift:=xlDown

通过

r.Range([a2], [a3]).EntireRow.Insert Shift:=xlDown

假设/警告

由于宏实际上会更改当前表,并且“撤消”不适用于宏,因此在尝试之前一定要保存所有内容。

宏假设每个地址块正好4行组成。如果地址的行数越来越少,那么maro就会失去同步,很可能会输出垃圾或停止。