我有一个Excel电子表格,其中有一个列,每个单元格都填充有从数据库中剥离的数据页面。在每个单元格中,可以定义1或2个序列号。序列号的三种已知格式: 以YV开头,长度为10位。 以VNA开头,长度为8位。 以SVNA开头,长度为9位。 我需要将该列中每个序列号的每个副本提取到单独的单元格中。每个单元格中可能有0、1或2个序列号,并且复制的信息需要保留为空白,单个序列号或两个序列号之间用逗号和空格隔开(“ VNA1234A,VNAB4321 “)。
我没有任何代码可以建议,因为我在这方面看到的所有代码都是提取一个完整的已知单词,而不是提取基于几个字母的整个单词或短语。
有什么办法吗?
我想将图片中文本的序列号VNA3FB00复制到左侧的F单元中。如果还有另一个序列号,也要复制该序列号。
答案 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]"))
您可能需要根据数据的外观添加更多替换。
您还可以决定通过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中正则表达式的在线demo和this简介。