如何查找数组是否包含字符串

Nic*_*a-V 53 arrays vba substring

可能重复:
如何在MS Access VBA阵列中搜索字符串

我目前正在研究一个Excel宏,我找不到一种方法 if array.contains(mystring)

我写了以下内容,它给了我"Invaild Qualifier"的信息,并在Mainfram之后突出显示If

Dim Mainfram(4) As String

Mainfram(0) = "apple"

Mainfram(1) = "pear"

Mainfram(2) = "orange"

Mainfram(3) = "fruit"

    For Each cel In Selection
        If Mainfram.Contains(cel.Text) Then
            Row(cel.Row).Style = "Accent1"
        End If
    Next cel
Run Code Online (Sandbox Code Playgroud)

选择是一列

有人帮吗?

嗨,JP我尝试了你的建议,并说它需要对象.并突出显示 If IsInArray(cell.Text,Mainfram)然后继承 我的完整代码

Sub changeRowColor()

Columns("B:B").Select

Dim cel As Excel.Range
Dim Mainfram(4) As String

Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "Banana"

For Each cel In Selection
    If IsInArray(cell.Value, Mainfram) Then
        Rows(cel.Row).Style = "Accent1"
    End If
Next cel

End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean

    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)

End Function
Run Code Online (Sandbox Code Playgroud)

没关系,我发现那个愚蠢的错误......谢谢你

Jim*_*ena 130

使用我的答案中的代码来解决一个非常相似的问题:

Sub DoSomething()
Dim Mainfram(4) As String
Dim cell As Excel.Range

Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "fruit"

For Each cell In Selection
  If IsInArray(cell.Value, MainFram) Then
    Row(cell.Row).Style = "Accent1"
  End If
Next cell

End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Run Code Online (Sandbox Code Playgroud)

  • 这只查找包含文本stringToBeFound的所有数组元素,并不完全等于它.因此,对于包含键"e","绝对","最终"等的数组,IsInArray("e",arr)将返回true. (28认同)
  • 这不是一个好的解决方案.这样,如果你查找"p"而不是整个单词,它返回TRUE. (9认同)
  • 这种方法也很慢.请参阅加入答案下的评论以查看测试结果. (2认同)

Sid*_*out 17

使用JOIN和的另一种简单方法INSTR

Sub Sample()
    Dim Mainfram(4) As String, strg As String
    Dim cel As Range
    Dim Delim As String

    Delim = "#"

    Mainfram(0) = "apple"
    Mainfram(1) = "pear"
    Mainfram(2) = "orange"
    Mainfram(3) = "fruit"

    strg = Join(Mainfram, Delim)
    strg = Delim & strg

    For Each cel In Selection
        If InStr(1, strg, Delim & cel.Value & Delim, vbTextCompare) Then _
        Rows(cel.Row).Style = "Accent1"
    Next cel
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 再次同意你的意见.这取决于分隔符的选择.BTW`#这是我的€*@£!%&*分隔符!#`是一个很好的分隔符.细胞有什么机会:-D (4认同)
  • 此方法比使用Filter的接受答案快得多.我使用随机的10个单词进行了两次测试,每次10,000,000次迭代.JOIN方法花了7秒,而FILTER方法花了38秒. (3认同)
  • 是的,但是如果查找的字符串恰好包含用作任意分隔符的字符(“#”或选择的任何字符),则这可能会失败。 (2认同)
  • 搜索“fruit”时,您的代码将失败,因为字符串末尾没有 Delim。将 Delim 放在绳子的两侧。否则,这是一个比已接受的答案更好的答案,我将在下一条评论中解释。 (2认同)

Eko*_*tin 5

使用 Filter() 方法,如下所示 - https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/filter-function

  • @EkoostikMartin 实际上,我会说答案是“是”。尽管它是 MSDN 文档,但最好将该页面中的“相关”内容复制并粘贴到您的答案中,然后包含链接以供参考。甚至 MSDN URL 也会被破坏,尽管很少。此外,除非想要更多信息,否则不需要访问另一个网站也很好。同样,能够比较不同的答案也很好,如果它们都在这里,在一个网页上一起比较容易。 (12认同)
  • 好答案。一个代码示例会让它变得更好! (10认同)
  • 我同意,粘贴代码会更好。Feral Oink 作为一个观点,但如果他们可以简单地查看这篇文章中的代码而不需要遵循另一个链接,那么它也可以节省每个人的下游时间。一个人多花几秒钟,可以为很多人节省同样多的时间。有人为孩子着想! (3认同)
  • [仅包含链接的答案真的是“好答案”吗?](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)大多数人的意见似乎是“不”。 (2认同)
  • 因此,如果我从链接中复制/粘贴示例,我的答案会更好吗?该链接包含一个确切的示例,OP 可以在其代码中逐字使用该示例来实现其目标。 (2认同)