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
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
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?
luego, si no lo has hecho aún, ¿puedes agregar
option explicital 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?
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:
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"
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!
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!
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:
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:
Este error indica que la variable no está definida...
Para terminar, mi última prueba fue rehacer el código de la siguiente manera:
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...
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 , no controlas su tipo.
si escribes , o
, estás seguro del tipo que obtienes.