Tipo de argumento ByRef incompatible
Resuelto
Robix
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención -
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
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
Enlaces relacionados:
- [VBA] Operación no permitida para este tipo de objeto.
- Error de ejecución '13': Incompatibilidad de tipo
- error de compilación tipo definido por el usuario no definido
- La conversión de la cadena "" a tipo 'Double' no es válida.
- Error de ejecución 13: incompatibilidad de tipo
- tipo definido por el usuario no definido
3 respuestas
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención Embajador 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 agregaroption 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?-
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...- 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 escribesfrmcam1.ldmvt.Value
, no controlas su tipo.
si escribescstr(frmcam1.ldmvt.Value)
, odim ch as string ch=frmcam1.ldmvt.Value
, estás seguro del tipo que obtienes.
-
-
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" -
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!