J'ai la colonne A:
+--+--------+
| | A |
+--+--------+
| 1|123456 |
|--+--------+
| 2|Order_No|
|--+--------+
| 3| 7 |
+--+--------+
Maintenant si j'entre:
=Match(7,A1:A5,0)
dans une cellule sur la feuille je reçois
3
Par conséquent. (Ceci est désiré)
Mais quand j'entre cette ligne:
Dim CurrentShipment As Integer
CurrentShipment = 7
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0)
CurrentRow obtient une valeur de "Erreur 2042"
Mon premier instinct était de m'assurer que la valeur 7 était en fait dans la plage, et c'était le cas.
Mon prochain était peut-être la fonction Match nécessitait une chaîne alors j'ai essayé
Dim CurrentShipment As Integer
CurrentShipment = 7
CurrentRow = Application.Match(Cstr(CurrentShipment), Range("A1:A5"), 0)
en vain.
Voir la liste de VBA Cell Error Values :
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!
Essayez de convertir la valeur de CurrentShipment
d’une Integer
en une Long
au lieu de une String
:
CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0)
En guise de remarque, pour tous ceux qui rencontrent cette erreur à l’avenir, quelle que soit la fonction retournant une erreur possible, le type de variante fonctionne plutôt bien:
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
Si vous recherchez une fonction de correspondance dans le navigateur d’objets, elle renvoie double, c’est pourquoi j’ai déclaré la variable CurrentRow comme étant double et accepte 3 paramètres variables. Essayez ci-dessous le code si cela fonctionne pour vous.
Sub sample()
Dim CurrentShipment As Variant
CurrentShipment = 7
Dim CurrentRow As Double
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0)
End Sub
Fait intéressant, j'ai tapé vos données dans une feuille Excel vierge, puis j'ai exécuté votre extrait de code d'origine. Comme attendu, il a renvoyé 3, sans avoir à transtyper CurrentShipment en tant que String ou Long.
Not DIM'ing CurrentRow en fait un Variant par défaut, mais même le fait de les définir comme Integer ou CurrentRow comme Byte ne génère pas d'erreur. Par conséquent, l'utilisation de Double comme type de retour est redondante.
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
Pour moi, cela a bien fonctionné sans que rien ne soit écrit. J'ai utilisé les deux:
Application.WorksheetFunction.Match(CurrentShipment, Range("A1:A5"), 0)
et
Application.Match(CurrentShipment, Range("A1:A5"), 0)
Dimensionné CurrentShipment comme Entier, Double, Long ou Variant, tout a bien fonctionné ...