为什么我在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)
无济于事。
试试这个:
CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0)
这工作,但为什么? – user2140261 2013-03-20 14:52:03
它将适用于整数,但不适用于小数点,不适用于字符串,因此它感觉有点狡猾...... – 2013-03-20 15:07:51
这也适用于我的数据,在这里我匹配日期。我真的不知道为什么这是因为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变量参数。尝试下面的代码,如果它适合你。
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最佳答案。 – brettdj 2014-01-30 09:59:59
您的代码适合我。您收到的错误消息相当于'#N/A'。也许它有时专注于错误的表单?运行代码之前,您可以尝试主动选择正确的表单。 – techturtle 2013-03-20 15:08:26