Quisiera ver si me pueden ayudar por favor. Estoy haciendo una base de datos en access con visual basic pero tengo una duda enorme, quisiera saber si puedo exportar esa base de datos a excel.
1 Respuesta
Respuesta de santiagomf
0
0
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
Entiendo que estás trabajando desde el Visual Studio, no desde VBa (desde Access sería directo). Lo que yo haría es un procedimiento usando las librerías de Microsoft Excel. Sería algo así: Sub enviarDeAccessAlExcel() Dim miXls As New Excel.Application Dim miWb As New Excel.Workbook Dim db As Database Dim rs As Recordset Dim i As Integer Dim nLin As Long ' Creamos un nuevo libro de Excel Set miWb = miXls.Workbooks.Add() ' Abrimos la base de datos y tabla a exportar Set db = OpenDatabase("nombreBaseDeDatos", False, True) Set rs = db.openrecordset("nombreTabla") ' Escribimos los nombres de campos en la fila 1 For i = 0 To rs.Fields.Count - 1 miWb.ActiveSheet.cell(1, i + 1) = rs.Fields(i).Name Next i ' Escribimos los registros (los campos nulos los saltamos) nLin = 1 If Not rs.EOF Then rs.MoveFirst Do While Not rs.EOF nLin = nLin + 1 For i = 0 To rs.Fields.Count - 1 If Not IsNull(rs.Fields(i)) Then miWb.ActiveSheet.cell(nLin, i + 1) = rs.Fields(i) Next i rs.MoveNext Loop ' Cerramos la tabla y base de datos Rs. Close Db. Close ' Cerramos el Excel MiWb. Close True, "NOMBRE DEL FICHERO DE SALIDA" MiXls. Quit Set miWb = Nothing Set miXls = Nothing End Sub Este código está para accesos al Access mediante DAO. Si usas el ADO deberás cambiarlos. No olvides incluir la librería de "Microsoft Excel".
Muchas gracias por tu respuesta, es muy útil pero la conexión que yo hago con access es mediante un data, ¿entonces solo tengo que sustituir las lineas de conexión y las del recordset? ¿O hay que hacer otro código? Muchas Gracias por tu apoyo. Saludos
SI haces el acceso mediante un data, el propio control tendrá la propiedad 'recordset'. En ese caso, sustituye "rs" por "data.recordset" y te sobraría la apertura/cierre de la base de datos y de "rs" (ya los abrirá tu data). El resto debería ser igual.
Oye que crees que ya hice eso y aparte el código lo metí en un botón pero que crees que me manda el error de: "El objeto no admite esta propiedad o método". Te dejo el código haber si le puedes echar un ojo y me ayudes para ver porque tengo ese error. Te marco la linea del error en negritas. Private Sub Command1_Click() Dim miXls As New Excel.Application Dim miWb As New Excel.Workbook Dim i As Integer Dim nLin As Long ' Creamos un nuevo libro de Excel Set miWb = miXls.Workbooks.Add() ' Abrimos la base de datos y tabla a exportar 'Set db = OpenDatabase("nombreBaseDeDatos", False, True) 'Set rs = db.OpenRecordset("nombreTabla") ' Escribimos los nombres de campos en la fila 1 For i = 0 To Data1.Recordset.Fields.Count - 1 miWb.ActiveSheet.cell(1, i + 1) = Data1.Recordset.Fields(i).Name Next i ' Escribimos los registros (los campos nulos los saltamos) nLin = 1 If Not Data1.Recordset.EOF Then Data1.Recordset.MoveFirst Do While Not Data1.Recordset.EOF nLin = nLin + 1 For i = 0 To rs.Fields.Count - 1 If Not IsNull(Data1.Recordset.Fields(i)) Then miWb.ActiveSheet.cell(nLin, i + 1) = Data1.Recordset.Fields(i) Next i Data1.Recordset.MoveNext Loop ' Cerramos el Excel miWb.Close True, "C:\bancos.xls" miXls.Quit Set miWb = Nothing Set miXls = Nothing End Sub Gracias espero que me puedas ayudar una vez más. Saludos
Prueba cambiando el bucle "for" para que vaya desde 1 hasta "recordset.fields.count". Cuando se trabaja con DAO los campos van numerados del 0 al count-1, pero con ADO (y creo que el data también) lo hace de 1 hasta count. El for (en los dos casos que aparece en el código) quedaría: For i = 1 To Data1.Recordset.Fields.Count
Oye que crees que ya cambie el for como me dijiste pero no se arregla, sigue el mismo error, espero que puedas ayudarme por favor. Gracias. Saludos
Pues de momento sólo se me ocurre que vuelvas al código original y que abras el recordset con DAO (tendrás que incluirlo en las referencias la última versión). Para abrir el recordset yo utilizaría el mismo código que estés usando en el data. Supongo que debería funcionar. Si no sólo se me ocurre que me envíes el programa y la base de datos para ver el problema en mi casa (por aquí es complicado localizar los errores).
Mmm. Pues creo que esto no me ah ayudado de mucho :( de nada me sirve tener el código si no funciona, bueno de todas maneras gracias por la ayuda, ya investigare después.