Excel 如何从句子中计算单词的长度并在单元格中打印单词?

Excel 如何从句子中计算单词的长度并在单元格中打印单词?,excel,vba,count,word,sentence,Excel,Vba,Count,Word,Sentence,我想做一个函数,从一个句子中提取所有长度为2的单词。例如,如果句子是“猫是棕色的”,我希望单元格中的结果是“是”。如果有多个单词的长度为2,我也希望保留这些单词。我试过中、右、左等。这些都不起作用,因为单词的位置并不总是相同的 我不知道如何在VBA中执行此操作,欢迎提供任何建议:) 谢谢我为您制作了一个UDF,它应该能满足您的需求。你这样使用它: =提取字(要检查的单元格,可选字母数) 默认情况下,它将检查2个字母的单词,但您可以如上所示进行指定 这是代码。将其放入模块中 Function Ex

我想做一个函数,从一个句子中提取所有长度为2的单词。例如,如果句子是“猫是棕色的”,我希望单元格中的结果是“是”。如果有多个单词的长度为2,我也希望保留这些单词。我试过中、右、左等。这些都不起作用,因为单词的位置并不总是相同的

我不知道如何在VBA中执行此操作,欢迎提供任何建议:)


谢谢

我为您制作了一个UDF,它应该能满足您的需求。你这样使用它:

=提取字(要检查的单元格,可选字母数)

默认情况下,它将检查2个字母的单词,但您可以如上所示进行指定

这是代码。将其放入模块中

Function ExtractWords(Cell As Range, Optional NumOfLetters As Integer)

Dim r As String, i As Long, CurrentString As String, FullString As String, m As String

If NumOfLetters = 0 Then NumOfLetters = 2

r = Cell.Value

For i = 1 To Len(r)
    m = Mid(r, i, 1)
    If Asc(UCase(m)) >= 65 And Asc(UCase(m)) <= 90 Or m = "-" Or m = "'" Then 'Accepts hyphen or single quote as part of the word
        CurrentString = CurrentString & m
        If i = Len(r) Then GoTo CheckLastWord
    Else
CheckLastWord:
        If Len(CurrentString) = NumOfLetters Then
            If FullString = "" Then
                FullString = CurrentString
            Else
                FullString = FullString & " " & CurrentString 'Change space if want another delimiter
            End If
        End If
        CurrentString = ""
    End If
Next i

If FullString = "" Then
    ExtractWords = "N/A" 'If no words are found to contain the length required
Else
    ExtractWords = FullString
End If

End Function
函数提取字(单元格作为范围,可选数字字母作为整数)
Dim r为字符串,i为长字符串,CurrentString为字符串,FullString为字符串,m为字符串
如果NumOfLetters=0,则NumOfLetters=2
r=单元值
对于i=1到Len(r)
m=中间(r,i,1)
如果Asc(UCase(m))>=65且Asc(UCase(m))出现双大写
  • 在Excel中,您可以这样使用它:

    =getDUC(A1)
    =getDUC(A1," ")
    =getDUC(A1,",")
    =getDUC(A1,"-")
    
代码

Option Explicit

' In Excel:
Function getDUC( _
    ByVal s As String, _
    Optional ByVal Delimiter As String = ", ") _
As String
    Dim arr As Variant
    arr = DoubleUCaseToArray(s)
    getDUC = Join(arr, Delimiter)
End Function

' In VBA:
Sub testDoubleUCaseToArray()
    Dim CCodes As Variant: CCodes = Array("US,UKUs", "UkUS,UK", "kUSUKsUK")
    Dim arr As Variant
    Dim n As Long
    For n = LBound(CCodes) To UBound(CCodes)
        arr = DoubleUCaseToArray(CCodes(n))
        Debug.Print Join(arr, ",")
    Next n
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Purpose:      From a specified string, returns all unique double upper case
'               occurrences in a 1D (zero-based) array.
' Remarks:      From the string 'USUk' it returns only 'US' (not `SU`).
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function DoubleUCaseToArray( _
    ByVal s As String) _
As Variant
    If Len(s) > 1 Then
        With CreateObject("Scripting.Dictionary")
            Dim cFirst As String * 1
            Dim cSecond As String * 1
            Dim n As Long
            For n = 1 To Len(s) - 1
                cFirst = Mid(s, n, 1)
                If cFirst Like "[A-Z]" Then
                    cSecond = Mid(s, n + 1, 1)
                    If cSecond Like "[A-Z]" Then
                        .Item(cFirst & cSecond) = Empty
                    End If
                    n = n + 1
                End If
            Next n
            If .Count > 0 Then
                DoubleUCaseToArray = .Keys
            End If
        End With
    End If
End Function

对我来说,最简单的方法就是遍历单元格中的所有字符。如果有多个两个字母的单词,您希望它如何返回?例如
is,be,on
使用find()查找空格并计算它们之间的差异。然后可以使用mid()等。切碎文本片段的好练习。提示:使用find()查找第一个空格,然后是第二个空格…更具体地说,它们是我想提取出来的句子中的国家缩写:-)我将把它们与所有国家缩写匹配到一列,因此分隔符不重要。您可以共享数据样本和预期结果吗。共享您的代码可能有助于我们理解。你会考虑标点问题吗?如果不考虑,<代码>英国<代码>可能在<代码>中找不到。你是从英国来的吗?< /代码>。另外,正如Simon已经问过的,您将如何返回多个结果?在一个数组中,多个单元格、分隔的“列表”或…?我们不需要数据,只要一个具有预期结果的适当样本就好了。您的预期结果是什么:
这是一个姓名、地址和地址。
。另外,您的数据是否总是以逗号分隔,并且感兴趣的数据是否总是位于最后一个逗号之后?更具体地说,你会在最后一个逗号后面只留下两个字母的单词吗?请注意,我是在你的帖子下发表所有评论之前写的。它不应该真正改变任何事情,并且应该仍然适用于你正在做的事情。嘿,谢谢!我尝试将分隔符更改为&“”,因为没有涉及特殊字符并键入=ExtractWords(J8;2),但它给出了一个空白答案。我可以在下面发布到目前为止我所拥有的。改成一个空间应该很好。ie
FullString=FullString&&CurrentString
。你能给我J8的值让我看看吗?J8单元格的值是:“公司名称#总部#美国弗吉尼亚州城市”@emilk解决了这个问题。嘿,谢谢!这确实起作用。然而,句子中的每个字母都是大写字母(很抱歉不清楚)。因此,代码将打印句子中的每一对字母,而不是提取LEN(substring)=2。因此,您别无选择,只能将字符串拆分为
空格
,并检查每个元素是否包含两个字符。就像西蒙那样。在
拆分
之前,可以使用
替换
来替换可能未被拆分“覆盖”的标点符号或其他字符<代码>修剪
也可能派上用场。