Importar Excel a tabla de Access con Visual Basic.
Visual Basic 24 octubre 2008
Una simple rutina que sirve para importar un rango de filas y columnas de un fichero de Excel a una tabla en una base de datos de Access.
Había probado de multitud de maneras encontradas por internet, ejecutando una macro desde Excel y llamándola desde Visual, intentando crear una macro en access para llamarla desde visual y otros casos mas extraños aún.
La solución era mucho mas sencilla de lo que me esperaba, mediante la biblioteca de ADO.
-
Call ImportadelExcel(fichero, App.Path & "\midb.mdb", "ImpExcel")
En el siguiente procedimiento las variables que necesita:
- sFichero es el fichero Excel que quiero importar
- DS es el DataSource o ruta a la base de datos que va a importar
- sTablaDestino el nombre de la tabla que se creará con los datos del Excel
-
Sub ImportadelExcel(sFichero As String, DS As String, sTablaDestino As String)
-
-
Dim sTablaOrigen As String
-
Dim sConnect As String, sSQL As String
-
Dim cnnActiva As ADODB.Connection
-
-
' Establezco la conexión con la base de datos de Access,
-
' la cual será la base de datos "Activa"
-
Set cnnActiva = New ADODB.Connection
-
cnnActiva.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-
"Data Source=" & DS & ";"
-
-
'Rango que quiero importar dela hoja Sheet1
-
sTablaOrigen = "[Sheet1$A1:C1500]"
-
-
' Importo la tabla a la base de datos "Activa"
-
sConnect = "'" & sFichero & "' 'Excel 8.0;HDR=Yes;'"
-
-
sSQL = "SELECT * INTO " & sTablaDestino & " FROM " & sTablaOrigen & " IN " & sConnect
-
cnnActiva.Execute sSQL
-
-
' Cierro la conexión
-
cnnActiva.Close
-
End Sub
Posts anterior y posterior:
Posts Relacionados:
- Previo: « Crear y ejecutar macro de Excel desde Visual Basic.
- Siguiente: Uso del registro en Visual Basic 6. »
enero 24th, 2009 a las 8:28 am
Hola, sabes que estaba probando tu código y me sale un Error de Compilación: "No se ha definido el tipo definido por el usuario".
Sale remarcado en amarillo el sub-procedimiento ImportadelExcel y remarcado en azul: "cnnActiva As ADODB.Connection" (lo que vendría siendo la linea 5).
Te surgio este problema a ti?
Gracias ante cualquier comentario...
enero 24th, 2009 a las 4:39 pm
Has agregado el ADO?
Menu / Proyecto / Referencias
Marca el Microsoft Activex Data Object 2.6 Library
enero 25th, 2009 a las 12:26 am
Si, disculpa... me habia dado cuenta que faltaba eso
Gracias.
enero 25th, 2009 a las 2:13 am
Hola David
Tengo un pequeño problema... el codigo anda sin problemas.
El problema que tengo es que los nombres de los campos que se crean en access, tienen un nombre especifico (capturado desde excel), pero que pasa si los nombres cambian?...
Por ejemplo... quiero cargar un archivo excel con una hoja que cambia todos los meses...
Especificamente hay un atributo de excel que es: "Inventario PL58", pero el que quiera cargar del próximo mes, el atributo puede llamarse "Inventario PL59" ó quizas "Inventario PL60".
Con ese nombre va quedando el campo (que es numerico...).
Entonces cuando lo quiero cargar para trabajarlo, voy a tener problemas al ser un nombre dinámico (que cambie con el tiempo), porque no sabre que nombre va a tener el campo en la tabla (Si va a ser el inventario 58, 59, 60, etc).
Lo que se me ocurre es cambiar este nombre al campo a algo standard (dentro de la bd)... ya que es mas complicado andar indicandole a la persona que entrega la hoja el formato que debe tener la hoja excel...
Por eso queria saber si sabes (o alguien que pueda seguir este hilo)... como cambiar el nombre de un campo en una tabla de access desde visual basic 6, considerando que no se sabe el nombre original del campo... (puede ser el nombre original: "Inventario PL58", "Inventario PL59" ó "Inventario PL60", etc... y dejarlo solo como: "Inventario") y considerando que lo que siempre se sabe es cual campo (el
es al que hay que cambiarle el nombre...
Quizas pueda que el codigo anterior quede algo asi o parecido ya que a mi no me resulto:
sTablaDestino.Fields(8).Name = Inventario
No sé si me entiendes...
Pero igual... Muchas Gracias por tu ayuda
enero 25th, 2009 a las 4:57 am
Rodrigo, yo renombraría el campo con un For controlando el error.
Prueba con el siguiente código y ya me contarás. No está probado.
enero 27th, 2009 a las 8:29 pm
Gracias por la ayuda, me sirvió bastante, sólo una duda como cierro excel desde mi aplicación en VB
enero 27th, 2009 a las 9:58 pm
¿Como que como lo cierras? Si no se ha abierto.
enero 31st, 2009 a las 7:06 pm
Hola yo necesito con mucha urgencia un ejenplo completo de un inventario, visual basic con excel, para mi en importante que me ayudaen.
marzo 19th, 2009 a las 1:26 am
Me sale el error "Microsoft JET Database Engine (0x80004005)
El motor de base de datos Microsoft Jet no puede abrir el archivo 'seguimiento.xls'. Está abierto en modo exclusivo por otro usuario o bien necesita permiso para ver sus datos.
"
Que podría faltar????
Saludos
marzo 19th, 2009 a las 10:25 pm
Hola ZyonCramac, tienes razón, falta que pongas en tu Excel (en excel no en visual) lo siguiente:
Herramientas, Macro, Seguridad, pestaña "editores de confianza".
Marca la casilla "Confiar en el acceso a proyectos de visual basic"
Con esto ya te tiene que ir bien.
abril 24th, 2009 a las 2:11 pm
Hola, estoy haciendo uso del codigo que dajaste en esta página, muuuuy util, pero necesitaria que me indicases como puedo hacer para que no cree la tabla, lo que intento hacer es ir añadiendo datos a una tabla existente, y el codigo que nos suministras crea la tabla en cada proceso y claro, me casca por que ya existe, sería una modificación muy complicada?
muchas gracias
abril 30th, 2009 a las 9:01 pm
Hola Pablo,
eso que me preguntas es un poco complejo. De hecho es lo mismo que yo necesitaba cuando escribí este código.
Yo lo solucioné importando todos los datos de los distintos excel a tablas del 1 al 31 (eran datos de cada dia del mes), por eso en la llamada a la función puedes ponerle la tabla de destino.
Después puedes mezclar los datos desde las tablas de access que es mas sencillo.
Tambien puedes utilizar una tabla temporal para importar los datos y cuando los mezcles en tu tabla general de datos eliminas la tabla de esta manera vas acumulando tus datos.
junio 5th, 2009 a las 9:39 pm
Hola,
Me puedes ayudar con la siguiente duda, en mi caso se requiere agregar los datos a la tabla existente, es decir cada semana se agrega otros 60,000 registros...me puedes ayudar...
julio 27th, 2009 a las 5:53 am
Hola, y si quiero utilizar un archivo excel 2007 (.xlsx) cómo cambiaría tu excelente código?
julio 30th, 2009 a las 11:22 pm
Hola tengo una base de datos en Excel y por medio de una macro la modifico y queda "lista",de ahi abro un proyecto de accees e importo el archivo de excel a la tabla principal de access, este codigo sirve para eso?? lo ejecuto desde excel??.
En si lo que necesito es que solo quiero abrir Access y con un solo boton me modifique la tabla de excel y luego la importe a access... se puede? ocupo access 2003 y excel 2007
gracias
julio 31st, 2009 a las 10:37 pm
para cambiar el codigo seria asi:
Set cnnActiva = New ADODB.Connection
cnnActiva.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
DS & ";Persist Security Info=False;"
eso funcionaria para access 2007
septiembre 13th, 2009 a las 7:22 am
Hola que tal!!
Sabes, estoy haciendo un programa en visual basic donde necesito que tome los datos de un excel para colocarlo en la base de access. Tome tu ejemplo pero tengo problemas donde dice fichero. Me das una mano?
Gracias
enero 16th, 2010 a las 4:34 pm
Hola Buenas Saludos Queria saber si es posible, importar al acsses muchos archivos de exel al mismo tiempo.
Es un problema para mi tener que hacerlo manual, ya que lo hago de a uno por uno y cada vez que lo hago son aprox . 200 archivos de exel... practicamente son 2 dos dias laborales...y ya me hinchan los huevos.
saludos.
enero 16th, 2010 a las 8:24 pm
Hola Nacho,
lo extraño es que no hayas buscado una solución antes.
La funcion que está escrita en este port sirve para eso mismo solo que tienes que usarla del modo apropiado.
enero 26th, 2010 a las 10:59 pm
Estimados todos..
tengo este error,
la tabla externa no tiene el formato esperado
alguien me puede orientar,
Muchas gracias.
cpaz©
febrero 17th, 2010 a las 12:43 am
Carlos, ese error suena a que es otra version de excel. Este post es para 2003 pero Pamela amablemente ha aportado el cambio de código para 2007 en los comentarios
abril 30th, 2010 a las 12:17 am
no he podido hacer que funcione la macro en access para importar archivos de excel, mi correo es dffigueroa.forex@gmail.com gracias
julio 30th, 2010 a las 4:10 pm
Hola, he intentado usar tu codigo, pero cuanod llega a
cnnActiva.Execute sSQL
me dice "Query input must contain at least one table or query".
Que puede estar pasando?
agosto 5th, 2010 a las 9:37 pm
Hola a todos disculpe me podrian guiar como puedo expotar datos de un documento "libro1.xlsx" de excel 2007 a "base.accdb" 2007 en vb 6.0 con ADO