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