这可以通过公式完成,但完全取决于您的 Excel 版本:
1) Excel 2016,您仍然可以使用公式:
B1中的公式:
=IFERROR(MID(A1,MAX((MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)="1")*(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),8)))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))+8,1))))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))-1,1))))*(ROW(A$1:INDEX(A:A,LEN(A1))))),8),"Nothing found")
注意:这是一个数组公式,需要通过CtrlShiftEnter确认
2) Excel 2019,使用CONCAT 和FILTERXML:
B1中的公式:
=IFERROR(FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)),MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1),"</s><s>"))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")
注意:这是一个数组公式,需要通过CtrlShiftEnter确认
3) Excel 365,使用前面提到的功能,但包括SEQUENCE:
B1中的公式:
=IFERROR(FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(--MID(A1,SEQUENCE(LEN(A1)),1)),MID(A1,SEQUENCE(LEN(A1)),1),"</s><s>"))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")
公式的XPATH 部分负责实际查询,查找以“1”开头且总长度为“8”的字符串。这甚至可以处理返回 '12345678' 之类的字符串,例如 'abc123456789abc12345678abc29876543'。
如果您喜欢FILTERXML 和XPATH,那么您可能会觉得this 很有趣。
4) VBA:如果您必须使用 VBA,我想 UDF 是一个不错的选择。比如:
Function GetStr(str As String, pat As String) As String
With CreateObject("vbscript.regexp")
.Pattern = pat
.Global = True
If .Test(str) = True Then
GetStr = .Execute(str)(0).Submatches(0)
Else
GetStr = "Nothing found"
End If
End With
End Function
您可以按照=GetStr(A1,"(?:^|\D)(1\d{7})(?:\D|$)") 在B1 中调用它。这是使用正则表达式。如果您有兴趣并想了解更多信息,那么this 对您来说是一本有趣的书。
我故意将模式留在 UDF 之外,您可能想要更改它。当前的模式可以在这个在线Demo 中看到,引擎将从左到右查找:
-
(?: - 第一个非捕获组
-
^|\D - 起始字符串 ancor 或除数字以外的任何内容。
-
) - 关闭第一个非捕获组。
-
( - 第一个捕获组。
-
1\d{7} - 搜索文字 1 后跟 7 位数字。
-
) - 关闭第一个捕获组。
-
(?: - 第二个非捕获组
-
\D|$ - 除数字或结束字符串 ancor 以外的任何内容。
-
) - 关闭第二个非捕获组。