30 noviembre, 2023

EXPORTAR DATOS DE EXCEL A ACCESS MEDIANTE ADO

Hace unos días recibí una consulta donde me solicitaban ayuda para exportar datos desde Excel a Access. El lector había consultado la entrada CONECTAR BASE DE DATOS DE ACCESS (ACCDB) CON EXCEL UTILIZANDO HERRAMIENTA OLEBD donde se explica como conectar y traernos a nuestro Excel una tabla o una consulta desde Access.

Pues bien, me pareció bastante interesante y también tenía ganas de trabajar un poco con ADO y SQL. Así que hoy trabajaremos esta situación, y como siempre vamos a poner un ejemplo:

Imaginad que trabajamos en unos grandes almacenes y nos entregan un archivo Excel con el detalle de empleados, nombres, idiomas, fechas de nacimiento, etc …, y nosotros, que trabajamos habitualmente con Access, cada vez que nos envían la información tenemos que guardarnos la misma tabla una y otra vez para después importarla desde Access y realizar nuestros informes. Esta situación puede ser muy habitual, sobre todo para los usuarios de Access que no lo tienen tan fácil para encontrar colaboradores que trabajen con este programa.

* Si necesitáis crear bases de datos con nombres y apellidos podéis ver esta entrada donde os explico como lo podéis hacer: pinchad aquí

Siguiendo con el ejemplo, el archivo Excel que nos envían se llama «COMPAÑÍA» y la pestaña de la hoja donde tenemos la información se denomina «EMPLEADOS»:

EXPORTAR DATOS DE EXCEL A ACCESS MEDIANTE ADO_1

Ahora que tenemos estos datos, debemos exportarlos a Access y para ello, vamos a trabajar con la siguiente macro:

Sub EXPORT_ACCESS()
'Definimos las variables a utilizar
Dim ConAccess As ADODB.Connection
Dim ConExcel As String, obSQL As String
Dim Origen As String, Destino As String
'Establecemos conexion con la base de datos de Access que hemos creado (EMPRESA)
'debéis verificar la ruta a vuestra base de datos.
Set ConAccess = New ADODB.Connection
ConAccess.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=F:\EMPRESA.accdb;"
'Eliminamos la tabla TRABAJADORES y verificamos que si no existe no salte un error (Control)
On Error GoTo Control
obSQL = "DROP TABLE [TRABAJADORES]"
ConAccess.Execute obSQL
Control:
'Establacemos conexion con el archivo de Excel, desde donde vamos a exportar la tabla
'Debéis verificar la ruta a vuestro archivo excel y respetar las comillas "dobles" y "simples"
ConExcel = "'F:\COMPAÑIA.xls' 'Excel 8.0;HDR=Yes;'"
'Definimos el nombre de las tablas:
'Origen será la tabla de Excel
'Destino será la tabla de Access
Origen = "[EMPLEADOS$]"
Destino = "[TRABAJADORES]"
'Importamos la tabla a Access con los nuevos cambios que hayamos realizado en Excel
obSQL = "SELECT * INTO " & Destino & " FROM " & Origen & " IN " & ConExcel
ConAccess.Execute obSQL
ConAccess.Close
End Sub

Aunque ya explico el funcionamiento de la macro en los comentarios en verde. Vamos a incidir en algunas partes del código.

Después de insertar la macro y antes de ejecutarla debéis crear una base de datos (vacía), en este ejemplo la denomino «EMPRESA» y luego definir el nombre de la tabla que creará la macro con los datos importados de Excel, en este caso, nombro la tabla como [TRABAJADORES].

Para poder actualizar la tabla tantas veces como necesitemos, es necesario que por cada vez que se importemos los datos, realicemos: o bien una consulta de actualización, o como en este caso, he optado por eliminar directamente la tabla y volver a importarla, de esta forma actualizaremos toda la información, con este código conseguimos el borrado:

On Error GoTo Control
obSQL = "DROP TABLE [TRABAJADORES]"
ConAccess.Execute obSQL
Control:

El control del error es necesario, dado que si en la base no tenéis ninguna tabla que se llame TRABAJADORES, se generará un error por no encontrar la tabla, así lo controlamos y lo obviamos.

En caso de que solamente queráis ir incluyendo tablas, por ejemplo, por cada mes una diferente, tendríais que eliminar el código que borra la tabla, y cada vez que importaseis renombrar la tabla de Access Destino = «[la tabla x]»

Ni que decir tiene que antes de ejecutar la macro, debéis establecer las rutas correctas en vuestro equipo, en el código lo marco en rojo. En mi caso están en la unidad «D» (un pendrive).

Os muestro la base de datos de Access para que veáis el resultado:

EXPORTAR DATOS DE EXCEL A ACCESS MEDIANTE ADO_2

Por último, para la macro funcione, una vez insertada la macro nuestro editor de VBA debéis marcar en la biblioteca de referencias: Microsoft ActiveX Data Objects 2.8 Library

EXPORTAR DATOS DE EXCEL A ACCESS MEDIANTE ADO_3

Sin esta referencia, la macro no funcionará, ¡es imprescindible que la marquéis!

Ahora os dejo el enlace a Drive, en wordpress no se permite alojar archivos de Access 🙁
pero google es una buena alternativa para solucionar el problema.

Espero que os sea de utilidad!

Descarga el archivo de ejemplo pulsando en: EXPORTAR DATOS DE EXCEL A ACCESS MEDIANTE ADO 

 

Comparte este post

