使用Application.Match

时间:2015-11-18 13:55:24

标签: arrays vba

考虑下面的一段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

2 个答案:

答案 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>或基于文本,因为值相同。