Saltar al contenido
Pirtrafilla

Problema con macro usando sql

Recommended Posts

Hola de nuevo.

Tengo un problema, para mi muy grande, porque llevo horas intentando encontrar que pasa y no consigo verlo.

Uso una macro al abrir el formulario, parte de ella rellena un Combobox. Y lo hace sin problemas.

El problema viene en el evento Change de un boton que he puesto.

Copio el código que tengo al abrir el formulario...

Private Sub UserForm_Initialize()
'
'cargamos los datos seleccionados del listbox del Userform3
id1 = UserForm3.ListBox2.List(it2, 0) 'cogemos el ID del registro del Listbox Checklist seleccionado
'cargamos los datos en los Combobox y Textbox haciendo una consulta Sql y tomando como dato de referencia el ID
Conexión
Sql = "Select * From Tb_Checklist Where [Id]=" & id1 '& "'"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox1 = Rst.Fields(1).Value
ComboBox2 = Rst.Fields(4).Value
ComboBox3 = Rst.Fields(2).Value
ComboBox4 = Rst.Fields(3).Value
TextBox1 = Rst.Fields(5).Value
TextBox2 = Rst.Fields(6).Value
TextBox3 = Rst.Fields(7).Value
TextBox4 = Format(Rst.Fields(8).Value, "Currency")
TextBox5 = Rst.Fields(9).Value * 100
TextBox6 = Format(Rst.Fields(10).Value, "Currency")
TextBox7 = Format(Rst.Fields(11).Value, "Currency")
TextBox8 = Format(Rst.Fields(13).Value, "Currency")
TextBox9 = Rst.Fields(0).Value
Rst.Close

'macro para llenar el combobox OT
Conexión
Sql = "Select distinct [OT] From Tab_OT ORDER BY [OT] DESC"
'Sql = "Select [OT] From Tab_OT GROUP BY [OT] ORDER BY [OT] DESC, [FECHA_Inicio] DESC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox1.Column = Rst.GetRows
Rst.Close

'macro para llenar el combobox AGRUPACION
Conexión
Sql = "Select distinct [AGRUPACION] From Grupos ORDER BY [AGRUPACION] ASC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox3.Column = Rst.GetRows
Rst.Close

'macro para llenar el listbox GRUPOS
Conexión
Sql = "Select distinct [GRUPO] From Grupos WHERE [AGRUPACION]= '" & ComboBox3.Value & "'" & " ORDER BY [GRUPO] ASC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox4.Column = Rst.GetRows
Rst.MoveFirst
If ComboBox4 = "" Then ComboBox4 = Rst.Fields(0).Value
Rst.Close

Conn.Close
Set Rst = Nothing: Set Conn = Nothing
End Sub

El problema viene cuando ejecuto la macro del botón que rellena el Combobox GRUPOS. Cuando cambio el dato que hay en el Combobox AGRUPACION quiero volver a cargar el Combobox GRUPOS puesto que los datos deben cambiar. Pero me da error.

Este es el código.

Private Sub ComboBox3_Change()
''macro para llenar el combobox GRUPOS
Conexión
Sql = "Select distinct [GRUPO] From Grupos WHERE [AGRUPACION]= '" & ComboBox3.Value & "'" & " ORDER BY [GRUPO] ASC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox4.Column = Rst.GetRows
Rst.MoveFirst
If ComboBox4 = "" Then ComboBox4 = Rst.Fields(0).Value
Rst.Close

Conn.Close
Set Rst = Nothing: Set Conn = Nothing
End Sub

Y el error que me da es este.

image.png.8c5a55767b4ba01b64bffec2b49442b1.png

No le veo la salida, si no me echéis una mano estoy atascado aquí.

Os lo agradezco de antemano.

Moisés.

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

Es cusriosa una cosa.

Para ver donde se detenía el código he puesto un mensaje "hola" linea a linea, y se detiene cuando acaba la macro, no antes.

Así que no tengo pistas de donde está el error. Estoy muy perdido.

Private Sub ComboBox3_Change()
''macro para llenar el combobox GRUPOS
Conexión
Sql = "Select distinct [GRUPO] From Grupos WHERE [AGRUPACION]= '" & ComboBox3.Value & "'" & " ORDER BY [GRUPO] ASC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox4.Clear
ComboBox4.Column = Rst.GetRows
Rst.Close
Conn.Close
Set Rst = Nothing: Set Conn = Nothing
MsgBox "hola"
End Sub

Moisés.

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

Hola

