从单元格中提取长度恰好为 10 个字符且包含数字和字母的单词

sur*_*und 0 excel vba text-extraction excel-formula

正在寻找专家,希望有人能够帮助我。我有一个很长的联想产品清单,我正在寻找一种方法从中提取其产品编号。问题是该号码可能位于单元格的任何位置。首先,我们知道数字有 10 个字符长,它总是包含数字和字母,并且它们之间没有特殊字符。有时数字位于括号中或在其前后有一些特殊字符(例如 - _ " < 等)。我不需要它们,我正在寻找确切的 10 个字母或数字,并且其中至少有 1 个数字。在示例的最后一行中,有 2 个包含 10 个字符的单词 - THINKCENTRE 和 12Q6000AGE。THINKCENTRE 不包含数字,因此应将其排除。

输入 期望的结果
军团 T5 (90SV003WGE) 90SV003WGE
FLEX 5 (82R700BEGE) XKLUSIV 82R700BEGE
V17-IRU 83A2001NGE 83A2001NGE
联想 E16 G1 21JT000HGE_WIN 11 21JT000HGE
联想 THINKCENTRE M70T 12Q6000AGE I7-12 12Q6000年龄
IDEAPAD 3 17ALC6 0 或空

不确定这是否可以通过公式来实现,我尝试了不同的公式,但它给了我不同的结果。我设法找到一种方法来提取最长的单词,但通常这个数字不是最长的和/或包含大量需要清理的字符。

Jvd*_*vdV 5

起始假设:

  • 仅 10 个字符的子字符串;
  • 子字符串仅包含字符[A-Z0-9]
  • 至少包含一位数字[0-9]
  • 至少包含一个字符[A-Z]

达夫

您可以尝试将输入拆分为非字母数字的任何内容。这可以通过 doubleTEXTSPLIT()相当容易地实现。现在您可以使用一些布尔结构根据您的标准检查这些子字符串。例如:

在此输入图像描述

公式为B2

=MAP(A2:A8,LAMBDA(s,LET(i,SEQUENCE(36)-1,r,TEXTSPLIT(s,TEXTSPLIT(s,BASE(i,36),,1)),TEXTJOIN(", ",,REPT(r,ISERR(-r)*(TEXTBEFORE(r&0,i)<>r)*(LEN(r)=10))))))
Run Code Online (Sandbox Code Playgroud)

UDF

您还可以使用 UDF 应用一些正则表达式来提取与上面相同的内容:

Public Function RegexMatch(s As String) As String

Static RE As Object: If RE Is Nothing Then Set RE = CreateObject("vbscript.regexp")

RE.Pattern = "(?:\b|_)(?!\d+\b|[A-Z]+\b)([A-Z\d]{10})(?:\b|_)"
RE.Global = True

Set REMatches = RE.Execute(s)
If REMatches.Count > 0 Then
    For Each Match In REMatches
        If RegexMatch = "" Then
            RegexMatch = Match.Submatches(0)
        Else
            RegexMatch = RegexMatch & ", " & Match.Submatches(0)
        End If
    Next
Else
    RegexMatch = vbNullString
End If

End Function
Run Code Online (Sandbox Code Playgroud)

该模式的解释可以在这里找到

您可以使用以下方式调用 UDF:=RegexMatch(A2)或嵌入MAP(A2:A8,LAMBDA(s,RegexMatch(s)))结构中。

  • 该模式的解释确实很有帮助,谢天谢地,他们现在已经将自动化提升到了这一点^^。最好排除唯一的字母/数字,而不是每个字母/数字最少 1 个,其余的可以是或。一个小注释:`REMatches`需要声明为`Object`,`Match`声明为Variant(?)(通过这种方式得到结果,但不知道是否有更具体的声明)。 (2认同)