15

我有A列:

+--+--------+
|  |  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 实际上在范围内,并且确实如此。

我的下一个可能是 Match 函数需要一个字符串,所以我尝试了

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

无济于事。

4

6 回答 6

15

作为对此的附带说明,对于将来遇到此错误的任何人,任何函数都返回可能的错误,变体类型工作得很好:

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
于 2013-09-19T13:48:10.020 回答
14

请参阅 VBA单元错误值列表:

Constant    Error number  Cell error value
xlErrDiv0   2007          #DIV/0!
xlErrNA     2042          #N/A
xlErrName   2029          #NAME?
xlErrNull   2000          #NULL!
xlErrNum    2036          #NUM!
xlErrRef    2023          #REF!
xlErrValue  2015          #VALUE!

尝试将值CurrentShipment从a 转换Integer为 aLong而不是 a String

CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0)
于 2013-03-20T14:50:30.127 回答
1

如果您在对象浏览器中查找 match 函数,它会返回 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
于 2013-03-20T15:18:45.280 回答
0

有趣的是,我将您的数据输入到一张空白的 Excel 表格中,然后运行您的原始代码片段。正如预期的那样,它返回 3,而无需将 CurrentShipment 转换为 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
于 2013-03-20T15:07:16.300 回答
0

对我来说,它工作得很好,没有任何类型的转换。我两个都用过:

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

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

将 CurrentShipment 标注为 Integer、Double、Long 或 Variant,一切正常……

于 2013-03-20T15:09:56.063 回答
0

尝试在具有多个工作表的工作簿中使用 Match 函数时,我收到了完全相同的错误消息。如果我们尝试匹配的主题不存在,则对接收结果的变量使用变体类型可以很好地避免运行错误。但我的错误在于使用范围的位置。指向具有要搜索范围的工作表至关重要。首先,我在没有工作表引用的情况下使用 Range(...) ,并且只有在激活该工作表时该功能才能正常工作。

于 2022-03-01T08:48:12.937 回答