Hay una diferencia entre los supuestos mismos códigos que colocas, en un evento Change del Combobox3 hay un Clear al Combobox4 y en otro no. También mencionas un botón que rellena un combobox pero tampoco colocasel código asociado. Fuera de eso lo más probable es que tengas combobox dependientes y al "limpiar" (Clear) alguno con ese botón, obviamente se activan los eventos "Change" y al ser dependientes y no haber datos  pues dan error. ¿Será eso? Confirma.

Abraham Valencia

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs
Hace 6 minutos , avalencia dijo:

Hola

Hay una diferencia entre los supuestos mismos códigos que colocas, en un evento Change del Combobox3 hay un Clear al Combobox4 y en otro no. También mencionas un botón que rellena un combobox pero tampoco colocasel código asociado. Fuera de eso lo más probable es que tengas combobox dependientes y al "limpiar" (Clear) alguno con ese botón, obviamente se activan los eventos "Change" y al ser dependientes y no haber datos  pues dan error. ¿Será eso? Confirma.

Abraham Valencia

Hola Abraham, gracias por responder.

En el evento Private Sub UserForm_Initialize() aparece el código que relleno el combobox4, el código completo está más arriba, aquí solo la parte que rellena el Combobox4

'macro para llenar el listbox GRUPOS
Conexión
Sql = "Select distinct [GRUPO] From Grupos WHERE [AGRUPACION]= '" & ComboBox3.Value & "'" & " ORDER BY [GRUPO] ASC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox4.Column = Rst.GetRows
Rst.MoveFirst
If ComboBox4 = "" Then ComboBox4 = Rst.Fields(0).Value
Rst.Close

Luego, en el evento Change del Combobox3 le digo que vuelva a rellenar el combobox4.

Una de las cosas que hago primero es "Clear" el Combobox4 para volver a rellenarlo.

He quitado el "Clear" y sigue el mismo error.

Este es el código.

Private Sub ComboBox3_Change()
''macro para llenar el combobox GRUPOS
Conexión
Sql = "Select distinct [GRUPO] From Grupos WHERE [AGRUPACION]= '" & ComboBox3.Value & "'" & " ORDER BY [GRUPO] ASC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox4.Column = Rst.GetRows
Rst.Close
Conn.Close
Set Rst = Nothing: Set Conn = Nothing
End Sub

Moisés.

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

El error ocurre cuando cambio los datos del Cobobox3. El código Change del Combobox 3 es el que he puesto antes.

Private Sub ComboBox3_Change()
''macro para llenar el combobox GRUPOS
Conexión
Sql = "Select distinct [GRUPO] From Grupos WHERE [AGRUPACION]= '" & ComboBox3.Value & "'" & " ORDER BY [GRUPO] ASC"
Rst.Open Sql, Conn, 3, 3, 1
ComboBox4.Column = Rst.GetRows
Rst.Close
Conn.Close
Set Rst = Nothing: Set Conn = Nothing
End Sub

Cuando cambio el dato que hay en el Combobox3 quiero que el Combobos4 cambie los datos que tiene. Entonces salta el error.

Es decir, primero lleno los Combobox en el evento "UserForm_Initialize", pero cuando cambio el dato que hay en el Combobox3 quiero de nuevo modificar lo que hay en el Combobox4 y eso lo hago a través del evento "Change" del Combobox3, que es donde salta el error.

Moisés.

 

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

Estimado, pregunto otra vez, o sea ¿no hay nada en el evento Change del Combobox4?  De no haber nada, copia tu archivo Access, borra las tablas del archivo, solo deja la de los datos de los combobox, y luego envía el Access y el Excel para verificar. Coloca todo en un Drive de no poder adjuntarse por aquí. Si hay algo, pues, he ahí el dilema pero no lo muestras jejeje.

Abraham Valencia

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

@avalencia, hola Abraham.

Subo los archivos.

https://drive.google.com/open?id=1OqMosWrdZ5kVy_T5KDztJ0vG8oB5mpQ9

Veras que hay 3 archivos.

Un txt donde está la dirección de la base de datos. Cuando abras la base de datos si no encuentra la ruta te preguntará y podrás cambiar la ruta sin necesidad de tocar el txt.

Un Access donde he dejado los datos mínimos, para poder probar.

El Excel, Checklist. Este contiene las macros.

Cuando lo abras selecciona esta opción:

image.png.36cd035d772c635c29a17ac3a06bf073.png

En el siguiente formulario, deja el checkbox de OT con la OT que pongo en la foto (12810159), selecciona en el listbox de la derecha "ALQUILERES" y luego en cualquiera de los apuntes que hay en el listbox de la derecha haz DobleClick. Ahí saltará el error. En el entorno VBE es el Userform5. La intención es que al hacer DocbleClik se abra el formulario en cuestión y permita editar el registro.

image.png.99732259fc32330d0a7b4573aae73c1e.png

Verás que si le das a NUEVO te sale otro formulario y este no da errores. Puedo añadir registros sin problemas.

Si le puedes echar un vistazo al resto del código y me puedes dar algún consejo bienvenido será. Ya verás que no estoy muy fino con las consultas SQL, hago hasta donde sé o donde busco, pero estoy seguro que se puede hacer mucho más corto el código, pero no se hacerlo.

Y si alguien más quiere mirar y comentar todo lo que me ayude a aprender lo agradezco.

Gracias de antemano.

Moisés.

 

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

Hola

Ya viendo todo se hace evidente el error: En el evento Initialize del Userform3 colocas una variable llamada "it2" a la que no le das valor, al no tener valor asignado, causa el error.  

Saludos

Abraham Valencia

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs
Hace 20 minutos , avalencia dijo:

Hola

Ya viendo todo se hace evidente el error: En el evento Initialize del Userform3 colocas una variable llamada "it2" a la que no le das valor, al no tener valor asignado, causa el error.  

Saludos

Abraham Valencia

Hola, la variable efectivamente no estaba, la debí borrar. Ya la he puesto. Pero el error es el mismo.

Puedes corregir el código y ponerla ta y como pongo aquí.

Private Sub UserForm_Initialize()
'
'cargamos los datos seleccionados del listbox del Userform3
it2 = UserForm3.ListBox2.ListIndex
id1 = UserForm3.ListBox2.List(it2, 0) 'cogemos el ID del registro del Listbox Checklist seleccionado

He añadido esta línea: it2 = UserForm3.ListBox2.ListIndex

Mira una cosa. Si quitas el evento Private Sub ComboBox3_Change() veras que no salta el error, solo que entonces no hace lo que necesito que haga. Es en ese evento donde salta el fallo.

En el botón NUEVO del Userform3 se abre otro formulario con un evento similar que no da el fallo, pero en el Userform5 es donde me da el fallo.

Envío de nuevo el archivo modificando la línea que faltaba de la variable.

https://drive.google.com/open?id=1otnZ9Gxs09BFDPznVMGv5aKHdv1atnKf

Ojalá se pueda localizar el error, estoy atascado.

Moisés.

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

Hola nuevamente

Primero que nada, no revisé todo pero cambié tu variable "idl" por "xxx", parece que en algún lado causaba conflicto pero casi no declaras variables y por ende hubiese requerido tiempo buscar el problema.

Segundo, tal como ya mencionaba casi al inicio, el dilema (también) está en el evento Change de tu combobox. Obviamente al usar el evento Initialize para cargar tu(s) combobox, se dispara su evento Change genernado conflicto (es muy usual al usar dicho evento) por lo que hay que evitar que ocurra anulando el evento. Excel tiene una propiedad: Application.EnableEvents pero el dilema es que solo funciona a nivel de hojas, no de Userform y/o sus controles. Entonces lo que hay que hacer es simularlo a través de una variable publica boleana que he llamado "EnableEvents". La verás al inicio declarada en el UserForm5. Luego se usa con True o False para evitar el "conflicto". Mira bien, está en el evento Initialize y en el evento Change del Combobox3. Trata de entenderla para que si vas a usar más combobox dependientes, puedas seguir usándola.

Enlace

Saludos

Abraham Valencia

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

Hola Abraham.

Muchas gracias, ahora si que funciona y ya veo el "truco" de la variable. Lo voy a tener en cuenta para otros Combobox dependientes sino el error me volverá a saltar. De hecho ya lo he colocado en otro Combobox y he terminado también los eventos BeforeUpdate de los textbox para que calcule bien los importes. Un poco liado con los valores nulos, seguro que hay manera de hacerlo mejor, pero me ha funcionado evitando If_Then.

Lástima que ahora lo que no consigo es que funcione el UPDATE, me dice no coinciden los tipos. Voy a averiguar que le pasa, pero con el SQL me lío bastante, sobre todo porque no se cuando van ", o '", o " ' ". Así que iré probando hasta averiguar porqué no funciona.

Envío como queda el archivo Excel hasta ahora y muchas gracias.

https://drive.google.com/open?id=1T42611hsXet6SDCtprb7N8lrOllJFK9U

Moisés.

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs

Crear una cuenta o conéctate para comentar

Necesitas ser usuario para poder dejar un comentario

Crear una cuenta

Registrarse para una nueva cuenta en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectarse

¿Ya tienes una cuenta? Conéctate aquí.

Conéctate ahora

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.