Saltar al contenido

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.

Enlace a comentario
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.

Enlace a comentario
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

Enlace a comentario
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.

Enlace a comentario
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.

 

Enlace a comentario
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

Enlace a comentario
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.

 

Enlace a comentario
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.

Enlace a comentario
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

Enlace a comentario
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.

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 96 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Con el diseño así como lo tiene en su libro, una fórmula de BUSCARV con COINCIDIR debería ser de utilidad =C5*BUSCARV($C$1,Tabla1[#Todo],COINCIDIR($D5,Tabla1[#Encabezados],0)) Es con lo que participaría en su consulta. Lo que resta es definir que hacer si no encuentra la OT porque así como esta le devolvería error en ese caso, o si tiene condiciones que haya podido omitir también le afectarían el resultado.
    • He cambiado mi macro a este: Sub repetir() Set a = Sheets(ActiveSheet.Name) uf = a.Range("C" & Rows.Count).End(xlUp).Row 'ultima fila con datos ActiveCell.Select ActiveCell.Offset(1, 0).Select   'Application.OnTime Now + TimeValue("00:00:10"), "repetir", , True End If End Sub   Lo que no se es como detenerlo al llegar a la ultima fila con datos de la columna C. Muchas gracias
    • Buenas tardes a todos. Tengo un problema que preciso de vuestra ayuda.  Tengo que controlar los gastos de la oficina que trabajo y he de repartir unos gastos a % según una OT y unos tipos de gastos. Envío un archivo adjunto. Lo que necesito es que lo que aparece en la columna en amarillo lo haga automáticamente, teniendo en cuenta los datos de la tabla a la derecha. Por ejemplo, el primer gasto tiene una cuota de 1477 euros y teniendo en cuenta que es un gasto de tipo Común y que la OT es la 12810234, le corresponde un gasto de 605,57 euros ya que según la tabla de la derecha su % a imputar es de un 41%. ¿alguien me puede ayudar con la formula? He de añadir muchas más líneas y más hojas con el resto de OT y en el futuro cambiar más datos, así que necesito automatizarlo con una formula Excel. Gracias. Control de gastos.xlsx
    • Hola buenas tardes: Por favor me pueden ayudar a realizar lo siguiente. ejecutar una macro después de un tiempo, que recorra una columna a partir de la celda activa hacia abajo. Es una lista extensa, que filtro desde la columna B. y solo me muestra las filas que me interesan. ejemplo: Si mi celda activa es la C23 ejecutar la macro y baje una celda y repite la macro después de 20 segundos y lo vuelve hacer(Simpre bajando una celda), y que este se detenga hasta la ultima fila que este visible en el filtro. Ya que puedo tener muchos datos mas.   Gracias   Prueba filtro y avance.xlsm
    • Muchísimas gracias @Victor7 es realmente increíble. Ahora toca aprender un poco sobre como esta montada esta formula,  pero me ha encantado. Es justo lo que necesitaba. Solo he notado algún fallo cuando los datos no están bien introducidos, por ejemplo hay registro en el punto de control 2 y no en el tres, pero eso en teoría no debería pasar, pero ya sabes como es esto jajaj.  Muchas gracias de verdad. Un saludo
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.