web-dev-qa-db-fra.com

Pourquoi l'erreur 2042 apparaît-elle dans VBA Match?

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. 

12
user2140261

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)
10
Vincent MAURY

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

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.

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

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

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é ...

0
K_B