Arrays VBA如何检查数组中是否表示变量

Arrays VBA如何检查数组中是否表示变量,arrays,vba,Arrays,Vba,我有一个输入框,用户可以在其中向文本字段输入任何值。我想检查这个值是否在数组中表示:例如,“asdf”不在数组ValidEntries中,数组ValidEntries包含整数0、1、2、3、4、5和6,但“6”是。如何做到这一点?以下是三种可能的解决方案: Sub test1() Dim ValidEntries As Variant Dim i As Long, v As Variant Dim valid As Boolean ValidEntries =

我有一个输入框,用户可以在其中向文本字段输入任何值。我想检查这个值是否在数组中表示:例如,“asdf”不在数组ValidEntries中,数组ValidEntries包含整数0、1、2、3、4、5和6,但“6”是。如何做到这一点?

以下是三种可能的解决方案:

Sub test1()
    Dim ValidEntries As Variant
    Dim i As Long, v As Variant
    Dim valid As Boolean

    ValidEntries = Array(1, 2, 3, 4, 5, 6)
    v = InputBox("Enter something")

    valid = False
    For i = LBound(ValidEntries) To UBound(ValidEntries)
        If v = ValidEntries(i) Then
            valid = True
            Exit For
        End If
    Next i

    MsgBox v & IIf(valid, " is valid", " isn't valid")

End Sub

Sub test2()
    Dim ValidEntries As Variant
    Dim v As Variant
    Dim valid As Boolean

    ValidEntries = Array(1, 2, 3, 4, 5, 6)
    v = InputBox("Enter something")

    valid = Join(ValidEntries, "@") Like "*" & v & "*" And Not (v Like "*@*")

    MsgBox v & IIf(valid, " is valid", " isn't valid")

End Sub

Sub test3()
    Dim ValidEntries As Variant
    Dim i As Long, v As Variant, key As Variant
    Dim valid As Boolean
    Dim dict As Object

    Set dict = CreateObject("Scripting.Dictionary")

    ValidEntries = Array(1, 2, 3, 4, 5, 6)
    For i = LBound(ValidEntries) To UBound(ValidEntries)
        key = Trim(Str(ValidEntries(i)))
        If Not dict.exists(key) Then dict.Add key, 0
    Next i
    v = InputBox("Enter something")

    valid = dict.exists(v)

    MsgBox v & IIf(valid, " is valid", " isn't valid")

End Sub

第一种方法是对数组进行简单的线性搜索。第二种方法是使用一个分隔符,该分隔符不能出现在任何有效的条目中(您可能必须选择不同的条目),该分隔符用于将数组连接到一个大字符串中,然后检查输入是否为子字符串(但不是跨越分隔符的条目)。第三个创建了一个字典,之后您可以在
O(1)
time中检查成员身份。对于验证单个输入来说,这可能不值得,但是如果您的代码必须反复检查数组中的成员身份,那么这可能是值得的。

如果您试图查看数组中是否存在整数的字符串表示形式,只需使用
CInt()


但是,如果您询问如何检查数组项是否存在,则可以尝试以下3种方法:


从数组中创建字符串并使用Evaluate():

或使用ArrayList对象:

Sub MM_2()

Const x As Integer = 5 '// Change to any number to test
Set y = CreateObject("System.Collections.ArrayList")

For i = 1 To 6
    y.Add i
Next

If y.Contains(x) Then
    MsgBox x & " DOES exist in the array."
Else
    MsgBox x & " does NOT exist in the array."
End If

End Sub
对于设置值的列表,请使用
Select Case
语句而不是数组:

Sub MM_3()

Const x As Integer = 5 '// Change to any number to test

Select Case x
    Case 1, 2, 3, 4, 5, 6
        MsgBox x " DOES exist in the array."
    Case Else
        MsgBox x " does NOT exist in the array."
End Select

End Sub

你可以试试这个功能:或者看看投反对票的人是否公平,并给OP一个理由……我没有投反对票,所以不能代表那些投反对票的人说话,但通常那些要求解决而没有显示任何代码尝试的问题会让人觉得OP没有表现出足够的努力。谢谢,这是有道理的。谢谢,我仍然不确定为什么我在这个问题上被否决,第一个对我来说是最好的解决方案。
Sub MM_2()

Const x As Integer = 5 '// Change to any number to test
Set y = CreateObject("System.Collections.ArrayList")

For i = 1 To 6
    y.Add i
Next

If y.Contains(x) Then
    MsgBox x & " DOES exist in the array."
Else
    MsgBox x & " does NOT exist in the array."
End If

End Sub
Sub MM_3()

Const x As Integer = 5 '// Change to any number to test

Select Case x
    Case 1, 2, 3, 4, 5, 6
        MsgBox x " DOES exist in the array."
    Case Else
        MsgBox x " does NOT exist in the array."
End Select

End Sub