Trucos Excel. Unir varios Excel en uno

Septiembre 21st, 2011 | por rvaquerizo |

Tenía pendiente revisar una de las entradas más visitadas del blog. Trata la problemática de unir varios Excel en uno sólo. En el caso concreto servía para unir varios Excel generados por SAS a través de una macro en SAS. En la entrada de hoy quiero trabajar con un ejemplo que os podéis descargar aquí en formato rar. De los archivos que comparto el más interesante el que llamamos unir_varios_excel.xlsm  se trata de un archivo Excel para macros que contiene un par de macros más que interesantes. Un pantallazo de este libro de Excel:

unir_excel.png

Tiene una macro  limpia para limpiar la colunma de archivos. Una macro ficheros que se llama con el botón Listar Libros y nos permite listar los ficheros de un determinado directorio con una determinada extensión. Estos parámetros los podemos modificar en las casillas C1 y C2. Se trata de una macro que ya hemos visto con anterioridad por lo que no entraremos en profundidad con ella. La macro más interesante es la que he llamado Une y será la que nos permita unir la primera hoja de todos los excel de un directorio en un libro final cuyo nombre le indicamos en la celda C3. Este libro final se guardará en el mismo directorio donde están todos los archivos Excel que deseamos unir. Por supuesto es importante tener todos los Excel en el mismo directorio, el unir_varios_excel no es necesario que esté en ese directorio. El contenido de esta macro os le muestro y resumo a continuación:


Sub Une()
Dim nombre, libro, nombre_final, libro_final As String
'Objeto Excel
Set XL = CreateObject("Excel.Application")
XL.Visible = True
para = 0
i = 0
'Creamos el libro resultante
nombre_final = Cells(3, 3) & "." & Cells(2, 3)
libro_final = Cells(1, 3) & "\" & nombre_final

While (para = 0)
nombre = Cells(5 + i, 1)
libro = Cells(1, 3) & "\" & nombre

If nombre <> "" Then
XL.Workbooks.Open libro
If i = 0 Then XL.ActiveWorkbook.SaveAs libro_final, -4143
If i <> 0 Then
XL.Workbooks.Open libro
XL.Workbooks(nombre).Sheets(1).Copy , XL.Workbooks(nombre_final).Sheets(i)
XL.Workbooks(nombre).Close
End If
i = i + 1
End If
If nombre = "" Then
para = 1
XL.Workbooks(nombre_final).Close True
End If
Wend

XL.Quit
End Sub

Creamos un objeto XL como aplicación de Excel. Y sobre un Excel que llamamos como nombre_final vamos a hacer un bucle donde la primera iteración será crear ese archivo nombre_final a partir del primero de los Excel que deseamos unir. En las sucesivas iteraciones del bucle seleccionaremos la primera hoja de los libros que queremos unir y se la pegamos a las hojas de nuestro archivo resultante. Tampoco es un bucle complicado o especialmente talentoso, si os plantea alguna duda escribid un comentario.  Al final se cierra nuestro resultado y el objeto Excel con el que trabajamos.

Al ser esta una primera versión que espero vaya mejorando por mi parte y por parte de las personas que deseen colaborar tiene algunas limitaciones:

  • Sólo une la primera hoja de los libros que deseamos unir
  • Cuando el Excel resultante ya está creado nos pide si deseamos sobreescribirlo
  • He detectado un problema en Excel 2010 con el resultado cuando tratamos de guardarlo como xlsx

Poco a poco iremos puliendo estos defectos y seguramente podamos crear una aplicación en VB para unir archivos Excel más completa. Espero que os sea de utilidad, un saludo.

