Jump to content
lphant

Consulta de Access en Excel

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

Edited by Antoni

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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.

 

Share this post


Link to post
Share on other sites



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png