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

时间:2010-10-01 16:11:59

标签: vba vb6

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

If InStr("John, George, Harry", personName) Then...

这可以吗?我应该使用AND吗?还有更好的方法吗?

感谢。

5 个答案:

答案 0 :(得分:2)

不,那不行。如果你这样做,你会匹配一个名为“n,Ge”和“Geor”的人。

我的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,但如果确实如此,那么你也可以使用here描述的方法。

如果您的名字列表非常大,您可能需要使用Dictionary

答案 1 :(得分:1)

如子行列怎么样,比如Anne-Marie和人名= Anne?

您可以使用选择案例陈述......

来自DATABISON

的举例
Sub My_Select_Case_3_Text()
Dim my_val As String

my_val = "Pineapple"
Select Case my_val
Case "Apple": MsgBox "The fruit is Apple"
Case "Orange": MsgBox "The fruit is Orange"
Case "Pineapple": MsgBox "The fruit is Pineapple"
End Select
End Sub

答案 2 :(得分:0)

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

答案 3 :(得分:0)

几个选项

If Instr("[John][George][Harry]","[" & personname & "]") Then

会阻止部分匹配。如果你碰巧在Excel vba中,你可以使用内置的MATCH工作表函数

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

答案 4 :(得分:0)

我不认为所有场合都有任何单一的答案。

如果列表非常短并且已修复,请使用Or:

进行一系列测试
If personName = "John" Or personName = "George" Or personName = "Harry" Then

中等大小的列表可以表示为已建议的字符串,稍加优化:

If InStr("$John$George$Harry$", "$" & personName & "$") Then 

您也可以使用数组作为列表,以及Filter():

If UBound(Filter(Array("$John$", "$George$", "$Harry$"), _
                 "$" & personName & "$")) >= 0 Then

如果您有预先构建的String或Array而不是在表达式中内联它们,那些选项可能会更好。

对于较长的列表,您可以使用Scripting.Dictionary对象来保存测试用例。这包含一个碰撞解决的哈希,它有一个Exists()方法。 VB6 Collection也可以使用异常捕获来实现类似Exists的功能。

如果你有多个“字段”要测试(名称和眼睛颜色?),你可以使用一个伪造的ADO Recordset及其Filter属性。这样可以很容易地确定你有乔治蓝眼睛或哈利棕眼睛。对于较长的候选列表,您可以在Recordset的字段上将动态属性Optimize设置为True,以获得更好的性能。