¿Cómo importar datos de un libro excel desde access con código vba?

Ahí va el reto.

Tengo en una carpeta varios libros de excel, cada libro tiene una o dos hojas que quiero importar con el nombre de Gama 1 y Gama2.

Así que lo que quiero principalmente, es que desde (un formulario) aparezca un listbox, donde este el listado de libros excel (esto ya lo tengo). Me importe en una tabla (temporal) metiéndome seguidos los valores de la hoja Gama 1 y Gama 2... Y desde esta tabla (ya en access), cargar estos valores en otro listbox.

Gracias... Por vuestro tiempo y dedicación.

S2 a tod@s

2 respuestas

Respuesta
1

Con DoCmd.TransferSpreadsheet le puedes indicar el rango (también vale para importar una hoja entera) en el argumento "Range": https://msdn.microsoft.com/es-es/library/office/ff844793.aspx 

En tu caso sería algo así:

DoCmd. TransferSpreadsheet acImport,, "NombreTablaTemporal", Me. NombreCuadroListaExcel, True, "HojaX!"

Donde NombreTablaTemporal será el nombre de tu tabla temporal a la que quieres importar, NombreCuadroListaExcel será el nombre de tu cuadro de lista en el que eliges el archivo (tendrás que poner la ruta completa al archivo), y HojaX la hoja que quieres importar.

Para importar más de una hoja del mismo archivo, has de repetir el código para cada una. Una idea sería que hicieras un bucle, si en el formulario (o en el código) le indicas las hojas a importar.

Por úlimo, te dejo un enlace a un ejemplo de Neckkito, por si te da otras ideas: https://dl.dropboxusercontent.com/u/7400954/WebAccess/Pdf/EjemplosEspeciales/ImportandoConExcel.pdf 

Un saludo.


¡Gracias!

¡Gracias! Miles además.

Decirte que te has anticipado a Jacinto Trillo esta mañana, he seguido tus explicaciones incluso me he bajado un pdf, con explicaciones claras, he estado trasteando con código, y lo he conseguido... desde luego, me quedo alucinado del poder de vba, y de los amplisimos conocimientos que tenéis del código.

Aun así, tengo otra pregunta, a la hora de importar... como puedo importar todas las hojas del libro excel seleccionado que empiecen por "gama", con código vba, ¿desde access?

Da la casualidad, que hay ficheros excel que tienen hasta 5 hojas gama 1, gama 2, gama 3... etc en el libro... gracias de nuevo.

Por cierto un nick, muy combativo.

S2

En segundo lugar, no debería ser difícil de conocer el nombre de las hojas del archivo seleccionado, para importarlas, aunque seguramente tengas que modificar tu código.

Te explico sin probarlo, a ver si lo consigues tu solo:

1º/ Creas por VBA un objeto para abrir el archivo de excel seleccionado (si activas la referencia para excel en el editor de vba, además de facilitarte la escritura del código, tendrás acceso a ayuda del mismo)

2º/ Con el objeto Sheet tienes a tu disposición la colección de hojas, por lo que puedes recorrerlas todas y comprobar su propiedad Name.

Un ejemplo sencillo sería:

Dim ObjExcel As Excel.Application
Dim ObjW As Excel.Workbook
Dim i As Integer

Set ObjExcel = New Excel.Application
Set ObjW = ObjExcel.Workbooks.Open("D:\Ejemplo.xlsx")

For i = 1 To ObjW.Sheets.Count
Debug.Print ObjW.Sheets(i).Name
Next

ObjW.Close
Set ObjExcel = Nothing

Si ejecutas ese código dentro de un procedimiento, te mostrará, en la ventana inmediato los nombres de la hoja de excel Ejemplo.xlsx ubicada en el disco D.

A partir de ahí, sólo es comprobar los nombres e importar si tiene el nombre adecuado.

Un saludo, y no dudes en pasarte por nuestro foro y participar en él: http://nksvaccessolutions.com/Foro/

Respuesta
1

Valdo: Dado que ésta pregunta me sale sugerida por el sistema, y en la línea que sugiere Sveinbjorn de automatizar el proceso, te sugiero lo siguiente.

En un Módulo Standard, pones los siguientes "TRES" Procedimientos

Sub ImportaDatos()
'Primero borro todas las tablas que se van importar
Call BorraDatos("TablaAlfa")
Call BorraDatos("TablaBeta")
Call BorraDatos("TablaGamma")
Call BorraDatos (………etc
'Establezco la Ruta de los Ficheros Excel
RutaImport = "C:\Uno\Dos\Tres\"
'Ahora comienzan las Importaciones. Si se quiere simplificar, los Libros Excel pueden llamarse TablaAlfa,TablaBeta.. 
HojaImport = "Gama1"
LibroImport =”PrimerLibro.xlsx"
Fichero = RutaImport & LibroImport
Call ImportDatos(HojaImport, Fichero)
HojaImport = "Gama2"
LibroImport = “PrimerLibro.xlsx" ‘Esta línea se puede evitar porque no cambiamos de Libro
Fichero = RutaImport & LibroImport
Call ImportDatos(HojaImport, Fichero)
‘Así con todos los Libros y Hojas que haya
MsgBox "Los datos han sido importados y las Tablas actualizadas"
End Sub 
Sub BorraDatos(NombreTabla)
Dim StrSQL As String
StrSQL = "DELETE * FROM " & NombreTabla
DoCmd.SetWarnings False
CurrentDB.Execute StrSQL, dbFailOnError 
DoCmd.SetWarnings True
StrSQL = ""
End Sub
Sub ImportDatos(HojaImport, Fichero)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, HojaImport, Fichero, True
End Sub

En un Botón de tu Formulario, que puedes llamar BtnImporta, pones>>

Private BtnImporta_Click
Call ImportaDatos
End Sub

Y si no se me ha escapado algo, debería de Funcionar. Saludos >> Jacinto

¡Gracias! Miles además.

Como me ha contestado Sveinbjorn esta mañana, he seguido sus explicaciones incluso me he bajado un pdf, con explicaciones claras, he estado trasteando con código, y lo he conseguido... aun así Jacinto, no tengo más que palabras de agradecimiento, hacia ti.

Te voy a llamar the almighty

Valdo: Eres muy generoso, pero te puedo asegurar que que si hay algún "Almighty", que dicho sea de paso no me consta, desde luego no soy yo.

En cualquier caso gracias por tu deferencia. Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas