如何使用非统一分隔符分解文本?

时间:2014-11-12 02:11:12

标签: vba excel-vba split excel

我在Excel中有这些数据:

enter image description here

但我的一位客户需要详细总结每个项目 所以上面的数据需要转换为:

enter image description here

这样,客户可以按照跟踪和每个项目进行分析 由于手动输入,因此文本格式不一致 有些用户使用 Alt + Enter 来分隔项目。有些使用空间,有些则根本不需要分离。然而,他们的一致性是他们在项目后面加上连字符( - )然后是计数(虽然数字后面并不总是,但两者之间可以有空格)。此外,如果该项目的计数是一(1),他们根本不打扰它(如跟踪IDU3004上的 Apple Juice 所见)。

我尝试的唯一功能是分割功能,它让我更接近我想要的东西 但是我仍然很难将各个数组元素分成我期望的结果 例如,使用拆分(使用" - "作为分隔符)后,上面的 IDU3001 将是:

arr(0) = "Apple"
arr(1) = "20 Grape"
arr(2) = "5" & Chr(10) & "Pear" ~~> Just to show Alt+Enter
arr(3) = "3Banana"
arr(4) = "2"

当然,我可以提出一个函数来处理每个元素以提取数字和项目 实际上我只想使用该功能并完全跳过拆分 我只是很好奇,因为我不熟悉 Text 操作,可能还有另外一种方法。
我很感激任何可以指出我可能更好解决方案的想法。 />

1 个答案:

答案 0 :(得分:3)

我建议使用正则表达式方法

以下是基于样本数据的演示。

Sub Demo()
    Dim re As RegExp
    Dim rMC As MatchCollection
    Dim rM As Match
    Dim rng As Range
    Dim rw As Range
    Dim Detail As String

    ' replace with the usual logic to get the range of interest
    Set rng = [A2:C2]

    Set re = New RegExp

    re.Global = True
    re.IgnoreCase = True
    re.Pattern = "([a-z ]+[a-z])\s*\-\s*(\d+)\s*"
    For Each rw In rng.Rows
        ' remove line breaks and leading/trailing spaces
        Detail = Trim$(Replace(rw.Cells(1, 3).Value, Chr(10), vbNullString))

        If Not Detail Like "*#" Then
            ' Last item has no - #, so add -1
            Detail = Detail & "-1"
        End If

        ' Break up string
        If re.Test(Detail) Then
            Set rMC = re.Execute(Detail)
            For Each rM In rMC
                ' output Items and Qty's to Immediate window
                Debug.Print rM.SubMatches(0), rM.SubMatches(1)
            Next
        End If
    Next
End Sub

根据您的评论,我假设只有单元格中的 last 项可能缺少-#

示例输入

Apple Juice- 20 Grape -5
pear- 3Banana-2Orange

生成此输出

Apple Juice   20
Grape         5
pear          3
Banana        2
Orange        1