¿Como copiar varias hojas de varios libros que yacen en una sola carpeta a un libro existente?
Quisiera crear un macro que, copie de varios libros a otro ya existente, que se encuentran dentro de una misma carpeta.
Es decir quiero copiar la columna b de la hoja "Datos" que tiene este mismo nombre en los otros libros (libro 1, 2, 3 y 4) en el libro Resumen en la hoja que posee el mismo nombre, y quisiera que cada columna aparesca bajo la ultima hilera de datos copiados.
Espero haberme dado a entender y agradezco de antemano cualquier ayuda.
1 Respuesta
.22.11.16
Buenas tardes, Edwin
A continuación te paso una rutina que deberías agregar a tu archivo Resumen que funcionará como receptor de los datos de las hojas de los archivos que tendrás en esa carpeta.
En ese archivo operativo, accede al Editor de VBA (Atajo: Alt + F11), inserta un módulo - si no tuvieras uno ya- y pega el siguiente código:
Sub juntator() '---- Variables modificables: '=== EDWIN, modifica estos datos de acuerdo a tu proyecto: DirBusc = "C:\CARPETAdeARCHIVOS" ' Donde están los archivos a consolidar Extension = "xls" LaHoja = "Datos" ' Nombre de la hoja de donde traer los datos. HojaAcum = "Datos" ' Nombre de la hoja en archivo Resumen donde se acumulan los datos Coldatos = "B" ' Columna de y a donde se pegan los datos de cada archivo Limpia = True ' True para que borre lo acumulado antes, False para que agregue a lo existente. '---- fin Variables ' '---- inicio de rutina: Set Consolidado = ActiveWorkbook Sheets(HojaAcum).Select If Limpia Then Range(Coldatos & "1").CurrentRegion.Clear ultcelda = Coldatos & "1" Else ultcelda = IIf(Range(Coldatos & "1").CurrentRegion.Rows.Count > 1, Range(Coldatos & "1").End(xlDown).Row, 1) ultcelda = Coldatos & ultcelda + 1 End If DirBusc = DirBusc & IIf(Right(DirBusc, 1) = "\", "", "\") LosArchivos = Dir(DirBusc & "*." & Extension) Application.DisplayAlerts = False Application.ScreenUpdating = False Do While LosArchivos <> "" Application.StatusBar = ">>>>>>>>>>>>>> Un momento, egragando hoja de archivo " & Left(LosArchivos, InStr(1, LosArchivos, Extension) - 2) Workbooks.Open DirBusc & LosArchivos, xlNo On Error Resume Next Set HojaTraer = ActiveWorkbook.Sheets(LaHoja) If Err = 0 Then 'control de existencia de la hoja de Datos HojaTraer.Select If Range(Coldatos & "1").CurrentRegion.Rows.Count > 1 Then 'control de existencia de datos a exportar de la hoja Range(Range(Coldatos & "1"), Range(Coldatos & Range(Coldatos & "1").End(xlDown). Row)). Copy With Consolidado .Sheets(HojaAcum).Range(ultcelda).PasteSpecial Paste:=xlPasteValues .Sheets(HojaAcum).Range(ultcelda).PasteSpecial Paste:=xlPasteFormats Application.CutCopyMode = False ultcelda = IIf(.Range(Coldatos & "1").CurrentRegion.Rows.Count > 1, .Range(Coldatos & "1").End(xlDown).Row, 1) ultcelda = Coldatos & ultcelda + 1 End With cont = cont + 1 End If End If Workbooks(LosArchivos).Close xlNo LosArchivos = Dir Loop Application.DisplayAlerts = True ElMensaje = IIf(cont = 0, "NO SE AGREGO DATO ALGUNO", "Se agregaron los datos de : " & cont & " archivo" & IIf(cont > 1, "s", "")) TipoMens = IIf(cont = 0, vbCritical, vbInformation) ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!") Application.ScreenUpdating = True MsgBox ElMensaje, TipoMens, ElTitulo Set Consolidado = Nothing Set HojaTraer = Nothing End Sub
Nota que al principio del código le podrás indicar de qué carpeta leer los archivos y cual es la extensión que deseas considerar. Si quisieras que traiga todos los archivos de MS Excel, reemplázala la variable "xlsx" por "xls*"
.
Fernando, muchas gracias por tu tiempo, estaré agregando esta rutina durante la tarde (son las 11 am acá en Caracas, Ve.) No soy muy diestro con vba, te estaré comentando nuevamente si tengo inconvenientes o si funciona sin problemas.
Un abrazo
.
Ok, pruébalo y dime si tienes algún inconveniente.
Como pareces ser nuevo aquí, te sugiero que valores las respuestas luego de probar lo sugerido.
Eventualmente, podrías cambiar la opinión respecto a la respuesta una vez que se hubiera resuelto el problema.
Saludos!
Fernando
.
Fernando mi pana, espero este bien,
Fíjate seguí tus instrucciones lo más que pude, e incluso inserte un botón para acceder al proceso, sin embargo los datos se pegan uno encima de otro, en vez de, bajo el ultimo.
Te anexo el código a ver si puedes ayudarme a conseguir la falla;
Sub juntator()
'---- Variables modificables:
'=== EDWIN, modifica estos datos de acuerdo a tu proyecto:
DirBusc = "C:\Users\emudarra\Desktop\macro" ' Donde están los archivos a consolidar
Extension = "xlsx"
LaHoja = "Datos" ' Nombre de la hoja de donde traer los datos.
HojaAcum = "RESUMEN" ' Nombre de la hoja en archivo Resumen donde se acumulan los datos
Coldatos = "B" ' Columna de y a donde se pegan los datos de cada archivo
Limpia = True ' True para que borre lo acumulado antes, False para que agregue a lo existente.
'---- fin Variables
'
'---- inicio de rutina:
Set Consolidado = ActiveWorkbook
Sheets(HojaAcum).Select
If Limpia Then
Range(Coldatos & "1").CurrentRegion.Clear
ultcelda = Coldatos & "1"
Else
ultcelda = IIf(Range(Coldatos & "1").CurrentRegion.Rows.Count > 1, Range(Coldatos & "1").End(xlDown).Row, 1)
ultcelda = Coldatos & ultcelda + 1
End If
DirBusc = DirBusc & IIf(Right(DirBusc, 1) = "\", "", "\")
LosArchivos = Dir(DirBusc & "*." & Extension)
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Do While LosArchivos <> ""
Application.StatusBar = ">>>>>>>>>>>>>> Un momento, egregando hoja de archivo " & Left(LosArchivos, InStr(1, LosArchivos, Extension) - 2)
Workbooks.Open DirBusc & LosArchivos, xlNo
On Error Resume Next
Set HojaTraer = ActiveWorkbook.Sheets(LaHoja)
If Err = 0 Then 'control de existencia de la hoja de Datos
HojaTraer.Select
If Range(Coldatos & "1").CurrentRegion.Rows.Count > 1 Then 'control de existencia de datos a exportar de la hoja
Range(Range(Coldatos & "1"), Range(Coldatos & Range(Coldatos & "1").End(xlDown).Row)).Copy
With Consolidado
.Sheets(HojaAcum).Range(ultcelda).PasteSpecial Paste:=xlPasteValues
.Sheets(HojaAcum).Range(ultcelda).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
ultcelda = IIf(.Range(Coldatos & "1").CurrentRegion.Rows.Count > 1, .Range(Coldatos & "1").End(xlDown).Row, 1)
ultcelda = Coldatos & ultcelda + 1
End With
cont = cont + 1
End If
End If
Workbooks(LosArchivos).Close xlNo
LosArchivos = Dir
Loop
Application.DisplayAlerts = True
ElMensaje = IIf(cont = 0, "NO SE AGREGO DATO ALGUNO", "Se agregaron los datos de : " & cont & " archivo" & IIf(cont > 1, "s", ""))
TipoMens = IIf(cont = 0, vbCritical, vbInformation)
ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!")
Application.ScreenUpdating = True
MsgBox ElMensaje, TipoMens, ElTitulo
Set Consolidado = Nothing
Set HojaTraer = Nothing
End Sub
Otra cosa al terminarse el proceso la barra de estado de MS Excel queda con el siguiente mensaje "Un momento, agregando hoja de archivo Libro 4"
Agradecido de antemano por tu apoyo mi pana!
.
Hola, Edwin
Efectivamente, me parece que hubo un par de errores que corregí en esta versión.
Asegurate que los datos de las variables al inicio del código coincidan con los de tu archivo:
Sub juntator() '---- Variables modificables: '=== EDWIN, modifica estos datos de acuerdo a tu proyecto: DirBusc = "C:\CARPETAdeARCHIVOS" ' Donde están los archivos a consolidar Extension = "xls" 'pon xlsx para que abra sólo ese tipo de archivos. Acelera la rutina. LaHoja = "Datos" ' Nombre de la hoja de donde traer los datos. HojaAcum = "Datos" ' Nombre de la hoja en archivo Resumen donde se acumulan los datos Coldatos = "B" ' Columna de y a donde se pegan los datos de cada archivo Limpia = True ' True para que borre lo acumulado antes, False para que agregue a lo existente. '---- fin Variables ' '---- inicio de rutina: ' Set Consolidado = ActiveWorkbook Sheets(HojaAcum).Select If Limpia Then Range(Coldatos & "1").CurrentRegion.Clear ultcelda = Coldatos & "1" Else ultcelda = IIf(Range(Coldatos & "1").CurrentRegion.Rows.Count > 1, Range(Coldatos & "1").End(xlDown).Row, 1) ultcelda = Coldatos & ultcelda + 1 End If DirBusc = DirBusc & IIf(Right(DirBusc, 1) = "\", "", "\") LosArchivos = Dir(DirBusc & "*." & Extension) Application.DisplayAlerts = False Application.ScreenUpdating = False Do While LosArchivos <> "" Application.StatusBar = ">>>>>>>>>>>>>> Un momento, egragando hoja de archivo " & Left(LosArchivos, InStr(1, LosArchivos, Extension) - 2) Workbooks.Open DirBusc & LosArchivos, xlNo On Error Resume Next Set HojaTraer = ActiveWorkbook.Sheets(LaHoja) If Err = 0 Then 'control de existencia de la hoja de Datos HojaTraer.Select If Range(Coldatos & "1").CurrentRegion.Rows.Count > 1 Then 'control de existencia de datos a exportar de la hoja Range(Range(Coldatos & "1"), Range(Coldatos & Range(Coldatos & "1").End(xlDown). Row)). Copy With Consolidado.Sheets(HojaAcum) .Range(ultcelda).PasteSpecial Paste:=xlPasteValues .Range(ultcelda).PasteSpecial Paste:=xlPasteFormats Application.CutCopyMode = False ultcelda = IIf(.Range(Coldatos & "1").CurrentRegion.Rows.Count > 1, .Range(Coldatos & "1").End(xlDown).Row, 1) ultcelda = Coldatos & ultcelda + 1 End With cont = cont + 1 End If End If Workbooks(LosArchivos).Close xlNo LosArchivos = Dir Loop Application.DisplayAlerts = True ElMensaje = IIf(cont = 0, "NO SE AGREGO DATO ALGUNO", "Se agregaron los datos de : " & cont & " archivo" & IIf(cont > 1, "s", "")) TipoMens = IIf(cont = 0, vbCritical, vbInformation) ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!") Application.ScreenUpdating = True MsgBox ElMensaje, TipoMens, ElTitulo Set Consolidado = Nothing Set HojaTraer = Nothing Application.StatusBar = False End Sub
Las pruebas que hice funcionaron correctamente con estos ajustes.
Abrazo, mi pana!
Fer
.
- Compartir respuesta