Vba 如何检查数组中的值是否为真

Vba 如何检查数组中的值是否为真,vba,ms-word,Vba,Ms Word,我使用vba,我得到str作为字符串 我想完成以下任务 有以下数组 array1 = (string1, string2, string4) array2 = (string3, string6, string7) array3 = (string3, string6, string7) str = some string if str is present in array2 then sbj = "subject2" if str is present in array1 then

我使用vba,我得到str作为字符串 我想完成以下任务

有以下数组

array1 = (string1, string2, string4)
array2 = (string3, string6, string7)
array3 = (string3, string6, string7)

str = some string

if str is present in array2 then
 sbj = "subject2"

if str is present in array1 then
sbj = subject1
像智者一样 我知道我很困惑,但目前我一直在使用长开关功能(它工作得很好)


意思是a和c都是苹果,b和d都是香蕉。我们可以使用其他方法吗?

您可以定义一个私有函数来检查元素是否在数组中,并在IF中使用此函数。。然后是条款

Public Function elemInArray(ByVal elem As Variant, ByVal Arr As Variant) As Boolean

    Dim el As Variant

    elemInArray = False

    Select Case IsObject(elem)
    Case True
        For Each el In Arr
            If el Is elem Then elemInArray = True: Exit Function
        Next el

    Case False
        For Each el In Arr
            If el = elem Then elemInArray = True: Exit Function
        Next el

    End Select

End Function
编辑:如果数组只包含基元类型,则此函数更简单

Public Function elemInArray(ByVal elem As Variant, ByVal Arr As Variant) As Boolean

    Dim el As Variant

    elemInArray = False

    For Each el In Arr
        If el = elem Then elemInArray = True: Exit Function
    Next el

End Function
然后你可以问这样的问题:

if elemInArray(str, arr1) then 
    sbj = "subject1"
IF s = "a" or s = "c" then
    sw = "Apple"
ELSEIF s = "b" or s = "d" then
    sw = "banana"
ELSE
    err.raise 10000,"Unexpected value"
ENDIF
至于第二个问题,还可以使用IF条件或SELECT CASE语句,如下所示:

if elemInArray(str, arr1) then 
    sbj = "subject1"
IF s = "a" or s = "c" then
    sw = "Apple"
ELSEIF s = "b" or s = "d" then
    sw = "banana"
ELSE
    err.raise 10000,"Unexpected value"
ENDIF

如果可以保证s是“a”、“b”、“c”或“d”中的一个,则可以省略“ELSE”部分


关于

您可以定义一个专用函数来检查元素是否在数组中,并在IF中使用此函数。。然后是条款

Public Function elemInArray(ByVal elem As Variant, ByVal Arr As Variant) As Boolean

    Dim el As Variant

    elemInArray = False

    Select Case IsObject(elem)
    Case True
        For Each el In Arr
            If el Is elem Then elemInArray = True: Exit Function
        Next el

    Case False
        For Each el In Arr
            If el = elem Then elemInArray = True: Exit Function
        Next el

    End Select

End Function
编辑:如果数组只包含基元类型,则此函数更简单

Public Function elemInArray(ByVal elem As Variant, ByVal Arr As Variant) As Boolean

    Dim el As Variant

    elemInArray = False

    For Each el In Arr
        If el = elem Then elemInArray = True: Exit Function
    Next el

End Function
然后你可以问这样的问题:

if elemInArray(str, arr1) then 
    sbj = "subject1"
IF s = "a" or s = "c" then
    sw = "Apple"
ELSEIF s = "b" or s = "d" then
    sw = "banana"
ELSE
    err.raise 10000,"Unexpected value"
ENDIF
至于第二个问题,还可以使用IF条件或SELECT CASE语句,如下所示:

if elemInArray(str, arr1) then 
    sbj = "subject1"
IF s = "a" or s = "c" then
    sw = "Apple"
ELSEIF s = "b" or s = "d" then
    sw = "banana"
ELSE
    err.raise 10000,"Unexpected value"
ENDIF

如果可以保证s是“a”、“b”、“c”或“d”中的一个,则可以省略“ELSE”部分


加入阵列并进行检查

Dim test As Boolean
Dim findStr As String
Dim result As String

findStr = "apple"

varArray = Array("banana", "apple", "pear", "orange")

test = Join$(varArray, " ") Like "*apple*"

result = "apple is " & IIf(test, vbNullString, "not ") & "included"
避免在阵列中循环



更好的办法是重新思考你的方法。数组是用来以一种非常基本的方式存储相似数据集的,但您需要一些更有用的东西,所以请考虑使用、或对象来代替。

加入数组并进行检查

Dim test As Boolean
Dim findStr As String
Dim result As String

findStr = "apple"

varArray = Array("banana", "apple", "pear", "orange")

test = Join$(varArray, " ") Like "*apple*"

result = "apple is " & IIf(test, vbNullString, "not ") & "included"
避免在阵列中循环



更好的办法是重新思考你的方法。数组是用来以一种非常基本的方式存储相似数据集的,但您需要一些更有用的东西,所以请使用、或对象来代替。

谢谢您的回答。让我检查一下,在elemInArray函数中,您并不真正需要SELECT大小写。您可以只保留(对于Arr中的每个el…,如果el=elem,则…,下一个el)部分。剩下的只是万一你想用一个对象数组来使用这个函数。谢谢你的回答。让我检查一下,在elemInArray函数中,您并不真正需要SELECT大小写。您可以只保留(对于Arr中的每个el…,如果el=elem,则…,下一个el)部分。剩下的只是万一你想用一个对象数组来使用这个函数。谢谢你的回答。让我检查一下。问题是数组中可以有pinneaple,测试将返回true,但apple不在数组中。@Clon对模糊问题的模糊回答-有一些方法可以使其更准确(例如使用匹配模式中的分隔符)但我想说的真正一点是,泛型
Array
类可能是解决这类问题最不合适的对象。@MacroMan:我也讨厌我这样做。我的实际问题要复杂得多,因此我认为应该使用json@Scripting.FileSystemObject:如果按照宏Man的建议使用Scripting.Dictionary对象,则它有一个Exists(key)内置函数,用于检查字典中是否存在具有该键的元素。如果要使用早期绑定变量,需要添加对“Microsoft脚本运行时”的引用。谢谢您的回答。让我检查一下。问题是数组中可以有pinneaple,测试将返回true,但apple不在数组中。@Clon对模糊问题的模糊回答-有一些方法可以使其更准确(例如使用匹配模式中的分隔符)但我想说的真正一点是,泛型
Array
类可能是解决这类问题最不合适的对象。@MacroMan:我也讨厌我这样做。我的实际问题要复杂得多,因此我认为应该使用json@Scripting.FileSystemObject:如果按照宏Man的建议使用Scripting.Dictionary对象,则它有一个Exists(key)内置函数,用于检查字典中是否存在具有该键的元素。如果要使用早期绑定变量,需要添加对“Microsoft脚本运行时”的引用。只需创建名为
IsPresent(str,arr)
的函数,并在此函数中通过arr循环,并将str与每个项进行比较。匹配后,退出循环并返回
true
。创建名为
IsPresent(str,arr)
的简单函数,并在此函数中通过arr循环,并将str与每个项进行比较。匹配后,退出循环并返回
true