Vba 使用InStr而不是If语句中的And?

Vba 使用InStr而不是If语句中的And?,vba,vb6,Vba,Vb6,我不是在长If语句中使用和,而是使用InStr将动态值与已知列表匹配。像这样: If InStr("John, George, Harry", personName) Then... 这样行吗?我应该改用和吗?有更好的办法吗 谢谢。您可以将名称存储在散列中,然后测试它是否在散列中,这比检查它是否在字符串或列表中要快。关于子字符串,例如Anne Marie和person name=Anne,怎么样 您可以使用select case语句来代替 举出例子 不,那不好。如果你这样做,你会找到一个叫“n

我不是在长
If
语句中使用
,而是使用
InStr
将动态值与已知列表匹配。像这样:

If InStr("John, George, Harry", personName) Then...
这样行吗?我应该改用
吗?有更好的办法吗


谢谢。

您可以将名称存储在散列中,然后测试它是否在散列中,这比检查它是否在字符串或列表中要快。

关于子字符串,例如Anne Marie和person name=Anne,怎么样

您可以使用select case语句来代替

举出例子


不,那不好。如果你这样做,你会找到一个叫“n,Ge”和“George”的人

我的VB有点生锈,但您可以:

Dim namearray() As String = {"John", "George", "Harry"}
Dim name As String = "John"
For i = LBound(namearray) To UBound(namearray)
    If namearray(i) = personName Then
        ... i is the array index ...
    End If
Next i
我不知道VB6是否有Array.indexOf,但是如果有,那么您也可以使用所描述的方法

如果您的姓名列表非常大,您可能需要使用一个

和几个选项

If Instr("[John][George][Harry]","[" & personname & "]") Then
将阻止部分匹配。如果您恰好在Excel vba中,则可以使用内置的“匹配工作表”功能

Application.WorksheetFunction.Match("John",array("John","George","Harry"),false)

我不认为在所有情况下都有一个单一的答案

如果列表非常短且固定,则使用一系列测试或:

If personName = "John" Or personName = "George" Or personName = "Harry" Then
一个中等大小的列表可以表示为一个字符串,如前所述,只需稍加优化:

If InStr("$John$George$Harry$", "$" & personName & "$") Then 
您还可以将数组与筛选器()一起用作列表:

如果您有一个预构建的字符串或数组,而不是将它们内联到表达式中,那么这些选项可能会工作得更好

对于更长的列表,您可以使用Scripting.Dictionary对象来保存测试用例。它合并了一个冲突解析哈希,并且有一个Exists()方法。VB6集合也可以工作,尽管您需要使用异常捕获来实现Exists like功能


如果您有多个“字段”要测试(名称和眼睛颜色?),则更好,您可以使用伪造的ADO记录集及其过滤器属性。这样就很容易确定你是有蓝眼睛的乔治还是有棕色眼睛的哈利。对于较长的候选列表,您可以将记录集字段上的dynamic属性Optimize设置为True,以便对其进行哈希处理以获得更好的性能。

我知道答案将是列出的其中一个。我不知道是哪一种。如果让用户输入要检查的名称,这也是最好的方法,因为您可以使用Like运算符,或者根据需要使用任何其他类型的模糊字符串匹配算法。我可能需要在一个if语句中使用多个InStr来获得最终结果。第二个可能是找到眼睛的颜色(例如)。不确定这是否会对建议产生影响。
If InStr("$John$George$Harry$", "$" & personName & "$") Then 
If UBound(Filter(Array("$John$", "$George$", "$Harry$"), _
                 "$" & personName & "$")) >= 0 Then