Incompatibilité de type d'argument VBA ByRef

Non-correspondance du type d'argument ByRef dans Excel VBA

Dans cet article, nous expliquons l'erreur rencontrée lors de l'utilisation d'Excel VBA ByRef comme «Erreur de non-concordance de type d'argument». Avant cela, permettez-moi de vous présenter d'abord "By Ref". Les variables sont la clé de tout langage de programmation et VBA n'est pas différent non plus. Nous avons vu de nombreuses façons de déclarer des variables. Une de ces façons de déclarer des variables consiste à utiliser les mots «ByRef» et «ByVal».

Que signifie ByRef?

«ByRef» signifie «Par référence», en utilisant ce mot, nous pouvons en fait passer des arguments aux procédures (pour les sous et fonctions) par référence. Ceci est différent de son frère «By Val» qui n'est pas flexible mais fixe dans la nature.

Pour comprendre cela, jetons un coup d'œil aux deux macros ci-dessous.

Code:

 Sub Macro1 () Dim A As Long A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

Nous avons deux sous-procédures ici nommées respectivement Macro1 et Macro2. Pour mieux comprendre cela, exécutez la macro ligne par ligne en appuyant sur la touche F8.

Appuyez sur la touche F8 pour capturer la valeur de la variable «A» comme 50.

La ligne suivante de code indique «Macro2 A», c'est-à-dire le nom de la deuxième macro et «A» est la variable définie par le mot «By Ref».

Comme vous pouvez le voir ci-dessus, au moment où nous exécutons la ligne de code «Macro2 A», elle est passée à la sous-procédure VBA suivante de la procédure ci-dessus.

Maintenant, nous pouvons voir que la valeur de la variable «A» est 50 c'est parce que depuis que nous avons utilisé le mot «ByRef» pour déclarer la variable «A» qui est la même que dans Macro1, il a capturé la valeur que nous avons assignée à cette variable " A ”de Macro1 .

Maintenant, dans cette macro ( Macro2 ) l'équation dit A = A * 10 ie A = 50 * 100. Appuyez sur la touche F8 3 fois pour revenir à la macro ci-dessus ( Macro1 ).

Maintenant, appuyez une fois de plus sur la touche F8 pour voir la valeur de la variable «A» dans la boîte de message dans VBA.

La valeur indique 500.

Même si la valeur que nous avons attribuée dans cette macro (Macro1) est de 50, en utilisant le mot ByRef, nous avons déclenché la sous-procédure Macro2 en conservant la valeur de la variable «A» de Macro1, puis en exécutant la valeur de A en multipliant 10.

Les 3 principales raisons de la non-correspondance du type d'argument VBA Byref

Ci-dessus, nous avons vu comment fonctionne «ByRef», mais nous sommes tenus de faire certaines des erreurs qui ont invariablement abouti à lancer un message d'erreur VBA comme «ByRef Argument Type Mismatch».

Ceci est dû à de nombreuses raisons et dans cette section, nous vous montrerons comment corriger cette erreur et déboguer le code.

Vous pouvez télécharger ce modèle Excel de non-correspondance de type d'argument VBA ByRef ici - Modèle Excel de non-correspondance de type d'argument VBA ByRef

Raison d'erreur n ° 1 - Différents noms de variable

L'une des principales raisons de cette erreur dans Excel VBA est due à différentes variables passées dans deux procédures. Pour un exemple, regardez les codes ci-dessous.

Code:

 Sub Macro1 () Dim A As Long A = 50 Macro2 B MsgBox A End Sub Sub Macro2 (ByRef A As Long) B = B * 10 End Sub 

Dans Macro1 nous avons utilisé la variable «A» et dans Macro2 nous avons utilisé la variable «B». Maintenant, si vous essayez d'exécuter le code, nous obtiendrons une erreur VBA en tant que "ByRef Argument Type Mismatch".

Comme vous pouvez le voir ci-dessus, la variable «B» a été mise en surbrillance car le type de nom de variable est incompatible.

Solution: pour résoudre ce problème, nous devons nous assurer que les noms de variables dans les deux procédures sont exacts.

Raison d'erreur 2: différents types de données variables

Même si les noms de variables sont identiques, cela provoque une erreur, c'est à cause du type de données que nous leur attribuons. Regardez le code ci-dessous.

Code:

 Sub Macro1 () Dim A As Integer A = 50 Macro2 A MsgBox A End Sub Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

Dans les codes ci-dessus, j'ai déclaré la variable «A» comme type de données Integer dans Macro1 et dans Macro2, la même variable a été affectée au type de données «Long».

Lorsque nous exécutons ce code, cela provoquera une erreur vba «ByRef Argument Type Mismatch».

En effet, nous avons attribué deux types de données différents pour le même nom de variable.

Solution: le type de données doit être le même dans les deux procédures.

Raison d'erreur 3: types de données variables manquants dans une macro

L'erreur Excel VBA «Incohérence de type d'argument ByRef» peut se produire en raison du type de données attribué dans une macro et non affecté dans une autre macro.

Code:

 Sous Macro1 () A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

Dans le code ci-dessus de Macro1, je n'ai déclaré aucune variable, mais simplement assigné la valeur à la variable.

Par contre pour Macro2, j'ai déclaré la variable «A» aussi longtemps. Si vous essayez d'exécuter ce code, cela provoquera une erreur VBA «ByRef Argument Type Mismatch».

Solution1: pour éviter ce genre de situation, la première solution consiste à déclarer la variable dans les deux procédures et à affecter le même type de données.

Solution 2: Une solution alternative est de rendre obligatoire la déclaration de variable en ajoutant le mot «Option Explicit» en haut du module.

Ce que cela fera, c'est qu'avant d'afficher l'erreur VBA «ByRef Argument Type Mismatch», il nous demande en fait de déclarer la variable d'abord.

Ainsi, Option Explicit est toujours utile dans VBA.

Choses à retenir

  • ByRef est l'opposé de By Val.
  • ByRef transporte la référence d'une procédure à une autre.
  • Le nom de la variable et le type de données doivent être identiques dans les deux procédures.
  • Chaque variable doit être déclarée séparément en cas de variables multiples.