我有一个excel电子表格,其中有一个列,每个单元格都填充了从数据库中删除的数据页。在每个单元中,可以定义1或2个序列号。有三种已知的序列号格式:从YV开始,有10位长。从VNA开始,有8位长。从SVNA开始,有9位长。我需要把那列中每一个序列号的每一份拷贝都提取到一个单独的牢房里。每个单元格中可能有0、1或2个序列号,复制的信息需要保留为空白,保留单个序列号,或留下由逗号和空格分隔的2个序列号("VNA1234A,VNAB4321")。
我没有任何代码可以暗示,因为我在这方面看到的所有代码都是提取一个完整的已知单词,而不是一个基于几个字母的完整单词或短语。
有什么办法可以做到吗?

我想把图片文本中的序列号VNA3FB00复制到左边的F单元格中。如果还有另外一个序列号,也要把它复制一下。
发布于 2020-07-06 12:16:34
这可以通过一个公式和对TEXTJOIN的访问来完成(可在O365和Excel2019中找到)。在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中regex上的在线演示和这介绍。

https://stackoverflow.com/questions/62755073
复制相似问题