首页 > 解决方案 > 有没有办法根据包含 3 个特定字母的字符串复制一串字母和数字,所有这些字母都在 excel 的单个单元格中找到?

问题描述

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

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

有没有办法做到这一点?

工作注释字段中的长文本

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

标签: excelvbaexcel-formula

解决方案


这可以通过公式和访问来完成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]"))

在此处输入图像描述

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


您也可以决定通过 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 中正则表达式的介绍性文章。


在此处输入图像描述


推荐阅读