根据不同的标准提取子string,并将提取的string放在同一行的另一个单元格中

我有一个Excel文件,其中有一列包含特定的string。 这个string不遵循任何特定的模式。 我的要求是提取一个子string(product id),它是一组8个连续的数字,必须在任何字符之前/之后,或者必须在string的开始或结尾

以下是一些例子

情况1:

产品ID前面是#

Id#53298632 / BS TVR:003519

在excel中使用的函数

=MID(N88,FIND("#",N88)+1,8)

*结果:53298632 *

情景2:

产品ID是在开始

53298632:003519

在excel中使用的函数

=MID(A1,1,8)

*结果:53298632 *

起初,我只能处理情况1,因此使用了指定的公式。 现在一天,string没有遵循任何特定的模式,但我的产品ID仍然是作为8位连续数字。 我寻找一个合适的解决scheme,并find了这个公式(我不明白)。

=LOOKUP(10^8,MID(N132,ROW(INDIRECT("1:"&LEN(N132)-7)),8)+0)

这在大多数情况下都有效,但在某些情况下却失败了

例如

Pdr#53298632 /数量NOS 1031949

这里的结果是1031949这绝对不是我想要的。 结果应该是53298632

请帮我解决这个问题。 这可以使用VBAmacros来完成吗? 我对这样的excel函数VBA和macros是完全陌生的。

任何帮助将不胜感激!

提前致谢。

如果您很乐意将Microsoft RegEx模块专门包含到您的Excel项目中,则正则expression式将相当快地解决此问题。

要添加RegEx函数以在Excelmacros中使用,请在Excel中select“开发人员”菜单,然后启动Visual Basic编辑器。 在VBA for Applications窗口中,selectTools-> References并selectMicrosoft VBScript Regular Expressions 5.5。

为您的VBAProject创build一个新模块(在项目树中右键单击您的Excel文件名,然后单击插入 – >模块)

双击新创build的模块(在项目树中)并在Module1(Code)窗口中input以下代码:

 Public Function getProductCode(source As String) As String Dim strPattern As String: strPattern = "(\d{8})" Dim result As String: result = "" Dim results As Object Dim regEx As New RegExp With regEx .Global = True .MultiLine = False .IgnoreCase = False .Pattern = strPattern End With If regEx.Test(source) Then Set results = regEx.Execute(source) If (results.Count <> 0) Then result = results.Item(0) End If End If getProductCode = result End Function 

从Excel中的相关单元中,您现在可以调用macros:

 =getProductCode(A1) 

我想你也可以修改原来的公式来获得一个8位数字的第一个匹配

 =MID(A1,MATCH(TRUE,ISNUMBER(MID(A1,ROW(INDIRECT("1:"&LEN(A1)-7)),8)+0),0),8) 

(必须使用Ctrl Shift Enter作为数组公式input )。