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

Vba 如何使用非统一分隔符分解文本?,vba,excel,split,Vba,Excel,Split,我在Excel中有以下数据: 但我的一位客户需要详细总结每一项。 因此,上述数据需要转换为: 通过这种方式,客户可以对每个跟踪和每个项目进行分析。 文本格式并不统一,因为它是手动输入的。 有些用户使用Alt+Enter分隔项目。有些人使用空间,有些人根本不介意分开。但一致的是,他们将连字符(-)放在项目后面,然后是计数(虽然不总是跟在数字后面,但中间可能有空格)。此外,如果该物品的数量为一(1),他们根本就不会费心放它(如苹果汁追踪IDU3004所示) 我尝试的唯一功能是拆分功能,它使我更接

我在Excel中有以下数据:

但我的一位客户需要详细总结每一项。
因此,上述数据需要转换为:

通过这种方式,客户可以对每个跟踪和每个项目进行分析。
文本格式并不统一,因为它是手动输入的。
有些用户使用Alt+Enter分隔项目。有些人使用空间,有些人根本不介意分开。但一致的是,他们将连字符(-)放在项目后面,然后是计数(虽然不总是跟在数字后面,但中间可能有空格)。此外,如果该物品的数量为一(1),他们根本就不会费心放它(如苹果汁追踪IDU3004所示)

我尝试的唯一功能是拆分功能,它使我更接近我想要的功能。
但是,我仍然很难将单个数组元素分离为我所期望的内容。
因此,例如,上面使用拆分后的IDU3001将是:

arr(0)=“苹果” arr(1)=“20葡萄” arr(2)=“5”&Chr(10)和“Pear”~~>仅显示Alt+Enter arr(3)=“3香蕉” arr(4)=“2” 当然,我可以想出一个函数来处理每个元素以提取数字和项目。
实际上,我正在考虑只使用该函数,并完全跳过拆分操作。
我只是好奇,既然我对文本操作不太精通,也许还有其他方法可以解决这个问题。
如果有任何想法能为我找到更好的解决方案,我将不胜感激。

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

这是一个基于您的示例数据的演示

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
根据您的评论,我假设单元格中只有最后一项可能缺少
-#

样本输入

Apple Juice- 20 Grape -5
pear- 3Banana-2Orange
生成此输出

Apple Juice   20
Grape         5
pear          3
Banana        2
Orange        1

一般来说,这看起来是正则表达式的一个很好的候选者。但我发现了一个问题:混合使用多个单词的名称,而不使用数字(计数为1)。例如是苹果馅饼-21Apple和2Pies,还是两个苹果馅饼s?@chrisneilsen是的。虽然该项目通常是最后输入的项目,但仍将违反规则。
Apple Juice   20
Grape         5
pear          3
Banana        2
Orange        1