¿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

Respuesta
1

.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

.

¡Gracias!  mi pana agradecido por tu tiempo

.

De nada.

Para la complejidad de la rutina, mezquina tu calificación, mi pana...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas