Tipo de argumento ByRef incompatible

Resuelto
Robix -  
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   -
Hola,

Una nueva pregunta para la comunidad...
Aquí está el problema:
Este se divide en dos partes:

[1] Una primera parte compuesta por un módulo en el que he creado una función específica:
Function Cam_2_Contacts(A0 As Double, A1 As Double, A2 As Double, levee_max As Double, l As String, t2 As Double, t3 As Double, t4 As Double, t5 As Double, t6 As Double, t7 As Double, t8 As Double)
Esta debe devolver un conjunto de valores en una hoja de Excel.

[2] Una segunda parte compuesta por un Userform en el que ingreso los valores deseados para ejecutar mi función (A0, A1,....). Para ello, he decidido que una vez que los valores estén ingresados en mi formulario, solo necesito presionar un botón para ejecutar la función de arriba y devolverme los valores calculados por esta misma función en una hoja de Excel. Por lo tanto, he codificado de la siguiente manera:

Private Sub CommandButton1_Click()
B0 = CDbl(frmcam1.A0.Value)
B1 = CDbl(frmcam1.A1.Value)
B2 = CDbl(frmcam1.A2.Value)
l = CDbl(frmcam1.levee_max.Value)
p2 = CDbl(frmcam1.t2.Value)
p3 = CDbl(frmcam1.t3.Value)
p4 = CDbl(frmcam1.t4.Value)
p5 = CDbl(frmcam1.t5.Value)
p6 = CDbl(frmcam1.t6.Value)
p7 = CDbl(frmcam1.t7.Value)
p8 = CDbl(frmcam1.t8.Value)
test = Cam_2_Contacts(B0, B1, B2, l, frmcam1.ldmvt.Value, p2, p3, p4, p5, p6, p7, p8)
End Sub

frmcam1 siendo el nombre de mi userform.

El problema es el siguiente...
Cuando hago clic en el CommandButton1 de mi userform después de haber ingresado todos mis datos, el programa me devuelve un mensaje de error:
Tipo de argumento ByRef incompatible
He probado todos los datos (MsgBox VarType()) y todos son conformes al tipo requerido para la ejecución de mi función anterior.

Aclarar que soy un novato en VBA...

Agradezco la ayuda que me puedan aportar...

Robix
Configuración: Windows / Chrome 80.0.3987.163

3 respuestas

yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Ambassadeur 1 588
 
hola, para empezar, ¿puedes utilizar las etiquetas de código cuando publiques código y indicar en qué línea se produce el mensaje de error?
luego, si no lo has hecho aún, ¿puedes agregar
option explicit
al principio del módulo?
después, ¿puedes mostrarnos la respuesta (MsgBox VarType()) para cada una de estas variables?

has elegido, para uno de los parámetros, no pasar por una variable. ¿has intentado usar una variable para este parámetro?
1
Robix
 
Ok, sí, disculpa por la presentación un poco horrible...

He vuelto a hacer algunas pruebas: Al querer forzar un poco, en primer lugar, eliminé por completo los tipos de mis variables en mi función:
Function Cam_2_Contacts(A0, A1, A2 , levee_max , l , t2, t3 , t4, t5 , t6 , t7 , t8)

Al hacerlo así, no hubo más problemas, todo funciona...

Luego...
Al volver a poner los tipos respectivos de cada variable e insertar MsgBox VarType por todas partes, obtengo lo siguiente:
5 (B0)
5 (B1)
5 (B2)
5 (l)
8 (ldmvt)
5 (p2)
5 (p3)
5 (p4)
5 (p5)
5 (p6)
5 (p7)
5 (p8)
Al poner option explicit al principio del módulo (lo que no había hecho), el mensaje indica un error en la línea 5 del siguiente código:
Private Sub CommandButton1_Click() B0 = CDbl(frmcam1.A0.Value) B1 = CDbl(frmcam1.A1.Value) B2 = CDbl(frmcam1.A2.Value) l = CDbl(frmcam1.levee_max.Value) p2 = CDbl(frmcam1.t2.Value) p3 = CDbl(frmcam1.t3.Value) p4 = CDbl(frmcam1.t4.Value) p5 = CDbl(frmcam1.t5.Value) p6 = CDbl(frmcam1.t6.Value) p7 = CDbl(frmcam1.t7.Value) p8 = CDbl(frmcam1.t8.Value) test = Cam_2_Contacts(B0, B1, B2, l, frmcam1.ldmvt.Value, p2, p3, p4, p5, p6, p7, p8) End Sub

