【问题标题】:How to count length of a word from a sentence and print the word(s) in the cell?如何计算句子中单词的长度并打印单元格中的单词?
【发布时间】:2021-01-11 08:48:38
【问题描述】:

我想创建一个函数,从一个句子中提取所有长度 = 2 的单词。例如,如果句子是“The Cat is brown”,我希望单元格中的结果是“is”。如果有多个长度 = 2 的单词,我也想保留这些单词。我尝试过 MID、RIGHT、LEFT 等。这些都不起作用,因为单词的位置并不总是相同。

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

谢谢

【问题讨论】:

  • 对我来说最简单的方法是遍历单元格中的所有字符。如果有多个 2 个字母的单词,您希望它如何返回?例如is, be, on
  • 使用 find() 查找空格并计算出它们之间的区别。然后可以使用 mid() 等。切碎文本的一个很好的练习。提示:使用 find() 查找第一个空格,然后查找第二个...
  • 更具体地说,它们是我想提取的句子中的国家/地区缩写 :-) 我会将它们与所有国家/地区缩写的列匹配,因此分隔符无关紧要
  • 您能否分享一个数据样本和预期结果。分享您的代码可能有助于我们理解。您是否会考虑标点符号问题,即如果不考虑,UK 可能无法在Are you from the UK? 中找到。此外,正如 Simon 已经问过的,您将如何返回多个结果?在数组中,多个单元格,分隔的“列表”或...?
  • 我们不需要数据本身,只需一个具有预期结果的适当样本就可以了。您的预期结果是:This is a name, address, PA US.。此外,您的数据是否总是以逗号分隔,感兴趣的数据是否总是在最后一个逗号后面?更具体地说,最后一个逗号后面是否只有两个字母单词?

标签: excel vba count word sentence


【解决方案1】:

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

=ExtractWords(Cell to check, Optional number of letters)

默认情况下,它会检查 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

可能还有其他可能更容易或更有效的方法。这只是我想出来的。

【讨论】:

  • 请注意,我是在所有 cmets 都在您的帖子下制作之前制作的。它不应该真正改变任何东西,并且应该仍然适用于你正在做的事情。
  • 嘿,谢谢!我尝试将分隔符更改为 & " " & 因为没有涉及特殊字符并输入 =ExtractWords(J8;2),但它给了我一个空白的答案。我可以在下面发布到目前为止的内容。
  • 更改为一个空格应该可以正常工作。即FullString = FullString &amp; " " &amp; CurrentString。你能把J8的值给我看看吗?
  • 单元格 J8 的值为:“公司名称#Head Office#City, Virginia US”
  • @emilk 解决了这个问题。
【解决方案2】:

出现双大写

  • 在 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

【讨论】:

  • 嘿,谢谢!这确实有效。但是,句子中的每个字母都是大写字母(对不起,不清楚)。因此,代码将打印句子中的每一对字母,而不是提取 LEN(substring)=2
  • 那么你别无选择,只能用space 分割字符串,并检查每个元素是否包含两个字符。像西蒙所做的那样。在Split 之前,可能使用Replace 来表示可能不会被拆分“覆盖”的标点符号或其他字符。 Trim 也可能派上用场。
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 2018-01-21
  • 2021-11-03
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多