33 comentarios en «EXPORTAR DATOS DE EXCEL A ACCESS MEDIANTE ADO»

  1. Creó que algo salió mal brother algo falló en OnError ,al correr la macro aparece el error » Se ha producido el error ‘-2147217900 (80040e14)’ en tiempo de ejecución:

    La tabla ‘TRABAJADORES’ ya existe

    1. Hola Christian,

      Antes de nada, prueba a ejecutar la macro de nuevo. Entra en el editor y ejecútala. Si has realizado modificaciones es posible que te sigo informando de un error anterior que ahora ya no existe, pero que es necesario restablecer y ejecutar de nuevo. Si este no es el problema:

      Asegúrate que la sentencia:
      obSQL = «DROP TABLE [TRABAJADORES]»
      ConAccess.Execute obSQL

      Está exactamente igual, sobre todo [TRABAJADORES]
      El control On error GoTo es para controlar errores por si no existen tablas. El error que indicas es porque no ha borrado la tabla Trabajadores. Por ello debes controlar la sentencia que te indico.

      Si el problema persiste. Enviáme los dos archivos (excel y access con un ejemplo de tabla y verifico cúal puede ser el problema. La macro funciona perfectamente en Excel 2007, 2010 y 2016.

      Saludos.

      1. amigo muchas gracias por esta información, estaba necesitando una macro que no guardara registro por registro por que tada mucho de esa forma cuando son muchisimos datos. agradecido

    1. Hola Joaquín:

      Es sencillo, en la parte de la macro en la que construimos la sentencia SQL:

      obSQL = "SELECT * INTO " & Destino & " FROM " & Origen & " IN " & ConExcel

      Debes especificar aquellos campos que te interesan en lugar de exportar la tabla completa, es decir, así:

      obSQL = "SELECT [EMPLEADOS$].[ID], [EMPLEADOS$].[NOMBRE COMPLETO], [EMPLEADOS$].[SECCION] INTO " & Destino & " FROM " & Origen & " IN " & ConExcel

      Saludos.

  2. Saludos, te queria consultar cual seria la diferencia si deseo pasar solo la primera fila con datos de la tabla de excel en lugar de la tabla completa o mejor aun un rango dentro de esta fila como ser A2:G2. Gracias de antemano.

  3. Hola Segu,
    He leído y probado tu tutorial y funciona perfecto.. Muchas gracias por el trabajo.

    Viendo este ejemplo, corrígeme sino me equivoco, el id es la clave de cada registro.
    Me gustaría saber como puedo hacer una consulta desde excel donde me devuelva los datos de un registro concreto, especificando solo la llave. (ya sea 1 llave o varias).

    Gracias!

    1. Hola Manu:

      Perdona por no responder antes. Respecto a tu pregunta, supongo que te refieres a la forma de importar a Excel información de Access, eso lo puedes hacer con la información de este post:

      https://excelsignum.com/2014/02/27/conectar-base-de-datos-de-access-accdb-con-excel-utilizando-herramienta-olebd/

      Aunque en este ejemplo, lo que estamos importando son tablas enteras de Access a Excel, para consultar un registro o registros determinados, solo tienes que modificar la consulta SQL dentro de la macro.

      Saludos

  4. Hola una consulta, tire la macro pero me sale un error que dice » No se puede actualizar.Bases de datos u objeto de solo lectura. a que se refiere ese error, saludos

    1. Hola Leonardo, me imagino que has ejecutado la macro con la tabla de access que vas a borrar abierta. Por eso te marca un error de que la base que estás intentado eliminar para crear otra, está abierta y es de solo lectura.

      Saludos.

  5. Hola, estoy intentando ejecutar el código con el ejemplo descargado, habiendo cambiado la ruta, y me da el error que no puede encontrar el objeto «EMPLEADOS».
    Por otra parte se podría hacer para que en vez de borrar la tabla, fuese añadiendo como datos anexados.
    Estoy usando Office 2016. Un saludo

    1. Bien, he conseguido quitar el error y ya funciona, y ahora sería posible la segunda parte, que los datos fuesen anexados a la tabla en vez de borrarla.

  6. Buen día al ejecutar la macro me genera un error Run-time error ‘-2147467259 (80004005)’ Could nota find installable ISAM

    1. Hola HAzal: Ese error es debido a la versión de Excel que tienes. Puedes probar a cambiar lo siguiente en la macro: esta parte:

      «Provider=Microsoft.ACE.OLEDB.12.0;»

      Por esta otra:

      «Provider=Microsoft.Jet.OLEDB.4.0;»

      Así debería funcionarte.

      Saludos.

          1. Si ya probé la recomendación sin embargo no me funciona, requiero que se cree una tabla nueva con un nombre nuevo cada vez

  7. Funciona maravillosamente

    Pregunta
    Como podría subir un rango Ejemplo «A1:G199» en lugar del objeto Origen = «[PRUEBA$]»
    Esto con el fin de poder tener mas tablas en la Hoja Pruebas.

    De antemano mil gracias

    1. Hola Agustín:

      Aunque no lo he probado, debería funcionar así correctamente.

      «[PRUEBAS]$A1:G199”

      O así: [Worksheets(“PRUEBAS″)$A1:G199]

      Saludos.

  8. Hola Excelente Video lo probe en local y funciona, ahora me esta dando error al colocar el access y el excel en un servidor , debe ser que estoy colocando mal la ruta, en el caso que los archivos reposen en un servidor como tendria que ir?

    ConAccess.Open «Provider=Microsoft.ACE.OLEDB.12.0;» & _
    «Data Source=Z:\BBDD\EMPRESA.accdb;»

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies