2013-03-20 109 views
9

我有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

回答

6

試試這個:

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

0

有趣的是,我輸入你的數據到一個空白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 
0

對我來說,它沒有類型鑄造任何東西都能正常工作。我用兩個:

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

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

尺寸CurrentShipment如整型,雙精度,長或變體,所有工作得很好......

1

如果您尋找匹配功能在對象瀏覽器中它返回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 
10

作爲一個側面說明這個問題以及人誰在未來得到這個錯誤,與返回的可能錯誤的任何功能,變異型工作得很好:

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

相關問題