为什么我在VBA Match中会收到2042错误?

17

我有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得到一个值为"Error 2042"

我的第一反应是确保数字7确实在范围内,它确实在。

我的下一个想法是也许Match函数需要一个字符串,所以我尝试了

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

徒劳无功。


2
你的代码在我的电脑上可以正常运行。你收到的错误信息相当于“#N/A”。也许有时候它会关注错误的工作表?在运行代码之前,你可以尝试主动选择正确的工作表。 - techturtle
6个回答

17

查看 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的值从Integer转换为Long,而不是转换为String
CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0)

2
它可以用于整数,但不能用于小数和字符串,所以感觉有点不可靠... - K_B
1
这对于我匹配日期的数据也适用。我真的不知道为什么会这样,因为 CLng 是将值转换为长整型。进一步的解释将不胜感激。 - Samuel Song

17
作为这个问题的一则附注,对于任何可能返回错误的函数,变体类型是非常有效的解决方法。
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
如果您在对象浏览器中查找匹配函数,它会返回双倍值,因此我已将变量CurrentRow声明为double类型,虽然它接受3个variant参数。如果以下代码适用于您,请尝试一下。

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

1

当我在一个包含多个工作表的工作簿中尝试使用Match函数时,我遇到了完全相同的错误消息。

对于接收结果的变量使用变体类型是好的,以避免运行错误,如果我们尝试匹配的主题不存在。

但我的错误在于使用的范围位置。关键是指出要搜索的工作表的范围。第一次我使用了Range(...)而没有使用工作表引用,只有在我激活了那个工作表后,函数才能正确地工作。


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来进行提问。如果您希望收到该问题有新答案时的通知,您可以关注此问题。一旦您拥有足够的声望,您也可以添加悬赏以吸引更多人关注此问题。- 来自评论 - Ike
实际上,它提出了一个非常相关的问题:范围需要属于正在搜索的工作表。如果激活了不同的工作表,则仅使用 Range(...) 将失败。 - Alex Peters

0
有趣的是,我将您的数据输入到一个空白的Excel工作表中,然后运行了您的原始代码片段。它返回了3,正如预期的那样,而无需将CurrentShipment强制转换为String或Long。
未声明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

0

对我来说,不需要进行任何类型转换就可以正常工作。 我使用了以下两种方法:

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

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

将CurrentShipment定义为Integer、Double、Long或Variant,都可以正常工作...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接