Importar Excel a tabla de Access con Visual Basic.

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.
[vb]
Call ImportadelExcel(fichero, App.Path & “\midb.mdb”, “ImpExcel”)
[/vb]
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

[vb]
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
[/vb]

50 comentarios en “Importar Excel a tabla de Access con Visual Basic.

  1. Hola
    bueno probe el codigo que esta aqui pero como soy nuevo en esto
    la verdad no se donde va esta parte del codigo

    Call ImportadelExcel(fichero, App.Path & “\midb.mdb”, “ImpExcel”)

    trate de colocarlo en el formulario y luego en un boton pero no me dio
    tambien me marca error en (Fichero, App.path & “\midb.mdb”, “Impexcel”)

    tambien de dio problema en esta parte
    cnnActiva.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & “Data Source=” & DS & “;”

    necesito ayuda alguien me puede hacer el favor de ayudarme
    se lo agradeseria mucho.

  2. Por favor puedes indicarnos un proceso igual al publicado , pero para cargar datos a una tabla existente, el que se tiene únicamente sirve para crear una tabla y poner los datos, pero no sirve para cuando existe ya una tabla, te agradezco nos despejes esta duda , gracias

  3. tengo una gran duda y espero me pudieran contestar
    si en lugar de que se tratara de un archivo de excel
    se tratara de una base de datos de sql server, como seria el proceso para importar los datos?

  4. Muchas gracias por el código, me ha servido de mucho, aunque tengo un error que no logro resolver, y es que tengo una columna de excel con valores de letras y números (ej. 6583F6) el problema es que no me aparecen en el access los valores que poseen solo números (ej. 636500).

  5. alguien podria subir el codigo de david compuesto con la linea de conexion para el office 2010 por favor se los agradeceria es que no tengo la del 2003 y pues no me sirve!!!por favor!!

  6. para solucionar el problema de insertar el rango en una tabla existente la instruccion SQL es la suguiente:
    sSQL = “INSERT INTO ” & sTablaDestino & ” (campo1, campo2, campo3, campo_n) SELECT * FROM ” & sTablaOrigen & ” IN ” & sConnect

  7. Hola David, buen dia!!!

    Eh estado aplicando tu codigo, realmente nisiquiera tengo el nivel basico para usar visual basic, pero bueno sitios como el tuyo neta que se aprecian (“,)… Te comento un error que me surgio, tengo problemitas con la variable tablaOrigen y es que mi rango cambia en cada tabla que importo a excel…

    Algo que me puedas sugerir porfavor!!! Por tu atencion Gracias…

  8. Una consulta,en Excel he abierto con Alt+F11, me aparece VBA, ahi he creado un formulario a mi manera, con cuadro combinado, cuadro de texto. Como hago para agregar en cuadro combinado las diferentes opciones que pueden elegir

  9. Lástima que no pueda editar el post, he cambiado un poquito el códgio anterior, de modo que me devuelve el número de filas escritas, ya que el número de columnas es fijo, digamos que ahora consigo los dos valores que me hacen falta, y el sheet, es el activeworkbook.worksheets(3) de este modo, tengo el sheet, el número de columnas 44 y el número de filas, ahora sólo me falta meter estos tres valores en el código de david para que formen la variable sTablaOrigen…

    pego el código a ver que os parece:

    [Code]Sub selRang()
    Dim Rng As Variant
    Range(“A1:AR1″).Select
    While ActiveCell.Value “”
    ActiveCell.Offset(1, 0).Select
    Wend
    ‘Range(Selection, Selection.End(xlDown).End(xlDown)).Select
    Rng = Selection
    MsgBox Selection.Row – 1
    End Sub[/code]

    Saludos de nuevo!

  10. Buenas, estoy cerca de lo que necesito, el código que estoy usando selecciona un rango teniendo en cuenta la última fila del excel escrita,

    [code]Sub selRang()
    Range("A1:AR1").Select
    Range(Selection, Selection.End(xlDown).End(xlDown)).Select
    End Sub[/code]

    Lo que no consigo hacer, dado mi nivel de conocimientos de programación, es guardar ese valor en una variable para poder usarla en sTablaOrigen, no se si podreis iluminarme un poco :)

    gracias de antemano! :)

  11. buenas david,

    si, he previsto hacerlo ejecutando una macro en access tal cómo dices, en este sentido, no me preocupa demasiado, ya que a dia de hoy ejecuto una rutina en access dónde incluiré ese paso.

    en cuanto al rango, miraré a ver que puedo hacer, sinó le pondré un campo más al form para indicarle cuantas filas cojer ya que columnas no varia, a ver que hago, en cuanto lo tenga os lo pongo por aquí! :)

    Mil grácias,
    Saludos!!

  12. Buenos dias, y grácias por el código, me va de maravilla, sólo tengo dos dudas, la primera? no podría abrir una tabla existente de access y copiar el rango debajo del último registro?

    Por otro lado, tengo campos que en la tabla de access són del tipo Si/No, cómo deben estar esos datos en el excel para que se vuelquen correctamente en la base de datos access?

    Gracias de antemano!

    1. Vicpal, yo no lo conseguí pero teniendo los datos access ya es posible hacer lo que se quiera, de hecho con el visual añadía los datos a una tabla general, luego eliminaba la tabla e importaba el siguiente archivo.

      con respecto al campo boleano debes hacer pruebas. No no necesité importar el campo de ese tipo pero te invito a que lo pruebes y nos digas un poco mas adelante como se importó.

  13. Hola, tengo el inconveniente de estar trabajando visual 2008 express, access 2007 y excel 2007.

    Al copiar el codigo me salen varios errores y creo que espor que esta escrito para VB 6, hay alguna posibilidad de modificarlo para que funcione en lo antes mencionado?

  14. Para los que andaban buscando solucionar el problema de “la tabla externa no tiene el formato esperado…”, bueno hasta donde e checado las conexiones que son 4.0 son para office 2003; la conexion que aqui se explica es 4.0. y como yo uso office 2010, no me servia y me tiraba ese error.
    La conexion que dejo a continuacion la e probado yo mismo en excel 2010.

    public OleDbConnection myCnn = new OleDbConnection((“Provider=Microsoft.ACE.OLEDB.12.0;” + (“Data Source= C:\\nombreArchivoExcel2010.xlsx ;Extended Properties=\”Excel 12.0;HDR=YES\””)));
    public void abrirConexion()
    {
    try
    {
    myCnn.Open();
    MessageBox.Show(“Conexion abierta”);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }

    public void cerrarConexion()
    {
    try
    {
    myCnn.Close();

    MessageBox.Show(“Conexion cerrada”);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }

  15. Hola, tengo una macro en excel 2007 que guarda los registros en una base de datos de access 2007. El problema es que cada que cargo los datos, primero tengo que borrar manualmente los datos en la base de datos y necesito un codigo que me ayude a no tener que borralos manualmente sino que automaticamente la tabla quede en blanco para que este lista para cargar los datos de excel

  16. Me da error de que el rango no existe-
    Si le doy a Debug me señala la linea

    cnnActiva.Execute sSQL

    Estoy ejecutando este programa desde VBA Acces, 2003, y el excel tb es 2003.

    Lo de activar los projectos visual basic tambien ya lo hice. que sera? una cosa, mi archivo excel tiene dos Sheets, y yo solo quiero copiar una que es la segunda llamada “datos” saben como?

  17. Hola que tal,me gustaría ver si me pasan informacion, estoy manejando visual basic, de excel 2007, y estoy en el tema de manejar formularios(user forms), solo que ahora deseo conectarme o utilizar bases de datos y guardar datos en una tabla de access, solo que en los documentos que he leído y los he checado, me marcan error. O manajan hojas d ecalculo, y eso no me interesa por el momento. Me gustaría saber si alguno de ustedes me pude dar una idea o pasar alguna información sobre el tema. Muchas gracias.

  18. Hola, gracias por atenderme.
    Yo uso la version 2003, si pudieras explicarme brevemente donde coloco las rutinas, por que no he logrado ponerlo a funcionar
    Gracias de nuevo

    1. Este ejemplo es para visual basic 6

      el “Call” en un botón pasándole los parámetros correspondientes y el “Sub” en el mismo formulario que tiene el botón.

      También se puede usar en el código de access.

  19. Hola, sigo intentando aplicar tu rutina pero me da error en el primer script que presento abajo error indica Object Required, no se que hago mal

    Call ImportadelExcel(fichero, App.Path & “\midb.mdb”, “ImpExcel”)

    1. Puede tener que ver con la versión de excel. Creo que esta rutina era para la versión 2003 si mal no recuerdo.

  20. Hola:
    Soy nuevo esto, pero manejo algo de conocimiento, pero me salen muchas dudas, por favor responder para dummies:

    Este codigo lo coloco en un formulario de access o donde?
    Probe en un formulario me daba diferentes errores, me gustaria saber como deberia configurar y colocar este codigo de manera apropiada para que no presente, mas de lo ya conocido en el post.

    Gracias de antmano

    Leonard

  21. Hola David, en primer lugar gracias por tu estupendo trabajo. Tengo un problema con este código. Me da un error al ejecutarlo: El motor Jet de base de datos no pudo encontrar el objeto [Sheet1$A1:C1500]
    ¿Porqué ocurre? Soy bastante novato.
    Gracias y un saludo,

  22. Tengo el mismo problema que ZionCramac el post numero 9.
    El motor de base de datos Microsoft Jet no puede abrir el archivo ‘E:\Euroconta’. Está abierto en modo exclusivo por otro usuario o bien necesita permiso para ver sus datos.
    He hecho lo que dices en Excell
    Esa es la ruta donde se encuentra el archivo Bankinter2.
    E:\Euroconta\Bankinter2.xls Ruta con archivo.
    Gracias

  23. 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

  24. 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?

  25. 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

  26. Estimados todos..
    tengo este error,
    la tabla externa no tiene el formato esperado
    alguien me puede orientar,
    Muchas gracias.
    cpaz©

  27. 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.

  28. 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.

  29. 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

  30. 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

  31. 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

  32. 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…

  33. 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

    1. 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.

  34. 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.

  35. Me sale el error “Microsoft JET Database Engine (0×80004005)
    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

  36. 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.

    [vb]
    For i = 58 To 60
    sNombreCampo = “Inventario PL” & Str(i)
    On Error GoTo Siguiente
    db.TableDefs(“NombreTabla”).Fields(sNombreCampo).Name = “Inventario”
    : Siguiente
    Next i
    [/vb]

  37. 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 8) 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

  38. 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…

Los comentarios están cerrados.