Saltar al contenido

Consulta de Access en Excel


Recommended Posts

publicado

Buenos días;

Me estoy liando un poco con las consultas por SQL en Access desde Excel, por favor, me podéis asesorar ( esto no lo había tocado nunca ).

Hace un par de semanas empecé a tocar las consultas por SQL, vi un par de videos, hice algún ejercicio, etc…pero no me ha quedado muy claro ya que en cada sitio veo una cosa.

Las primeras consultas que hice por SQL las hice con “Execute”, la verdad que me funcionaba bien hasta que he probado con un Access que tengo en red con muchas líneas y ……. tarda muchísimo en obtener los datos, investigando por internet, parece ser que la mayoría de la gente usa “Recordset”.

Qué diferencia hay??,

Yo en principio solo lo voy a usar para consultas de 2 o 3 condiciones y para contar registros ( no quiero modificar nada de la base de datos Access ).

Usando “Execute” creo que se ha modificado algo de la base de datos Access o ha dado la casualidad de que alguien ha borrado los datos de ciertas columnas.

Os adjunto la macro que tengo con “Execute” para consultar con 2 condiciones y la macro que tengo para contar registros con 3 condiciones ( gracias a nuestro compañero @Avalencia ) para que me ayudéis a modificar con “Recordset” si es mejor opción que “Execute” ( he probado a modificar por probar y solo tengo errores ).

Muchas gracias de antemano.

Ejemplos.xlsm

publicado

Hola

Cada método, sea Execute u Open del Recordset, tiene sus adeptos y sus detractores, creo que es relativamente complicado decir cuál es mejor que el otro y yo diría que más bien lo que hay que ver/saber es cuándo es mejor usar uno u otro.  Ah, eso sí, en casos como el tuyo en donde usar Count, por ejempo, usar Execute tiene alguno dilemas como el que no puede establecerse algunas propiedades al RecorSet, pero ya te lo había comentado.

Sobre la perdida de datos, no tiene que ver con el método usado, solo hay dos posibilidad: O alguien lo borró o mandaste sentencias SQL que lo borraron. No olvidar que si bien tu usas SQL para extraer datos, también se puede insertar, eliminar, etc.

Sobre cambiar lo que tienes  ¿por qué? ¿tan lento va? ¿no será cuestión de la PC y/o la red? Sugiero, si ya te es útil lo que tienes, dejarlo así. Eso sí, cuando busques cómo hacer más cosas, elige (de preferencia, creo yo) cuál método usarás y no te compliques viendo "un poco de todo" que eso te va a, cuando menos, marear. Ya si sigues programando, más adelante puedes ir abarcando más cosas.

Ah, yo por años de trabajo, uso Open del Recordset

Saludos

Abraham Valencia

 

publicado

Quizás, añadiendo Application.ScreenUpdating = False mejoraría. ;)

Yo estoy mas cómodo con Execute y GetRows/Range.CopyFromRecordset, pero para gustos, colores.

publicado
En ‎22‎/‎03‎/‎2019 at 18:09 , avalencia dijo:

Hola

Cada método, sea Execute u Open del Recordset, tiene sus adeptos y sus detractores, creo que es relativamente complicado decir cuál es mejor que el otro y yo diría que más bien lo que hay que ver/saber es cuándo es mejor usar uno u otro.  Ah, eso sí, en casos como el tuyo en donde usar Count, por ejempo, usar Execute tiene alguno dilemas como el que no puede establecerse algunas propiedades al RecorSet, pero ya te lo había comentado.

Sobre la perdida de datos, no tiene que ver con el método usado, solo hay dos posibilidad: O alguien lo borró o mandaste sentencias SQL que lo borraron. No olvidar que si bien tu usas SQL para extraer datos, también se puede insertar, eliminar, etc.

Sobre cambiar lo que tienes  ¿por qué? ¿tan lento va? ¿no será cuestión de la PC y/o la red? Sugiero, si ya te es útil lo que tienes, dejarlo así. Eso sí, cuando busques cómo hacer más cosas, elige (de preferencia, creo yo) cuál método usarás y no te compliques viendo "un poco de todo" que eso te va a, cuando menos, marear. Ya si sigues programando, más adelante puedes ir abarcando más cosas.

Ah, yo por años de trabajo, uso Open del Recordset

Saludos

Abraham Valencia

 

 

En ‎22‎/‎03‎/‎2019 at 18:36 , Antoni dijo:

Quizás, añadiendo Application.ScreenUpdating = False mejoraría. ;)

Yo estoy mas cómodo con Execute y GetRows/Range.CopyFromRecordset, pero para gustos, colores.

muchas gracias a los 2.

@avalencia, la verdad que va muy lento, puede ser por el servidor pero ..... voy a intentar probar con redcorset por si fuera mejor ( seguro que va igual pero no pierdo nada ).

He escrito las siguientes lineas pero me da error de compliación "no se ha definido el tipo definido pot el usuario".

Que tengo mal??.

-----------

Sub Consulta_Recorset()

Dim Conn As ADODB.Connection
Dim MiConexion
Dim Rs As ADODB.Recordset
Dim Query As String
Dim cont, j

