使用左,中,右函数来提取两个字符/单词之间的文本?

我在工作表中有以下数据:

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”的引用添加到您的项目。

在这里输入图像说明