将文本转换为行 VBA Excel

4

我有一个包含大约4000行数据的电子表格,其中一列数据具有唯一的订单号,我希望使用"/"作为分隔符将其分离。因此,我希望实现以下目标:

Name      Order#       Date
Jane      123/001/111  08/15/2013
Gary      333/121      09/01/2013
Jack      222          09/02/2013

要达到如下效果:
Name      Order#       Date
Jane      123          08/15/2013
Jane      001          08/15/2013
Jane      111          08/15/2013
Gary      333          09/01/2013
Gary      121          09/01/2013
Jack      222          09/02/2013

我对VBA还比较陌生,所以我决定搜索一下解决方案,然后找到了这段不错的代码。

        Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
    Dim ans 
    Dim Cels As Long, i As Long 
    Cancel = True 
    ans = Split(Target, ":") 
    Cels = UBound(ans) 
    Target.Offset(1).Resize(Cels).EntireRow.Insert shift:=xlDown 
    Rows(Target.Row).Copy Cells(Target.Row + 1, "A").Resize(Cels) 
    For i = 0 To Cels 
        Target.Offset(i) = ans(i) 
    Next 
End Sub

它的功能很好,但是这个宏函数的工作方式是你必须双击行以分隔值。我希望有一种通过For循环传递此函数的方法,使其在整个电子表格中执行。

1个回答

4
如果您的表格看起来像这样: enter image description here 那么
Option Explicit

Sub Main()

    Columns("B:B").NumberFormat = "@"
    Dim i As Long, c As Long, r As Range, v As Variant

    For i = 1 To Range("B" & Rows.Count).End(xlUp).Row
        v = Split(Range("B" & i), "/")
        c = c + UBound(v) + 1
    Next i

    For i = 2 To c
        Set r = Range("B" & i)
        Dim arr As Variant
        arr = Split(r, "/")
        Dim j As Long
        r = arr(0)
        For j = 1 To UBound(arr)
            Rows(r.Row + j & ":" & r.Row + j).Insert Shift:=xlDown
            r.Offset(j, 0) = arr(j)
            r.Offset(j, -1) = r.Offset(0, -1)
            r.Offset(j, 1) = r.Offset(0, 1)
        Next j
    Next i

End Sub

将产生以下结果:

enter image description here


非常好,谢谢您先生。我有一个问题。我发布的示例是一个样本,但我的实际条目大约有10列。我注意到在您的代码中,在通过数组进行的For循环中,它将条目粘贴到订单#左侧和右侧。是否有一种方法只需复制整行,还是我必须手动输入每个列? - Kevin Malloy
1
嗨@KevinMalloy。有两种实现你想要的方法。第一种是插入X行,然后复制并粘贴行,并处理斜线之间的字符串。另一种方法(基于您的描述我选择的方法)是处理斜线 - 计算需要插入多少行 - 然后使用偏移量复制所有列。代码可能不太美观(取决于您拥有的列数),但它会完成工作。所以如果你有大约10个列,仍然值得添加leftsrights。希望这有所帮助。 - user2140173
1
@KevinMalloy 请记住,您可以使用简单的for循环和Cells(x,y)而不是Range来自动复制列。如果您采取这种方法并不确定如何操作,最好另外提问,因为对当前问题的任何修改都会使我的当前答案无效:( - user2140173
1
我也在考虑同样的想法,谢谢你的回答,非常感谢。我想现在先添加这些列,然后在以后的某个时候再用循环来清理它。 - Kevin Malloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接