考虑下面的一段VBA代码,它生成一个只有两个元素的数组,搜索两个元素中的后一个元素。两个注释行将向数组添加第三个条目。这会产生输出
立即窗口中的错误2042
。如果我将脚本更改为三元素数组,并尝试Match
第二个元素,我会得到正确的索引作为回报。但是,如果我搜索最后一个元素,我会得到同样的错误。
为什么会这样?
工作MWE
Sub testArray()
Dim myArray() As Variant
' ReDim myArray(1 To 2)
ReDim myArray(1 To 3)
myArray(1) = "Trondheim"
myArray(2) = "Levanger"
myArray(3) = "Dummy"
Dim Index As Variant
Dim test As Variant
test = "Levanger"
Index = Application.Match(test, myArray)
Debug.Print Index
End Sub
最小的非工作示例
Sub testArray()
Dim myArray() As Variant
' ReDim myArray(1 To 2)
ReDim myArray(1 To 3)
myArray(1) = "Trondheim"
myArray(2) = "Levanger"
myArray(3) = "Dummy"
Dim Index As Variant
Dim test As Variant
'test = "Levanger"
test = "Dummy"
Index = Application.Match(test, myArray)
Debug.Print Index
End Sub
答案 0 :(得分:2)
将0作为可选参数match_type
:
Index = Application.Match(test, myArray, 0)
它会导致函数返回完全匹配。
根据Excel帮助,如果省略此参数,则默认使用match_type = 1
。
在那种情况下 " MATCH找到小于或等于lookup_value的最大值。 lookup_array参数中的值必须按升序排列,例如:... - 2,-1,0,1,2,...,A-Z,FALSE,TRUE。"
答案 1 :(得分:2)
您需要指定完全匹配类型,因为字符串不会与实际文本进行比较:
示例1:未提供参数
Sub MM()
Dim myArray As Variant
myArray = Array("test", "best", "rest")
Index = Application.Match("test", myArray)
Debug.Print Index '// Prints "3"
Index = Application.Match("rest", myArray)
Debug.Print Index '// Also prints "3"
End Sub
默认匹配类型参数为 1 - 小于,这似乎是隐含的评估它上面的每个项目的代码值而不是它的文本值 - 即使使用Option Compare
语句也是如此。因此,始终建议将这些类型的函数与已经排序的数据一起使用。
这种种是有道理的,因为必须有一个在某些级别得出的数值,以便小于'比较发生。
示例2:匹配参数提供
Sub MM()
Dim myArray As Variant
myArray = Array("test", "best", "rest")
Index = Application.Match("test", myArray, 0)
Debug.Print Index '// Prints "1"
Index = Application.Match("rest", myArray, 0)
Debug.Print Index '// Prints "3"
End Sub
如您所见 - 这给出了预期的输出。我们提供了匹配参数 0 - 完全匹配,当提供有效查找值时,无论是在二进制上进行比较,都会返回正确的索引< em>或基于文本,因为值相同。