【问题标题】:How to Determine Whether ALL of the words of a Substring are included, in any order, in a Mainstring?如何确定子字符串的所有单词是否以任何顺序包含在主字符串中?
【发布时间】:2017-10-09 23:36:16
【问题描述】:

如何使用 Excel 宏来确定子字符串的所有单词是否以任何顺序包含在主字符串中的真/假?例如,我想检查这个子字符串“ford F150”中的单词是否包含在主字符串“like new f150 ford black”中,它应该返回true。

我尝试了上面的代码示例,但它们不起作用。

我猜测这样做的方法是将子字符串拆分为一个数组,然后检查数组的每个元素是否在主字符串中。如果子字符串的所有元素都在主字符串中,则为真。

我正在使用 VBA 7.1。现在我的宏运行,但无论我搜索什么文本,它总是返回 TRUE。也许这是 InStr 比较方法的问题?也许在数组中存储字符串元素是个问题?这是我的宏:

Sub Macro 1()

Dim MainString As String
Dim SubString As String
Dim SubStringArray() As String
Dim bFound As Boolean

MainString = Cells(1, 1).Text
SubString = Cells(2, 1).Text
SubStringArray() = Split(SubString, " ")
bFound = False

For Each element In SubStringArray
    If InStr(MainString, element) <> 0 Then
    bFound = True
    Exit For
    End If
Next

Cells(1, 7) = bFound

End Sub

我还想确保我不会在“fording”中找到部分匹配项,例如“ford”。我只想检查完整的单词。

【问题讨论】:

  • 这就是您使用Option Explicit 的原因 - 这样未声明的变量(如elemement)就不会让您绊倒并浪费您的时间...
  • 您有一个检查,InStr(MainString, element) >= 0。如果 instr 返回 0,则表示未找到字符串。所以bfound永远都是真的。是这个问题吗?将条件更改为 InStr(MainString, element) >0 并尝试。
  • @Tim 我发现了这个拼写错误并修复了它。感谢您提供有关“选项显式”的提示。
  • @Valli 我尝试将其更改为“> 0”,但仍然得到相同的结果。请注意,如果在 Mainstring 中找不到 Substring,我相信 InStr 会返回错误...这就是为什么我认为 ">= 0" 甚至 " 0" 都可以正常工作。
  • 如果你想考虑单词边界,那么你需要做更多的工作,甚至可能使用正则表达式......

标签: arrays excel vba


【解决方案1】:

假设您说的非部分匹配是搜索文本两侧都有空格的任何内容(即您不想说 "ford" 应该与 " ford." 匹配)那么以下应该工作:

'Macro names cannot contain spaces
'Sub Macro 1()
Sub Macro1()

    Dim MainString As String
    Dim SubString As String
    Dim SubStringArray() As String
    Dim bFound As Boolean

    MainString = UCase(Cells(1, 1).Text) ' use a consistent case so that "F150"
    SubString = UCase(Cells(2, 1).Text)  ' will match "f150"
    SubStringArray() = Split(SubString, " ")
    bFound = True ' Start by assuming that everything will match

    For Each element In SubStringArray
        If InStr(" " & MainString & " ", " " & element & " ") = 0 Then
            'Exit if we have found something that doesn't match
            bFound = False
            Exit For
        End If
    Next

    Cells(1, 7) = bFound

End Sub

【讨论】:

  • 问题:如果我想检查子字符串是否存在于主字符串中,并且子字符串单词以任何顺序排列并且单词彼此相邻,我将如何修改它?例如,“F150 Green”或“Green F150”都可以在“New Green F150 Sale”中找到,但两者都不会在“Green New F150”中找到。
  • @msch382 你会很困难地改变它!一般来说,我想不出任何简单的方法。如果您的子字符串已知只有 2 个单词,那么我只会做一个 Instr(mainstring, SubStringArray(0) &amp; " " &amp; SubStringArray(1)) &gt; 0 Or Instr(mainstring, SubStringArray(1) &amp; " " &amp; SubStringArray(0)) &gt; 0,但是一旦您有超过 2 个子字符串,潜在匹配的数量就会非常非常快地增加。
  • 如果您可以将主字符串拆分为“单词”,那么它可能是可行的(例如,用空格替换所有标点符号,然后按空格拆分并过滤数组以删除空元素)。然后找到每个搜索词的位置,并检查位置是否按顺序排列。
猜你喜欢
  • 2019-06-11
  • 2015-03-25
  • 2016-02-24
  • 1970-01-01
  • 2021-09-02
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多