2013-03-20 15 views
9

mam Kolumna A:Dlaczego pojawia się błąd 2042 w dopasowaniu VBA?

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

Teraz jeśli wejdę:

=Match(7,A1:A5,0) 

do komórki na arkuszu mam

3 

wyniku. (To jest pożądany)

Ale kiedy wprowadzić tę linię:

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

CurrentRow pobiera wartość „Error 2042”

Moim pierwszym odruchem było upewnienie się, że wartość 7 było w rzeczywistości w zasięgu, i to było.

Mój następny był może funkcja Mecz wymagany ciąg więc próbowałem

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

bezskutecznie.

+0

Twój kod działa tak jak ja. Komunikat o błędzie, który otrzymujesz, jest odpowiednikiem '# N/A'. Być może czasem koncentruje się na niewłaściwym arkuszu?Możesz spróbować aktywnie wybrać odpowiedni arkusz przed uruchomieniem kodu. – techturtle

Odpowiedz

6

Spróbuj tego:

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

To zadziałało, ale dlaczego? – user2140261

+1

I będzie działać dla liczb całkowitych, ale nie dla dziesiętnych, a nie dla stringów, więc wydaje się nieco niepewny ... –

+0

Działa to również dla moich danych, w których dopasowuję daty. Naprawdę nie wiem, dlaczego tak się dzieje, ponieważ CLng konwertuje wartość na długą liczbę całkowitą. Docenia się dalsze wyjaśnienie. –

0

ciekawe, wpisałem dane do pustego arkusza Excel, a następnie prowadził oryginalny fragment kodu. Zwrócił 3, zgodnie z oczekiwaniami, bez konieczności przesyłania CurrentShipment jako String lub Long.

Nie DIM'ing CurrentRow domyślnie jest wariantem, ale nawet ustawienie ich jako Integer lub CurrentRow jako Byte nie powoduje błędu, więc użycie Double jako typu powrotu jest zbędne.

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

Dla mnie wszystko działało bez żadnego odlewania. Kiedyś zarówno:

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

i

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

wymiarowy CurrentShipment jak Integer, podwójny, długi lub wariancie wszystko działało w porządku ...

1

Jeśli spojrzeć na funkcję dopasowania w przeglądarce obiektów zwraca dwukrotnie, więc zadeklarowałem zmienną CurrentRow jako podwójną i akceptuję 3 warianty wariantu. Wypróbuj poniższy kod, jeśli to działa.

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

marginesie do tego i dla każdego, kto ją tego błędu w przyszłości, z dowolnej funkcji powracającego ewentualnego błędu, typ wariant działa całkiem dobrze:

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 najlepsza odpowiedź. – brettdj

Powiązane problemy