我没有在长AND
语句中使用If
,而是使用InStr
将动态值与已知列表相匹配。像这样:
If InStr("John, George, Harry", personName) Then...
这可以吗?我应该使用AND
吗?还有更好的方法吗?
感谢。
答案 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?
您可以使用选择案例陈述......
的举例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,以获得更好的性能。