为什么我在VBA匹配中遇到错误2042?

问题描述:

我有A柱:为什么我在VBA匹配中遇到错误2042?

+--+--------+ 
| | A  | 
+--+--------+ 
| 1|123456 | 
|--+--------+ 
| 2|Order_No| 
|--+--------+ 
| 3| 7 | 
+--+--------+ 

现在,如果我输入:

=Match(7,A1:A5,0) 

到纸张上的小区,我得到

3 

结果。 (这是需要的)

但是,当我进入这一行:

Dim CurrentShipment As Integer 
CurrentShipment = 7 
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0) 

CurrentRow得到的“错误2042”的值

我的第一反应是,以确保该值7实际上在范围内,它是。

我的未来是可能的匹配功能需要一个字符串,所以我尝试

Dim CurrentShipment As Integer 
CurrentShipment = 7 
CurrentRow = Application.Match(Cstr(CurrentShipment), Range("A1:A5"), 0) 

无济于事。

+0

您的代码适合我。您收到的错误消息相当于'#N/A'。也许它有时专注于错误的表单?运行代码之前,您可以尝试主动选择正确的表单。 – techturtle 2013-03-20 15:08:26

试试这个:

CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0) 
+1

这工作,但为什么? – user2140261 2013-03-20 14:52:03

+1

它将适用于整数,但不适用于小数点,不适用于字符串,因此它感觉有点狡猾...... – 2013-03-20 15:07:51

+0

这也适用于我的数据,在这里我匹配日期。我真的不知道为什么这是因为CLng将一个值转换为长整数。赞赏进一步的解释。 – 2017-01-18 21:11:35

有趣的是,我输入你的数据到一个空白Excel工作表,然后跑了你原来的代码段。如预期的那样,它返回3,而不必将字符串当作String或Long。

不DIM'ing CurrentRow默认情况下使其成为Variant,但即使将它们都设置为Integer或CurrentRow作为Byte也不会引发错误,因此使用Double作为返回类型是多余的。

Sub Match() 

Dim CurrentShipment As Integer 
Dim CurrentRow As Byte '<--- NOTE 

CurrentShipment = 7 
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0) 

MsgBox CurrentRow 

End Sub 

对我来说,它没有类型铸造任何东西都能正常工作。我用两个:

Application.WorksheetFunction.Match(CurrentShipment, Range("A1:A5"), 0)

Application.Match(CurrentShipment, Range("A1:A5"), 0)

尺寸CurrentShipment如整型,双精度,长或变体,所有工作得很好......

如果您寻找匹配功能在对象浏览器中它返回double,所以我声明变量CurrentRow为double,并且它接受3变量参数。尝试下面的代码,如果它适合你。

enter image description here

enter image description here

Sub sample() 

    Dim CurrentShipment As Variant 
    CurrentShipment = 7 

    Dim CurrentRow As Double 
    CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0) 
    End Sub 

作为一个侧面说明这个问题以及人谁在未来得到这个错误,与返回的可能错误的任何功能,变异型工作得很好:

Dim vreturn as variant 

vreturn = Application.Match(CurrentShipment, Range("A1:A5"), 0) ' this could be any function like a vlookup for example as well 

If IsError(vreturn) Then 
    ' handle error 
Else 
    CurrentRow = cint(vreturn) 
End If 
+1

+1最佳答案。 – brettdj 2014-01-30 09:59:59