有没有一种方法可以根据包含3个特定字母的字符串复制字母和数字字符串,而这些字符串都可以在excel的单个单元格中找到?

时间:2020-07-06 11:28:20

标签: excel vba excel-formula

我有一个Excel电子表格,其中有一个列,每个单元格都填充有从数据库中剥离的数据页面。在每个单元格中,可以定义1或2个序列号。序列号的三种已知格式: 以YV开头,长度为10位。 以VNA开头,长度为8位。 以SVNA开头,长度为9位。 我需要将该列中每个序列号的每个副本提取到单独的单元格中。每个单元格中可能有0、1或2个序列号,并且复制的信息需要保留为空白,单个序列号或两个序列号之间用逗号和空格隔开(“ VNA1234A,VNAB4321 “)。

我没有任何代码可以建议,因为我在这方面看到的所有代码都是提取一个完整的已知单词,而不是提取基于几个字母的整个单词或短语。

有什么办法吗?

Long text in work notes field

我想将图片中文本的序列号VNA3FB00复制到左侧的F单元中。如果还有另一个序列号,也要复制该序列号。

1 个答案:

答案 0 :(得分:2)

这可以通过公式并访问TEXTJOIN(在O365和Excel 2019中可用)来完成。在F2中,公式:

=TEXTJOIN(", ",,FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(G1,":"," "),","," "),"."," "),";"," ")," ","</s><s>")&"</s></t>","//s[starts-with(., 'YV') and string-length(.) =10 or starts-with(., 'VNA') and string-length(.) =8 or starts-with(., 'SVNA') and string-length(.) =9]"))

enter image description here

您可能需要根据数据的外观添加更多替换。


您还可以决定通过VBA使用UDF。也许遵循以下原则:

Function REGEX(str As String, pat As String) As String

With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = pat
    If .Test(str) = True Then
        For Each Mtch In .Execute(str)
            If REGEX = "" Then
                REGEX = Mtch
            Else
                REGEX = REGEX & ", " & Mtch
            End If
        Next
    End If
End With

End Function

您可以通过以下方式在F2中调用此函数:

=REGEX(G2,"\b(?:YV[^\W_]{8}|S?VNA[^\W_]{5})\b")

如果要排除小写字母,您可能希望将[^\W_]换成[A-Z0-9]

如果您不熟悉正则表达式,请查看VBA中正则表达式的在线demothis简介。


enter image description here