Este error indica que la variable no está definida...

Para terminar, mi última prueba fue rehacer el código de la siguiente manera:
Private Sub CommandButton1_Click() A0 = CDbl(frmcam1.A0.Value) A1 = CDbl(frmcam1.A1.Value) A2 = CDbl(frmcam1.A2.Value) levee_max = CDbl(frmcam1.levee_max.Value) ldmvt = frmcam1.ldmvt.Value t2 = CDbl(frmcam1.t2.Value) t3 = CDbl(frmcam1.t3.Value) t4 = CDbl(frmcam1.t4.Value) t5 = CDbl(frmcam1.t5.Value) t6 = CDbl(frmcam1.t6.Value) t7 = CDbl(frmcam1.t7.Value) t8 = CDbl(frmcam1.t8.Value) test = Cam_2_Contacts(A0, A1, A2, levee_max, ldmvt, t2, t3, t4, t5, t6, t7, t8) End Sub


He renombrado deliberadamente las variables en relación con la respuesta de la segunda persona en mi publicación ( = por claridad para quienes lo usarán).
Y AHORA... ¡TODO FUNCIONA!

Sigo perplejo sobre el origen: Tal vez, como insinuabas, el error venía de mi deseo de no asignar una variable a uno de mis parámetros...

¡Gracias por el tiempo que me has dedicado! (Y gracias por el option explicit) que no conocía...
0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Robix
 
no nos muestras las declaraciones, que deberían situarse en la sub.
0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Robix
 
según yo, es preferible, en la declaración de la función, declarar los tipos de todos los parámetros.
es preferible no usar los mismos nombres de variables en la declaración de la función y en la llamada de la función.
es preferible no dejar ambigüedad sobre el tipo de lo que utilizas.
cuando escribes
frmcam1.ldmvt.Value
, no controlas su tipo.
si escribes
cstr(frmcam1.ldmvt.Value)
, o
dim ch as string ch=frmcam1.ldmvt.Value
, estás seguro del tipo que obtienes.
0
NHenry Mensajes publicados 15235 Fecha de registro   Estado Moderador Última intervención   387
 
A mi parecer, esto proviene del valor "frmcam1.ldmvt.Value" (tipado como Object, creo)

Una buena práctica es que si no necesitas modificar los valores pasados como parámetros en tu función, debes especificar en la declaración ByVal:
Sub MaSub(ByVal Parameter1 As Double, ...)


Además, piensa en dar nombres explícitos a tus variables (p1, p2, t3, b0 no son muy claros)

--
Intervengo principalmente en VB6 y VB.NET, con un poco de C#, pero la moderación me lleva a menudo a otros lenguajes.
En VB.NET piensa en activar "Option Explicit" y "Option Strict"
1
Robix
 
He realizado algunas pruebas que expliqué en una respuesta anterior...
Aparentemente, "frmcam1.ldmvt.Value" parecía estar atascado, de hecho...
Para seguir tu comentario, me permito hacerte una pregunta: ¿Cuál sería el valor de retorno al utilizar la función VarType en el caso de que el valor esté tipado como Object?
Gracias por estas dos pequeñas lecciones de codificación ;-)
En cuanto a los nombres explícitos, los usuarios de este programa prefieren quedarse con esos nombres... ¡Sigo órdenes!

¡Gracias por todo!
0