使用左,中,右功能在两个字符/单词之间提取文字?

时间:2016-12-28 02:05:08

标签: excel extract formula

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

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

有人可以告诉我一个更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我能够用辅助列来实现你想要的效果。

Spreadsheet Screenshot

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

enter image description here

Regex的最大优点是可扩展性。这可以适应内联公式在处理不规则数据方面遇到的麻烦。

此外,在上面的示例中,rx可能更适合作为全局。

要使用正则表达式,您必须在项目中添加对“Microsoft VBScript Regular Expressions 5.5”的引用。

enter image description here