Como pasar pasar un parámetro a una consulta de access desde excel.

Solicito a quien pueda ayudarme, que me indique como pasar un parámetro desde excel a una consulta de access ; la consulta que se genera en access PIDE el parámetro: el nit por ejemplo.

Dim MyDatabase As DAO.database

'MyDatabase: Expone la base de datos de Access por medio de la DAO Object Library

Dim MyQueryDef As DAO.QueryDef

'MyQueryDef: Sirve como una variable de almacenamiento para contener la consulta objetivo.

Dim MyRecordset As DAO.Recordset

 'MyRecordset: Guarda los resultados de la base de datos.

Dim i As Integer

'i: Se utiliza para añadir títulos a las columnas

'Paso 2: Identificar la base de datos y la consulta.

'Se identifica la base de datos que contiene la consulta requerida así como la consulta que correrá el programa.

'Al haberle asignado a QueryDef una consulta le permite al usuario abrir la consulta en la memoria.

'Nótese que para ejecutar la macro se debe colocar la ruta correspondiente del archivo en access para el cual se desea obtener la consulta, así como también el nombre de la consulta.

Set MyDatabase = DBEngine.OpenDatabase _

("E:\CUENTASXC\CTASXC.accdb")

Set MyQueryDef = MyDatabase.QueryDefs("PAGOS Consulta")

'Paso 3: Abrir la consulta. Los resultados de la consulta son archivadas dentro de MyRecordset.

'Una vez que se encuentren en esa variable, se pueden exportar a Excel

Set MyRecordset = MyQueryDef.OpenRecordset

'Paso 4: Deja en blanco la hoja de calculo.

Sheets("HOJA1").Select

ActiveSheet.Range("A6:K1000000").ClearContents

'Paso 5: Se copian los datos a Excel, para este caso a la celda "A6"

ActiveSheet.Range("A7").CopyFromRecordset MyRecordset

'Paso 6: Añadir títulos a las columnas

For i = 1 To MyRecordset.Fields.Count

ActiveSheet.Cells(6, i).Value = MyRecordset.Fields(i - 1).Name

Next i

End Sub

1

1 respuesta

Respuesta
3

El objeto querydef tiene la propiedad parameters, y ahí puedes configurar el valor del parámetro de la manera que creas más oportuna.

Supongamos que, en tu Access, el parámetro de tu consulta es [Introduzca el nit]

Supongamos también que, en la celda A2, tienes el nit por el que quieres filtrar.

Entonces, en tu código, tienes que añadir el parámetro de la manera siguiente:

'Código anterior...
Set MyQueryDef = MyDatabase.QueryDefs("PAGOS Consulta") 'Esto ya lo tenías
MyQueryDef.Parameters("[Introduzca el nit]") = ActiveSheet.Range("A2").Value 'Esta es la definición del parámetro
Set MyRecordset = MyQueryDef.OpenRecordset 'Esto ya lo tenías
'Código posterior...

Por otra parte, si me permites el comentario, ese código podría darte algún problemilla porque no estás destruyendo las instancias de los objetos que has creado (el objeto dao.recordset, el objeto dao.querydef y el objeto dao.database). Mi recomendación sería que cerraras el recordset y eliminaras los tres objetos, con lo cual, además, vas a liberar memoria. Eso se haría de la siguiente manera, antes del End Sub:

'Código anterior
Next i 'esto ya lo tenías
'Cerramos el recordset y eliminamos instancias de objetos.
MyRecordset.Close
Set MyRecordset = Nothing
Set MyQueryDef = Nothing
Set MyDatabase = Nothing
End Sub

Un saludo. Neckkito (http://bit.ly/NckAccess / http://bit.ly/ForoNkSv)

¡Gracias!  Muy amable, listo lo pude solucionar.

Una Consulta:

Set MyDatabase = DBEngine.OpenDatabase("E:\DESCARGAS\ejemplo.accdb;Persist Security Info=False;Jet OLEDB:database Password=ctasxcAL*88/;")

Me da un error en esta línea: Se interrumpió el acceso a la red. Para continuar cierre la base de datos y vuelva abrirla.

Estás mezclando churras con merinas. Si usas DAO (como lo estás haciendo según tu mensaje inicial) los parámetros de conexión son los que puedes consultar aquí (https://goo.gl/rtk6fv). No te puedes inventar las cosas en función de información dispersa que probablemente hayas encontrado por Internet. Tú estás utilizando, y mal, el string propio de una cadena de conexión con ADO, que es otro mundo. Así que, si MyDatabase es una DAO. Database, tendrás que utilizar la sintaxis correcta de DAO. Hay muchos ejemplos en Internet sobre eso, y si no, esta página clarita, eso sí, en inglés (https://goo.gl/Q7qXnu)

¡Gracias! 

Mira lo que hice:

Set MyDatabase = DBEngine.OpenDatabase("E:\DESCARGAS\EJEMPLO.accdb", False, False, ";pwd=ctasxcAL*88").

  1. Primero Descifrar la base de datos. Es decir, dejarla sin la contraseña.
  2. Seguir los pasos descritos. ->Access 2016 -> Archivo -> Opciones -> Configuración de cliente -> Avanzadas -> Método de cifrado -> Usar cifrado heredado (apropiado para compatibilidad inversa y bases de datos de multiusuarios).
  3. Cerrar el archivo y abrirlo de nuevo.
  4. Luego cifrar la base de datos con la nueva contraseña.
  5. Cerrar el archivo.

Sucede que yo lo hacia pero con la contraseña ya creada y esto "quizás" sea lo que afectaba la conexión.

En síntesis; Primero hacer los cambios de la configuración, luego cifrar el archivo.

Muchisimas gracias...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas