利用Excel函数提取大写单词

利用Excel函数提取大写单词,excel,regex,vba,Excel,Regex,Vba,我将供应商名称和产品名称作为字符串放在一个单元格中。 每个单元格都有一个全大写的单词(有时带有数字或数字) 资料 我需要提取 3LAB抗衰老油30ml 3实验室 3LAB Aqua BB SPF40#1 14g 3实验室 3实验室样品完美颈部霜6ml 3实验室 3实验室样本Super h“血清Super抗衰老血清3ml” 3实验室 3LAB TTTTT完美面膜提升紧致增白剂28ml 3实验室 3.用50毫升的面霜 3实验室 3LAB检测血清40ml 3实验室 4711 Acqua Coloni

我将供应商名称和产品名称作为字符串放在一个单元格中。
每个单元格都有一个全大写的单词(有时带有数字或数字)

资料 我需要提取 3LAB抗衰老油30ml 3实验室 3LAB Aqua BB SPF40#1 14g 3实验室 3实验室样品完美颈部霜6ml 3实验室 3实验室样本Super h“血清Super抗衰老血清3ml” 3实验室 3LAB TTTTT完美面膜提升紧致增白剂28ml 3实验室 3.用50毫升的面霜 3实验室 3LAB检测血清40ml 3实验室 4711 Acqua Colonia爱尔兰浓烈花坛EDC喷雾170ml EDC 4711 Acqua Colonia喜马拉雅EDC喷雾剂50米浓烈纯正啤酒 EDC
不要使用定制的UDF,而是尝试利用Excel通过内置功能提供的功能,例如

B1
中使用的公式:

=FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[.*0!=0][translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789','')='']")
=FILTERXML(“&SUBSTITUTE(A1,”,“”)和“//s[*0!=0][translate(,'abcdefghijklmnopqrstuvwxyz012456789','')=”)
如果您使用的是Microsoft365,请在函数前面添加一个
@
,例如:
=@FILTERXML()…
,或者添加
[1]
作为第三个xpath表达式,告诉函数只返回符合前面两个规则的第一个节点

我们来分析一下公式:

  • FILTERXML()
    -我们可以利用此函数“拆分”特定分隔符上的字符串,在本例中为空格
  • “”&SUBSTITUTE(A1,“,”)和“
    ”-这里是我们创建开始/结束标记的父子结构的部分;一个有效的XML字符串
  • //s
    -在
    FILTERXML()的第二个参数中,我们启动一个有效的xpath表达式。我们希望所有s节点(t节点的childres)符合以下两个规则:
    
    • [.*0!=0]
      -选择与零相乘时与零不相同的所有节点。这意味着我们不希望返回纯数字子字符串
    • [translate(,'abcdefghijklmnopqrstuvwxyz012456789','')=''
      -当我们
      translate()
      将此函数的第二个参数中提到的所有字符都转换为nothing时,结果也应该为nothing,这意味着节点仅由大写字母字符和数字组成

您可以找到关于
FILTERXML()
在提取特定子字符串时如何工作的更深入的解释。快乐编码!

代替定制的自定义项,尝试利用Excel通过内置功能提供的功能,例如
FILTERXML()

B1
中使用的公式:

=FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[.*0!=0][translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789','')='']")
=FILTERXML(“&SUBSTITUTE(A1,”,“”)和“//s[*0!=0][translate(,'abcdefghijklmnopqrstuvwxyz012456789','')=”)
如果您使用的是Microsoft365,请在函数前面添加一个
@
,例如:
=@FILTERXML()…
,或者添加
[1]
作为第三个xpath表达式,告诉函数只返回符合前面两个规则的第一个节点

我们来分析一下公式:

  • FILTERXML()
    -我们可以利用此函数“拆分”特定分隔符上的字符串,在本例中为空格
  • “”&SUBSTITUTE(A1,“,”)和“
    ”-这里是我们创建开始/结束标记的父子结构的部分;一个有效的XML字符串
  • //s
    -在
    FILTERXML()的第二个参数中,我们启动一个有效的xpath表达式。我们希望所有s节点(t节点的childres)符合以下两个规则:
    
    • [.*0!=0]
      -选择与零相乘时与零不相同的所有节点。这意味着我们不希望返回纯数字子字符串
    • [translate(,'abcdefghijklmnopqrstuvwxyz012456789','')=''
      -当我们
      translate()
      将此函数的第二个参数中提到的所有字符都转换为nothing时,结果也应该为nothing,这意味着节点仅由大写字母字符和数字组成

可以找到更深入的解释,说明当您要提取特定子字符串时,
FILTERXML()
是如何工作的。快乐编码!

如何:将文本拆分为单词,如果每个单词都是数字,则忽略它;如果它与大写版本相同,则返回它:

Public Function UpperCaseWords(S As String) As String
    Dim i As Long
    Dim word As String
    Dim words() As String
    
    words = Split(S, " ")
    
    For i = 0 To UBound(words)
        word = words(i)
        If Not IsNumeric(word) And word = UCase$(word) Then
            UpperCaseWords = word
            Exit Function
        End If
    Next
End Function

如何:将文本拆分为单词,对于每个单词,如果其数字相同,则忽略它;如果其大小写相同,则返回它:

Public Function UpperCaseWords(S As String) As String
    Dim i As Long
    Dim word As String
    Dim words() As String
    
    words = Split(S, " ")
    
    For i = 0 To UBound(words)
        word = words(i)
        If Not IsNumeric(word) And word = UCase$(word) Then
            UpperCaseWords = word
            Exit Function
        End If
    Next
End Function

你能解释一下公式中的
,因为我不理解这些XML标记。这是一个快速的公式吗?因为我有超过250000行需要运行它。你也能解释一下你是如何创建这个
”//s[.*0!=0][translate(,'abcdefghijjklmnopqrstuvxyzo123456789','')=']“
??@michalroesler。希望编辑后的答案有帮助。您能解释一下公式中的
,因为我不理解这些XML标记。这是一个快速公式吗?因为我有超过250000行需要运行它。您还可以解释一下如何创建这个
“//s[.*0!=0][translate(,'abcdefghijklmnopqrstuvwxyz012456789','')=''”
??@michalroesler。希望编辑后的答案能有所帮助。可惜我不能同时接受这两个答案。谢谢你的makro@Alex。确保我会用它。可惜我不能同时接受这两个答案。谢谢你的makro@Alex。我一定要用它。