Discrepancia de tipo de argumento ByRef de VBA

El tipo de argumento ByRef no coincide en Excel VBA

En este artículo, explicamos el error encontrado al usar Excel VBA ByRef como "Error de no coincidencia de tipo de argumento". Antes de eso, permítanme presentarles "By Ref" primero. Las variables son clave para cualquier lenguaje de programación y VBA tampoco es diferente. Hemos visto muchas formas de declarar variables, una de ellas es mediante el uso de las palabras "ByRef" y "ByVal".

¿Qué significa ByRef?

“ByRef” significa “Por referencia”, usando esta palabra podemos pasar argumentos a los procedimientos (tanto para sub como para función) por referencia. Esto es diferente a su hermano "By Val", que no es flexible sino de naturaleza fija.

Para entender esto, echemos un vistazo a las dos macros siguientes.

Código:

 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 

Tenemos dos subprocedimientos aquí denominados Macro1 y Macro2 respectivamente. Para entender esto mejor, ejecute la macro línea por línea presionando la tecla F8.

Presione la tecla F8 para capturar el valor de la variable "A" como 50.

La siguiente línea de código dice "Macro2 A", es decir, el nombre de la segunda macro y "A" es la variable definida mediante la palabra "By Ref".

Como puede ver arriba, en el momento en que ejecutamos la línea de código “Macro2 A”, ha saltado al siguiente subprocedimiento de VBA del procedimiento anterior.

Ahora podemos ver que el valor de la variable “A” es 50 esto se debe a que desde que usamos la palabra “ByRef” para declarar la variable “A” que es igual que en Macro1 ha capturado el valor que le hemos asignado a esta variable ” A ”del Macro1 .

Ahora, en esta macro ( Macro2 ), la ecuación dice A = A * 10, es decir, A = 50 * 100. Presione la tecla F8 3 veces para volver a la macro anterior ( Macro1 ).

Ahora presione una vez más la tecla F8 para ver el valor de la variable "A" en el cuadro de mensaje en VBA.

El valor dice 500.

Aunque el valor que hemos asignado en esta macro (Macro1) es 50, al usar la palabra ByRef en realidad activamos el subprocedimiento Macro2 reteniendo el valor de la variable “A” de Macro1 y luego ejecutando el valor de A multiplicando 10.

3 razones principales para la falta de coincidencia del tipo de argumento Byref de VBA

Anteriormente hemos visto cómo funciona "ByRef", pero estamos obligados a cometer algunos de los errores que invariablemente resultan en lanzar un mensaje de error de VBA como "ByRef Argument Type Mismatch".

Esto se debe a muchas razones y en esta sección le mostraremos cómo rectificar este error y depurar el código.

Puede descargar esta plantilla de Excel de desajuste de tipo de argumento ByRef de VBA aquí - Plantilla de Excel de desajuste de tipo de argumento de VBA ByRef

Razón del error n. ° 1: diferentes nombres de variables

Una de las principales razones detrás de este error en Excel VBA se debe a que se pasan diferentes variables en dos procedimientos. Para ver un ejemplo, mire los códigos a continuación.

Código:

 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 

En Macro1 hemos utilizado la variable "A" y en Macro2 hemos utilizado la variable "B". Ahora, si intenta ejecutar el código, obtendremos un error de VBA como "Error de coincidencia de tipo de argumento de ByRef".

Como puede ver arriba, la variable "B" se ha resaltado porque el tipo de nombre de variable no coincide.

Solución: para solucionar este problema, debemos asegurarnos de que los nombres de las variables en ambos procedimientos sean exactos.

Razón del error 2: diferentes tipos de datos variables

A pesar de que los nombres de las variables siguen siendo los mismos, causa un error debido al tipo de datos que les asignamos. Mira el siguiente código.

Código:

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

En los códigos anteriores, he declarado la variable "A" como tipo de datos Integer en Macro1 y en Macro2 a la misma variable se le asignó el tipo de datos como "Long".

Cuando ejecutamos este código, causará un error de vba "No coinciden los tipos de argumentos de ByRef".

Esto se debe a que hemos asignado dos tipos de datos diferentes para el mismo nombre de variable.

Solución: el tipo de datos debe ser el mismo en ambos procedimientos.

Razón del error 3: tipos de datos variables que faltan en una macro

El error de Excel VBA "No coincide el tipo de argumento ByRef" podría ocurrir debido al tipo de datos asignado en una macro y no asignado en otra macro.

Código:

 Sub Macro1 () A = 50 Macro2 A MsgBox A Fin Sub Sub Macro2 (ByRef A tan largo) A = A * 10 End Sub 

En el código anterior de Macro1, no he declarado ninguna variable, simplemente asigné el valor a la variable.

Por otro lado, para Macro2 he declarado la variable "A" tan larga. Si intenta ejecutar este código, provocará el error de VBA "ByRef Argument Type Mismatch".

Solución 1: Para evitar este tipo de situaciones, la primera solución es declarar la variable en ambos procedimientos y asignar el mismo tipo de datos.

Solución 2: Una solución alternativa es hacer que la declaración de variable sea obligatoria agregando la palabra "Option Explicit" en la parte superior del módulo.

Lo que esto hará es que antes de que muestre el error VBA “ByRef Argument Type Mismatch”, en realidad nos pide que declaremos la variable primero.

Entonces, Option Explicit siempre es útil en VBA.

Cosas para recordar

  • ByRef es lo contrario de By Val.
  • ByRef lleva la referencia de un procedimiento a otro.
  • El nombre de la variable y el tipo de datos deben ser los mismos en ambos procedimientos.
  • Cada variable debe declararse por separado en el caso de múltiples variables.