web-dev-qa-db-de.com

Warum erhalte ich im VBA-Match die Fehlermeldung 2042?

Ich habe Spalte A:

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

Wenn ich jetzt eingebe:

=Match(7,A1:A5,0)

in eine Zelle auf dem Blatt bekomme ich 

3

Als Ergebnis. (Dies ist erwünscht)

Aber wenn ich diese Zeile eingebe:

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

CurrentRow erhält den Wert "Fehler 2042"

Mein erster Instinkt war, sicherzustellen, dass der Wert 7 tatsächlich im Bereich lag, und das war auch der Fall.

Mein nächstes war vielleicht die Match-Funktion eine Zeichenfolge, also versuchte ich es 

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

umsonst. 

12
user2140261

Siehe Liste der VBA Zellfehlerwerte :

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!

Versuchen Sie, den Wert von CurrentShipment von einer Integer in eine Long statt in eine String zu konvertieren:

CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0)
10
Vincent MAURY

Als Randbemerkung dazu und für jeden, der diesen Fehler in Zukunft erhält, wobei jede Funktion einen möglichen Fehler zurückgibt, funktioniert der Variantentyp recht gut:

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
15
KDT

Wenn Sie im Objektbrowser nach einer Übereinstimmungsfunktion suchen, wird der Wert double zurückgegeben, sodass ich die Variable CurrentRow als double deklariert habe und 3 variierende Parameter akzeptiert. Versuchen Sie es mit dem folgenden Code, wenn es für Sie funktioniert.

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
user2063626

Interessanterweise habe ich Ihre Daten in eine leere Excel-Tabelle eingegeben und dann Ihr ursprüngliches Code-Snippet ausgeführt. Wie erwartet gab es 3 zurück, ohne CurrentShipment als String oder Long umwandeln zu müssen.

Wenn Sie CurrentRow nicht als DIM-Wert festlegen, wird dies standardmäßig als Variant festgelegt. Wenn Sie jedoch beide als Integer oder CurrentRow als Byte festlegen, wird kein Fehler ausgegeben. Daher ist die Verwendung von Double als Rückgabetyp redundant.

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
Skip Intro

Bei mir hat es gut geklappt, ohne etwas zu schreiben. Ich habe beides benutzt:

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

und

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

Bemaßte CurrentShipment als Integer, Double, Long oder Variant, alles hat gut funktioniert ...

0
K_B