使用左,中,右函数来提取两个字符/单词之间的文本?
我在工作表中有以下数据:
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
请有人给我看一个更好的方法来做到这一点?
我能够实现你想要的,但与辅助列。
Col I有所有可能的types,如纸箱,调色板等
然后我用这些公式来得到结果
find什么types匹配的索引。 此公式将作为数组公式input,即input公式,然后按Ctrl Shift Enter
B2 =SUMPRODUCT(--IFERROR(IF(FIND($I$2:$I$4,A2)>0,TRUE,FALSE),FALSE)*ROW($I$2:$I$4))
获取types匹配
C2 =INDEX($I$1:$I$7,B2)
获取结束string
D2 =RIGHT(A2,LEN(A2)-FIND(C2,A2)+1)
获取最后一个号码
E2 =SUBSTITUTE(RIGHT(SUBSTITUTE(D2," ",REPT(" ",50)),50)," ","")
将最后一个数字和Typereplace为空白,并在末尾添加Type
F2 =TRIM(SUBSTITUTE(SUBSTITUTE(D2,E2,""),C2,"")) & " " & C2
将所有公式向下拖动到数据的每一行。 记下第一列。
我知道一个UDF可能看起来有点过分,但是我是正则expression式的狂热粉丝,我希望他们在VBA社区中更像其他技术一样更加主stream。
所以,考虑到这一点,这是一个正则expression式解决您的问题:
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
可能更适合作为全局。
要使用正则expression式,您必须将“Microsoft VBScript正则expression式5.5”的引用添加到您的项目。