我在Excel中有这些数据:
但我的一位客户需要详细总结每个项目 所以上面的数据需要转换为:
这样,客户可以按照跟踪和每个项目进行分析 由于手动输入,因此文本格式不一致 有些用户使用 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 操作,可能还有另外一种方法。
我很感激任何可以指出我可能更好解决方案的想法。 />
答案 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