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.
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)
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
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.
Sub sample()
Dim CurrentShipment As Variant
CurrentShipment = 7
Dim CurrentRow As Double
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0)
End Sub
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
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 ...