Etiquetas: , , ,

  1. 41 Respuestas en “Trucos Excel. Unir varios Excel en uno”

  2. Por Fernando, Nov 8, 2011 | Responder

    Duda: hay alguna forma de solucionar el error que esta marcando excel 2010?

  3. Por ANdres, Nov 29, 2011 | Responder

    Hola, Tengo varioas archivo y los quierea unir en un solo archivo, Cuando hago una macro sencilla par aunir estso archivos, como son archivo que varia en el nuemro de celda, cuadno vuelvo a correr la macro la iformacion se sobrepone! En si si en al macro aparace range a1:a100 pero despues cambia de a1:a150 cuando la otra parte del arhivo se pega se pega desda la a100 y no desde la a150, como puedo resolver este problema?
    Gracias.

  4. Por rvaquerizo, Dic 2, 2011 | Responder

    Hola, ¿en qué parte de la macro falla?

  5. Por Alba, Dic 9, 2011 | Responder

    Muchisimas gracias, me ha servido mucho. Muy buen macro.

  6. Por Alberto, Ene 23, 2012 | Responder

    Funciona bien
    Yo sugeriría añadir un botón que permita que las pestañas de los nuevos datos tomaran el nombre del archivo del que provienen en lugar del nombre de la pestaña original, ya que al menos en mi caso los datos vienen diferenciados en el nombre de archivo, y en la primera pestaña ponen lo mismo (son datos del mismo tipo)
    Un saludo

  7. Por JIM, Mar 21, 2012 | Responder

    falla la macro en excel 2010 en:

    XL.Workbooks.Open libro

  8. Por Joan, Ago 11, 2012 | Responder

    Muchas gracias. Sí que sería muy interesante que la hoja tomase el nombre del libro.

  9. Por jorgeebb, Ago 13, 2012 | Responder

    buenas, este me funciona muy bien pero tengo un problema, resulta que mis libros con bastante grandes y el macro no me deja despues de cierta cantidad de casillas exportar el resto pues lo toma como excel 2003 y yo lo necesito en excel 2007 o 2010

  10. Por jorgeebb, Ago 13, 2012 | Responder

    Presenta el siguiente error:
    ESTE LIBRO CONTIENE DATOS EN CELDAS QUE ESTAN FUERA DEL LIMITE DE FILAS Y COLUMNAS DEL FORMATO DE ARCHIVO SELECCIONADO. LOS DATOS QUE OCUPEN MAS DE 256 (IV) COLIMNAS POR 65.536 FILAS NO SE GUARDARAN
    Como se puede solucionar esto gracias

  11. Por Angel, Ago 20, 2012 | Responder

    hola, soy principiante en todo esto. solo queria saber si se prodrian unir las excel desde varias computadoras de una misma red local o habria algun problema?
    gracias anticipadas

  12. Por rvaquerizo, Ago 21, 2012 | Responder

    Hola Angel, no habría ningún problema. El ejemplo está preparado para hacerlo sobre una misma carpeta pero no tendrías problemas si asignaras a distintas carpetas.

  13. Por Joanba, Sep 5, 2012 | Responder

    Muy buena la macro, de todas maneras quiero unir varios ficheros en uno, este me crea una pestaña por cada libro ¿?, es así como finicona o hago algo mal?

    Felicidades y saludos
    Joan

  14. Por Fedeche, Sep 5, 2012 | Responder

    Fantástica la macro. Me acabas de ahorrar horas/dias de trabajo.
    No te beso por que no te tengo a mano.
    Gracias.

  15. Por rvaquerizo, Sep 6, 2012 | Responder

    Joanba, por petición popular creo que me toca hacer una macro que haga lo que tú comentas.

    Fedeche, se agradecen los agradecimientos. Lo de los besos…

  16. Por Ester, Oct 16, 2012 | Responder

    La Macro funciona genial, pero yo necesitaria tambien lo que comenaba Joanba, todo el contenido unido en un unico libro. Si hay algo disponible agradeceria que me avisarais.

    Muchas gracias

  17. Por rvaquerizo, Oct 16, 2012 | Responder

    Esther, por petición popular haré la macro. Busca en el blog porque un compañero mandó una versión muy mejorada.

  18. Por Mónica, Oct 23, 2012 | Responder

    Buenísima entrada. Funciona muy bien. Gracias!

  19. Por ricvarg, Nov 14, 2012 | Responder

    en mi caso cada libro excel es en realidad un archivo .csv abierto como libro excel….
    ¿funciona igual si le indico que la extensión es csv en vez de xls?

  20. Por rvaquerizo, Nov 15, 2012 | Responder

    Hola, debería de funcionar. Buena pregunta. Tengo que probarlo. Saludos.

  21. Por LU, Nov 15, 2012 | Responder

    Hola: al jecutar la macro me manda un error en está parte XL.Workbooks.Open libro
    en office 2007 me pueden ayudar please ??

  22. Por rvaquerizo, Nov 16, 2012 | Responder

    Ese error es debido a que no tienes ningún libro que abrir. Tienes que indicarle al programa que libros son los que hay que unir.

  23. Por Michel, Dic 1, 2012 | Responder

    Genial la macro rvaquerizo, me fui muy útil, muchas gracias de verdad :) por cierto, al generarse el fichero todos_unidos, como se puede generar para que cada hoja adapte el nombre de su fichero?
    muchas gracias :)

  24. Por bun, Dic 6, 2012 | Responder

    Hola.
    Sus funciones me son muy útiles, les agradezco.
    Una consulta, ¿cómo hacer para que los datos que jala de cada archivo de origen se peguen en una misma hoja en archivo de destino, unos a continuación de los anteriores, y no en hojas diferentes? Y de paso, ¿cómo copiar sólo determinadas celdas y no toda la hoja?
    Sé que pido mucho, ojalá me puedan ayudar.

  25. Por valeria, Ene 9, 2013 | Responder

    como puedo hacer una carpeta con las hojas en excel k no haga tantas

  26. Por Manolo, Ene 18, 2013 | Responder

    Buenas noches y gracias anticipadas por la generosidad de compartir conocimientos y dedicación.
    No consigo que funcione bien, parece que abre y copia todas y cada una de las hojas del ejemplo pero una encima de la otra con lo que al final solo están los datos de la tercera hoja. ¿Que es lo que he hecho mal?

  27. Por rvaquerizo, Ene 21, 2013 | Responder

    Manolo, no funciona el bucle que pone la posición, ejecuta por pasos y mira el valor que toma el índice i.

  28. Por DIOS, Feb 5, 2013 | Responder

    TPM ESTA FENOMENAL!

  29. Por George, Mar 17, 2013 | Responder

    Buenisimo aporte lo probe y me funciono rebien..gracias.

  30. Por sassili, Abr 12, 2013 | Responder

    Buenas tardes.
    En mi caso necesito juntar varios archivos en uno. pero los archivos que quiero juntar varían cada día (cada día tiene mas datos, también varia en numero de filas por archivo. ¿de algún modo la macro puede detectar la ultima fila con datos y pegar el siguiente archivo en la ultima fila vacia?

  31. Por javier, Abr 23, 2013 | Responder

    Tengo dos archivos en diferentes libros de excel, al momento de copiar y pedar se desconfigura el formato como puedo hacer un solo libro, aunque sea en diferentes pestñas pero guardando el formato??

  32. Por Miguel, May 29, 2013 | Responder

    al ejecutar la macro hay un error run time aqui:
    If i = 0 Then XL.ActiveWorkbook.SaveAs libro_final, -4143

    me podeis dar una solucion?
    Gracias

  33. Por Isidro, Jun 4, 2013 | Responder

    Excelente libro de referencia… genio…

  34. Por Jairo, Jun 6, 2013 | Responder

    Funciona de maravilla, gracias por compartir.

  35. Por Jairo, Jun 6, 2013 | Responder

    Repito una pregunta de un usuario por si pudiera tener respuesta ¿cómo hacer para que los datos que extrae de cada archivo de origen se peguen en una misma hoja en archivo de destino, unos a continuación de los anteriores, y no en hojas diferentes?

  36. Por sxntxnder, Jun 19, 2013 | Responder

    debes colocar la ruta donde estan los archivos que vas a unir ejemplo “C:\Documents and Settings\Administrador\Escritorio\unir_excel”

  37. Por Alejandra, Jun 20, 2013 | Responder

    Funciona PERFECTO!!!!

    Muchísimas gracias!!!!!

  38. Por Daniel Jauregui, Jul 14, 2013 | Responder

    No pude hacerlo con vbs :( pero encontré una herramienta que me ayuda con este tema, tal vez le interese a alguien mas que no tenga tantos conocimientos sobre vbs :):

    http://www.ablebits.com/excel-lookup-tables/index.php

    Saludos.

  39. Por Nictzia, Jul 30, 2013 | Responder

    No me funciona dice que falla en listar ficheros: fichero = Dir(directorio, vbDirectory)
    Y en unir:
    XL.Workbooks(nombre_final).Close True

    Helpp!!!!!

  40. Por Luis, Ago 28, 2013 | Responder

    Wow!

    Está Genial, Muchas Gracias!!!

  41. Por Nestor, May 7, 2014 | Responder

    Excelente aporte, me solucionó el trabajo de varios días.

  42. Por JOSE MATTHEUZ, Oct 15, 2014 | Responder

    Buen Dia, rvaquerizo

    Muy buena Macro, me ha sido de gran ayuda en mi trabajo. Queria saber como puedo hacer que un titulo digitado en el archivo Unir, sea colocado en la respectiva hoja en el archivo nuevo

    Archivos Archivos seleccionados TITULO HOJA
    importe1.xlsx ENERO
    importe2.xlsx FEBRERO
    importe3.xlsx MARZO

    agradezco cualquier ayuda que me puedan brindar

Publica un Comentario