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:
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.
Duda: hay alguna forma de solucionar el error que esta marcando excel 2010?
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.
Hola, ¿en qué parte de la macro falla?
Muchisimas gracias, me ha servido mucho. Muy buen macro.
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
falla la macro en excel 2010 en:
XL.Workbooks.Open libro
Muchas gracias. Sí que sería muy interesante que la hoja tomase el nombre del libro.
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
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
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
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.
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
Fantástica la macro. Me acabas de ahorrar horas/dias de trabajo.
No te beso por que no te tengo a mano.
Gracias.
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…
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
Esther, por petición popular haré la macro. Busca en el blog porque un compañero mandó una versión muy mejorada.
Buenísima entrada. Funciona muy bien. Gracias!
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?
Hola, debería de funcionar. Buena pregunta. Tengo que probarlo. Saludos.
Hola: al jecutar la macro me manda un error en está parte XL.Workbooks.Open libro
en office 2007 me pueden ayudar please ??
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.
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 :)
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.
como puedo hacer una carpeta con las hojas en excel k no haga tantas
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?
Manolo, no funciona el bucle que pone la posición, ejecuta por pasos y mira el valor que toma el índice i.
TPM ESTA FENOMENAL!
Buenisimo aporte lo probe y me funciono rebien..gracias.
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?
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??
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
Excelente libro de referencia… genio…
Funciona de maravilla, gracias por compartir.
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?
debes colocar la ruta donde estan los archivos que vas a unir ejemplo «C:\Documents and Settings\Administrador\Escritorio\unir_excel»
Funciona PERFECTO!!!!
Muchísimas gracias!!!!!
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.
No me funciona dice que falla en listar ficheros: fichero = Dir(directorio, vbDirectory)
Y en unir:
XL.Workbooks(nombre_final).Close True
Helpp!!!!!
Wow!
Está Genial, Muchas Gracias!!!
Excelente aporte, me solucionó el trabajo de varios días.
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
Disculpa hay manera en que se copie la ultima hoja en vez de la última?
Saludos
Hola, la verdad es que no entiendo muy bien a lo que te refieres. ¿Qué quieres hacer exactamente?
Buenos días,
Quisiera la macro para copiar todas las hojas de mis libros en vez de solo la primera.
Saludos
Ya te entiendo. Hay que seleccionar todas las hojas del libro. Podemos hacerlo con un array. Lo miro y te digo algo.
Hola, me gustaría saber cómo copiar la misma celda («B3») de muchos libros en una columna al costado izquierdo de una tabla que ya se extrajo (Columna A), con la macro que coloco luego. El proceso que quiero es este:
*Se abra el archivo 1 de n que existen en una carpeta.
*Se copia la tabla (eso está listo en la macro que encontré).
*Se copie la celda B3 en la columna «A» hasta que no hayan más datos en la tabla que empieza en la columna «B»
*Se cierre el archivo y abra el siguiente haciendo el mismo proceso.
«»Sub ponernombre()
‘Por.DAM
Set l1 = ThisWorkbook
Set h1 = l1.Sheets(«concentrado»)
h1.Cells.Clear
Application.ScreenUpdating = False
Set nav = CreateObject(«shell.application»)
carp = nav.browseforfolder(0, «SELECCIONA CARPETA», 0, «C:\trabajo»).items.Item.Path
If carp = «» Then Exit Sub
carp = carp & «\»
ChDir carp
archi = Dir(«*.xls*»)
Do While archi «»
Workbooks.Open archi
uf = ActiveCell.SpecialCells(xlLastCell).Row
uc = ActiveCell.SpecialCells(xlLastCell).Column
u = h1.Range(«A1»).SpecialCells(xlLastCell).Row + 1
Range(Cells(6, 1), Cells(uf, uc)).Copy h1.Range(«B» & u)
ActiveWorkbook.Close
archi = Dir()
Loop
MsgBox «Archivos concentrados», vbInformation, «UNIR ARCHIVOS EN UNA HOJA»
End Sub»»
Hola Joel, en el caso que indicas no sirve la macro, tienes que recorrer la hoja antes de copiar.
excelente!! muchas gracias!!
Hola, tengo un par de dudas sobre unas modificaciones que me interesan de la macro:
– Quería sólo copiar la tercera pestaña de cada Excel de origen.
– Mis archivos de origen son .xlsm y me da un error en el archivo de salida.
Me podríais ayudar con esto?
Muchas gracias!
muchas gracias!!!
funciona a la perfección
Excelente muy buen trabajo !!!!!
Para la personas que tienen inconvenientes, deben colocar el archivo «unir_varios_excel.xlsm» en la misma carpeta donde se encuentres lo archivos a unir, la extensión no me presento problemas en mi caso eran archivos .csv y lo unifico sin inconvenientes.
Gracias.
Muchas gracias!
muy útil, muchas gracias por compartirlo, me ha venido muy bien :)
al ejecutar la macro me da el siguiente error:
se ha producido el error ‘1004’ en tiempo de ejecución:
excel no puede inserta las hojas en el libro de destino porque éste contiene menos filas y columnas que el libro de origen. Para mover o copiar los datos al libro destino, selecciones los datos y, a continuación, utilizar los comandos copiar y pegar para insertarlos en las hojas de otro libro
por favor si me pueden ilustrar con este error
gracias
El nombre del libro o de la hoja es muy largo y por eso aparece el error. Puede ser que la carpeta tenga un directorio muy extenso
Hola,
A mi también me da error en
XL.Workbooks.Open libro
¿aún no se sabe por que? Sería un puntazo… me ahorraría mucho trabajo…
Gracias!!