Deseo importar las hojas de un libro Excel a una tabla Access de forma automatizada, es decir, sin intervención del usuario. Ya se que existe un método manual a través de un asistente que te va guiando para hacer la importación, pero yo necesito hacerlo por programa de forma que el usuario solo tenga que pulsar un botón y se complete la importación de los datos automáticamente.
1 Respuesta
Respuesta de Neckkito Nck
1
1
Neckkito Nck, Access... ser o no ser. Esa es la cuestión
Te explico cómo podrías hacerlo desde un botón de comando. El código que debes generarle al evento "Al hacer click" de ese botón de comando es: ... Private Sub... Dim NomTabla As String, NomExcel As String NomTabla = "TDestino" NomExcel = "c:\CarpetaExcel\Import.xlsx" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, NomTabla, NomExcel, True MsgBox "Importación realizada correctamente", vbInformation, "OK" End Sub ... En el código debes: - Cambiar el nombre de la tabla por el tuyo (lo que yo he llamado TDestino) - Cambiar el nombre del excel, poniendo la ruta completa con el nombre del excel más su extensión - El último argumento de la línea de DoCmd es TRUE. Eso significa que el Excel contiene las cabeceras de los nombres. Si no tuviera dichas cabeceras deberías cambiar el TRUE por un FALSE Ni que decir tiene que la estructura de campos de tu tabla destino debe ser exactamente la misma que la estructura de las columnas de Excel. En caso contrario podría haber un "pequeño desastre". Y eso es todo.
Funciona casi perfectamente. - Sólo importa la primera hoja del libro - Sólo importa las filas completas, es decir, si una celda está vacía se acaba la importación y esa fila ya no se importa. - Deja cargado el Excel en memoria y hay que matar el proceso para poder volver a utilizar el Excel (en Windows XP) Por lo demás funciona perfectamente. Muchas gracias
La idea de importar un Excel a Access suele llevar implícita la "preparación" del Excel previamente a la importación. Es decir, dejar el Excel sin espacios en blanco, por ejemplo, no dejar columnas en blanco, etc. Es decir, se puede automatizar el proceso, pero no pretender que Access actúe como un "ser humano" y se dé cuenta de que hay filas en blanco que debe saltar para pasar a las siguientes. Conclusión: preparar el Excel "antes de" ;) Hay una variación en el código, que quizá te pueda servir si el Excel es estático, en el sentido en que no varía el rango de datos. Le puedes decir al código qué rango quieres importar. Eso se haría de la siguiente manera: DoCmd. TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, NomTabla, NomExcel, True, "A1:G4" Donde lógicamente "A1:G4" debería ser sustituido por el rango que quisieras. Hasta donde yo sé, la importación ser realiza sólo de una hoja (si lo haces manual tampoco puedes hacer una "selección múltiple" de hojas). Solución: deberías crear tantos Excel como hojas tengas y repetir la línea del DoCmd, utilizando nuevos nombres de variables. Algo así como: ... Private Sub... Código... DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, NomTabla1, NomExcel1, True DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, NomTabla2, NomExcel2, True Etc. Resto de código End Sub ... Finalmente, lo que comentas de "deja cargado el Excel en memoria" no entiendo por qué te pasa. Me he creado una miniaplicación para recrear una importación y a mí no me da ningún tipo de problema. Es la primera vez que oigo eso (y he pasado este mismo código a varias personas por diferentes consultas), por lo que desconozco el motivo y la solución. Ahí sí que, sintiéndolo mucho, no te puedo ayudar. :(