使用Excel VBA检查数组中是否存在值

Ryf*_*lex 11 arrays excel vba excel-vba

我在下面有一些代码,应该检查一个值是否在数组中.

Sub test()
    vars1 = Array("Examples")
    vars2 = Array("Example")
    If IsInArray(Range("A1").Value, vars1) Then
        x = 1
    End If

    If IsInArray(Range("A1").Value, vars2) Then
        x = 1
    End If
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)

如果单元格A1中包含单词Examples出于某种原因两者的IsInArray检测为现有两个数组时,它应该只找到它存在的在vars1

我需要更改什么才能使我的IsInArray功能完全匹配?

Bra*_*rad 20

你可以这样强行:

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    Dim i
    For i = LBound(arr) To UBound(arr)
        If arr(i) = stringToBeFound Then
            IsInArray = True
            Exit Function
        End If
    Next i
    IsInArray = False

End Function
Run Code Online (Sandbox Code Playgroud)

用得像

IsInArray("example", Array("example", "someother text", "more things", "and another"))
Run Code Online (Sandbox Code Playgroud)

  • @Ryflex @Slai可能有点晚了,但是我想澄清一下,使用`Match()`函数实际上比仅迭代(循环)遍历数组要慢得多。我用大小为2000的数组进行了测试。循环遍历数组的最坏情况是寻找最后一项(索引为2000)。在对Match()函数和循环进行5000次调用之后,Match()的总时间为3.746094,但循环遍历数组的时间仅为1.667969。[检查此问题的答案以获取我在测试中使用的代码](/sf/answers/1313847251/) (3认同)
  • 那些是小数目。我不确定您在这两种方式中是否会看到很大的不同。第三种选择是“字典”对象。它有一个Exists方法,比数组更容易使用(添加项目时没有ReDim Preserve) (2认同)

小智 9

这里提出了这个问题:VBA阵列 - 检查严格(非近似)匹配

Sub test()
    vars1 = Array("Examples")
    vars2 = Array("Example")
    If IsInArray(Range("A1").value, vars1) Then
        x = 1
    End If

    If IsInArray(Range("A1").value, vars2) Then
        x = 1
    End If
End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function
Run Code Online (Sandbox Code Playgroud)


小智 6

我搜索了这个问题,当我看到答案时,我最终创建了一些不同的东西(因为在大多数情况下,我更喜欢用更少的代码而不是大多数其他东西)在绝大多数情况下都可以使用。基本上把数组变成一个字符串,数组元素由一些定界符分隔,然后将搜索值包裹在定界符中并通过instr。

Function is_in_array(value As String, test_array) As Boolean
    If Not (IsArray(test_array)) Then Exit Function
    If InStr(1, "'" & Join(test_array, "'") & "'", "'" & value & "'") > 0 _
        Then is_in_array = True
End Function
Run Code Online (Sandbox Code Playgroud)

你会像这样执行函数:

test = is_in_array(1, array(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)


Six*_*nse 5

使用 Excel VBA 中的 Match() 函数检查数组中是否存在该值。

Sub test()
    Dim x As Long

    vars1 = Array("Abc", "Xyz", "Examples")
    vars2 = Array("Def", "IJK", "MNO")

    If IsNumeric(Application.Match(Range("A1").Value, vars1, 0)) Then
        x = 1
    ElseIf IsNumeric(Application.Match(Range("A1").Value, vars2, 0)) Then
        x = 1
    End If

    MsgBox x
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 我将 `IsInArray` 函数更改为使用 `IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))` 来解决问题 (3认同)

小智 5

如果没有匹配,下面的函数返回“0”;如果匹配则返回“正整数”:

Function IsInArray(stringToBeFound As String, arr As Variant) As Integer 
    IsInArray = InStr(Join(arr, ""), stringToBeFound) 
End Function
Run Code Online (Sandbox Code Playgroud)

注意:该函数首先使用“Join”将整个数组内容连接到一个字符串(不确定 join 方法是否在内部使用循环),然后使用 检查该字符串中的匹配项InStr

  • 我的意思是“只能......可靠地工作”... `IsInArray( "ab", ("ab,c","d"))` 会返回 `True`,但它应该返回 `False`,因为没有两个数组项“ab,c”或“d”等于“ab”。与 `IsInArray("ab,c", ("ab","c"))` 相同 (2认同)

Sum*_*ary -1

您想检查 Range("A1").Value 中是否存在Examples如果失败,那么检查Examples对吧?我认为我的代码会完美运行。请检查。

Sub test()
Dim string1 As String, string2 As String
string1 = "Examples"
string2 = "Example"
If InStr(1, Range("A1").Value, string1) > 0 Then
    x = 1
ElseIf InStr(1, Range("A1").Value, string2) > 0 Then
    x = 2
End If
Run Code Online (Sandbox Code Playgroud)

结束子