En este grupo En todos

Foro de Excel



El tipo de argumento ByRef no coincide

Juanjo
Valencia, España
Escrito por Juanjo Iprou
el 20/03/2013

Hola Abraham,

Me pasa exactamente lo mismo que a Joel en este post:

Https://grupos.emagister.com/debate/error_de_visual_byref_no_coincide_/6610-838526

He probado lo que comentabas pero me sigue dando error.

En mi caso hay una diferencia y es que la variable es, en realidad, una matriz "y()" que defino como Double:

Dim y() as Double

Luego, al llamar a la funcion:

Call QuickSort(y, LBound(y), UBound(y))

Que está definida como:

Public Sub QuickSort(vArray As Double, inLow As Long, inHi As Long)

Me da un error en la "y" (no en LBound ni en UBound). El error dice: "Error de compilación: El tipo de argumento ByRef no coincide".

No entiendo qué pasa porque "y" está definida como Double y la función QuickSort la espera como Double. Añadir que, si defino "y" como Variant no me da ningún problema, pero esa no es la solución.

Muchas gracias de antemano. Saludos.

Mauricio Robayo
Bogotá, Colombia
Escrito por Mauricio Robayo
el 21/03/2013

Hola,

Al definir

Dim y() as double

Estás definiendo un array que va a contener datos de tipo double. Pero no es una variable tipo double, es un array que va a contener datos tipo double.

El parámetro que lo recibe en la función QuickSort lo tienes como double, así que espera un dato tipo double y "y" no lo es, pues es un array de double, no un double.

Siendo así, debes modificar para que la función reciba un array de doubles y no un double:

... Quicksort(vArray() as double,....

Con respecto al título de tu mensaje:

El tipo de argumento ByRef no coincide

Sólo recordar que los arrays siempre y sólo se deben pasar por referencia, nunca por valor. Esto porque es más fácil y económico pasar un puntero al array y no hacer una copia del array cuando lo pasas. Por defecto, si no lo especificas, VBA pasa los argumentos por referencia, así que como lo estás usando todos los argumentos serán pasados por referencia (el puntero a la variable). Si quieres especificar esto y tener un poco más de control, deberías usar algo como:

Public Sub QuickSort(ByRef vArray() As Double, ByVal inLow As Long, ByVal inHi As Long)

Juanjo Iprou
Valencia, España
Escrito por Juanjo Iprou
el 21/03/2013

Muchísimas gracias Mauricio! Es exactamente como has dicho! Lo he probado y funciona.

Una pequeña duda que me sigue quedando: ¿Por qué si defino las variables como Variant en lugar de Double no da ningún error a pesar de que llamo a la función como

QuickSort (y,... ) en lugar de

QuickSort (y(),...)?

¿Es más económico en cuanto a memoria o velocidad de procesamiento usar Double en lugar de Variant?

Muchas gracias de nuevo! Un saludo.

Mauricio Robayo
Bogotá, Colombia
Escrito por Mauricio Robayo
el 21/03/2013

Hola,

Variant es un comodín y le dice a VBA que tenga listo ese espacio de memoria para almacener cualquier cosa. Una vez almacenas algo en la variable, la variable asume el tipo de datos pasado. Por eso mismo es más costoso en memoria y procesamiento, pero con los computadores de hoy en día, apenas notarás la diferencia.


Sub ejemplo()


Dim y As Variant


Y = 1

Debug. Print TypeName(y)


Y = "hola"

Debug. Print TypeName(y)


Y = Array(1, 2, 3, 4, 5)

Debug. Print TypeName(y)


End Sub

Juanjo Iprou
Valencia, España
Escrito por Juanjo Iprou
el 21/03/2013

Muchas gracias de nuevo!