我在工作表中有以下数据:
column A
431620121601 5201585 - 0006 Fresh Turkey Gravy 500g 27 -Cartons 27 162
431619121602 5204059 - 0006 Fresh Bread Sauce 300g 52 -Palettes 52 312
我想从文本中获取纸箱或调色板的数量,并将其放在B列
中Column B
27 Cartons
52 Palettes
这是我到目前为止所尝试的内容:
=MID(A8,SEARCH(" ",A8)+12,SEARCH("-Cartons",A8)-SEARCH(" ",A8)-4)
但这给了我这个:
06 Fresh Turkey Gravy 500g 27 -Cartons
有人可以告诉我一个更好的方法吗?
答案 0 :(得分:1)
我能够用辅助列来实现你想要的效果。
Col我列出了所有可能的类型,如纸箱,调色板等。
然后我用这些公式得到结果
查找匹配类型的索引。此公式将作为数组公式输入,即键入公式并按 Ctrl Shift Enter
B2 =SUMPRODUCT(--IFERROR(IF(FIND($I$2:$I$4,A2)>0,TRUE,FALSE),FALSE)*ROW($I$2:$I$4))
获取匹配的类型
C2 =INDEX($I$1:$I$7,B2)
获取结束字符串
D2 =RIGHT(A2,LEN(A2)-FIND(C2,A2)+1)
获取最后一个号码
E2 =SUBSTITUTE(RIGHT(SUBSTITUTE(D2," ",REPT(" ",50)),50)," ","")
将最后一个数字和Type替换为空白,并在末尾添加Type
F2 =TRIM(SUBSTITUTE(SUBSTITUTE(D2,E2,""),C2,"")) & " " & C2
为数据的每一行向下拖动所有公式。请注意第I栏。
答案 1 :(得分:0)
我知道UDF可能看起来有些过分,但我非常喜欢正则表达式,我希望它们在VBA社区中更像是主流,就像它们在许多其他技术中一样。
因此,考虑到这一点,这是针对您的问题的正则表达式解决方案:
Function UNITS(InputText As String) As String
Dim rx As New RegExp
Dim match As MatchCollection
rx.Pattern = "(\d+ )-([A-Za-z]+)"
If rx.Test(InputText) Then
Set match = rx.Execute(InputText)
UNITS = match(0).SubMatches(0) & match(0).SubMatches(1)
End If
End Function
Regex的最大优点是可扩展性。这可以适应内联公式在处理不规则数据方面遇到的麻烦。
此外,在上面的示例中,rx
可能更适合作为全局。
要使用正则表达式,您必须在项目中添加对“Microsoft VBScript Regular Expressions 5.5”的引用。