tipoBusqueda = Cells(1, 5)
campo1 = Cells(2, 1)
datoCampo1 = Cells(2, 2)
campo2 = Cells(3, 1)
datoCampo2 = Cells(3, 2)

Set Conn = New ADODB.Connection
MiConexion = "C:\Users\Desktop\Base.accdb"

With Conn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Open MiConexion
End With

Query = "SELECT * FROM Consulta WHERE " & campo1 & complementoBusqueda1 & datoCampo1 & _
                    " and  " & campo2 & complementoBusqueda1 & datoCampo2

Set Rs = New ADODB.Recordset
Rs.CursorLocation = adUseServer
Rs.Open Source:=Query, _
ActiveConnection:=Conn

'Valir si la consulta devuelve resultados
If Rs.EOF And Rs.BOF Then
    'Borrar la conexión al Recordset
    Rs.Close
    Conn.Close
    'Borrar la memoria
    Set Rs = Nothing
    Set Conn = Nothing
   
    MsgBox "No hay resultados para la consulta", vbInformation, "Infooo..."
    Exit Sub
End If

'Recorrer el Recordset
Rs.MoveFirst
cont = 2

For j = 1 To 4
        Cells(cont, 0) = Rs.Fields(j).Name
Next j
   
Do
    Cells(cont, 1) = Rs!(0)
    Cells(cont, 2) = Rs!(1)
    Cells(cont, 3) = Rs!(5)
    Cells(cont, 4) = Rs!(2)
   
    cont = cont + 1
   
    Rs.MoveNext
       
Loop Until Rs.EOF

'Cerrar la conexión
Rs.Close
Conn.Close
Set Rs = Nothing
Set Conn = Nothing

End Sub

---------

Ejemplos.xlsm

publicado

El erro es debido a que no has activado las referencias a "Microsoft ActiveX Data Object x.x Library", en donde x.x es el número de la versión superior que tienes (OJO, vas a tener varias versiones, recomiendo usar la "mayor" - no confundir con otros de nombre arecido)-

Abraham Valencia

PD: Tu cadena SQL, tal cual está ahí, no tiene sentido, hay hasta variables que no existen; a menos que hayas eliminado/cortado algo que no deseabas enviar

publicado
Hace 1 hora, avalencia dijo:

El erro es debido a que no has activado las referencias a "Microsoft ActiveX Data Object x.x Library", en donde x.x es el número de la versión superior que tienes (OJO, vas a tener varias versiones, recomiendo usar la "mayor" - no confundir con otros de nombre arecido)-

Abraham Valencia

PD: Tu cadena SQL, tal cual está ahí, no tiene sentido, hay hasta variables que no existen; a menos que hayas eliminado/cortado algo que no deseabas enviar

Lo he activado ( es la versión 6.0 ) y me sigue dando el mismo error.

He activado también el "Microsoft ActiveX data objects recordarte 6.0 library" por si fuera eso y nada, el mismo error.

Las variables del SQL es verdad que hay no están definidas, fue un copia pega de la otra macro y no copié las definiciones.

Que me falta??, No doy con ello.

Muchas gracias.

publicado

Vale, creo que ya he conseguido que medio funcione pero me da error al poner los encabezados.

adjunto excel actualizado.

Ejemplos.xlsm

publicado

Pues si tu dilema es que los nombres de los encabezados no coinciden con los campos que finalmente usas, eso es debido a que extraes esos nombres con un bucle del 1 al 4 y los campos, en cambio, lo haces con índices específicos: 0, 1, 5 y 2. Obviamente no van a coincidir. 

¿Es eso?

Abraham Valencia 

PD: No es necesario volver a enviar tu archivo, en realidad no se puede probar ya que solo tu tienes el Access. Basta ver la macro

publicado
Hace 17 horas, avalencia dijo:

Pues si tu dilema es que los nombres de los encabezados no coinciden con los campos que finalmente usas, eso es debido a que extraes esos nombres con un bucle del 1 al 4 y los campos, en cambio, lo haces con índices específicos: 0, 1, 5 y 2. Obviamente no van a coincidir. 

¿Es eso?

Abraham Valencia 

PD: No es necesario volver a enviar tu archivo, en realidad no se puede probar ya que solo tu tienes el Access. Basta ver la macro

Menuda cabeza la mía.

Uno se cierra en algo y ya no ve más.

Lo acabo de solucionar.

Muchas gracias @avalencia.

 

Archivado

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

  • 109 ¿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

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Vale mil gracias, en vdd se agradece todo el apoyo y comentarios
    • Hola nuevamente. Por eso la importancia de lo que mencionas tú como "ruta relativa". Tal cual comentas, y aún sin llegar a algunos detalles importantes para ayudarte, en realidad tal cual te comenté le día miércoles, pues sí podías hacer como comentabas, era cosa de obtener los Id de Windows (como tú los llamas) y la ruta de OneDrive en casa usuario y eso sí se puede obtener con VBA y luego pasarlo a PQ, pero medio que te cerraste en que "PQ no puede trabajar con rutas relativas", cosa cierta pero siempre hay formas. Si SAP puede o no guardar en OneDrive o SharePoint, pues si está mapeado en la PC ¡claro que se puede! Pero bueno, creo que si te es útil tu propia propuesta ¡avanza con eso!
    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
  • 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.