Saltar al contenido

Macros que se ejecute en todos los archivos de una carpeta especifica.


cathyuska

Recommended Posts

publicado

Hola, tengo una carpeta que se llama TRABAJO, ahí tengo muchos archivos que debo ejecutar la macros que ya me ayudaron, una que elimina a los reperidos de una fila dejando solo uno y manteniendo el resto. pero como son muchos archivos me demoro mucho en hacerlo uno por por uno, entonces mi pregunta es cómo puedo hacer para que esa macros se ejecute en todos los archivos de esa carpeta sin yo abrirlos y que se guarde automáticamente.

gracias

Muestra - AYUDA EXCEL.xlsm

publicado
hace 2 horas, cathyuska dijo:

sin yo abrirlos y que se guarde automáticamente.

¿Te puedes evitar estar abriendo los libros "manualmente"? Sí, aunque para ejecutar las macros los libros deben abrirse.

No mencionas si cada uno de los libros ya tiene la macro guardada o no, esto nos deja dos escenarios.

Escenario 1: Ejecutar la macro en varios libros sin abrirlos (por ti) es posible pero se requiere un libro maestro que ejecute la macro y abra los otros libros en segundo plano. Sería algo así:

Abre el libro de Excel que contiene la macro VBA.

Crea una nueva macro en este libro que:

Utilice un bucle (por ejemplo, For Each) para recorrer todos los archivos en la carpeta.

Abra cada libro en modo oculto (Workbook.Open(Filename, ReadOnly, False)).

Ejecute la macro existente en cada libro abierto.

Guarde y cierre el libro.

Escenario 2: Abrir libros, ejecutar la macro, guardar y cerrar. Para este escenario, puedes utilizar un procedimiento similar al del Escenario 1, pero en este caso, cada libro ya contiene la macro que se debe ejecutar. Entonces sería:

Tener un libro de Excel maestro con una macro que:

Abra cada libro de la carpeta uno por uno.

Ejecute la macro correspondiente en cada libro abierto.

Guarde los cambios realizados por la macro.

Cierre el libro antes de pasar al siguiente.

En ambos casos, necesitarás ajustar las rutas de los archivos y los nombres de las macros según corresponda. Aquí tienes un ejemplo de macro que podrías adaptar:

Sub EjecutarMacroEnLibros()
    Dim wb As Workbook
    Dim myPath As String
    Dim myFile As String
    Dim myExtension As String

    ' Ruta de la carpeta donde están los libros
    myPath = "C:\TuCarpeta\"
    ' Extensión de los archivos, por ejemplo ".xlsx"
    myExtension = "*.xlsx"

    ' Asegúrate de que la ruta termine en \
    If Not myPath Like "*\" Then myPath = myPath & "\"

    ' Nombre del primer archivo
    myFile = Dir(myPath & myExtension)

    ' Bucle para abrir, ejecutar y cerrar cada libro
    Do While myFile <> ""
        Set wb = Workbooks.Open(Filename:=myPath & myFile, ReadOnly:=False)
        
        ' Aquí llamas a la macro que está en el libro abierto
        ' Por ejemplo: Application.Run "NombreDeLaMacro"
        
        ' Guarda y cierra el libro
        wb.Close SaveChanges:=True
        
        ' Siguiente archivo
        myFile = Dir
    Loop
End Sub

Así que en base a lo explicado si editas un poco no deberías tener problemas en alcanzar el resultado que buscas.

Saludines.

 

publicado

Hola, los libros no tienen macros guardada. y los archivos de la carpeta contienen una sola hoja donde están los datos

 

 

publicado

En ese caso es el Escenario 1, donde tienes la macro en un libro "maestro" y deseas que se ejecute en cada uno de los libros dentro de esa carpeta, aunque estos no contengan la macro, entonces con algo así deberías poder hacerlo:

1.- Abre el libro maestro que contiene la macro que deseas ejecutar.

2.- Crea una nueva macro en este libro que haga lo siguiente:

  • Establece la ruta de la carpeta donde se encuentran los libros a actualizar.
  • Utiliza un bucle (por ejemplo, For Each) para recorrer todos los archivos en la carpeta.
  • Abre cada libro en segundo plano.
  • Ejecuta la macro del libro maestro en el libro abierto.
  • Guarda y cierra el libro.
Sub EjecutarMacroEnOtrosLibros()
    Dim wb As Workbook
    Dim myPath As String
    Dim myFile As String
    Dim myExtension As String

    ' Ruta de la carpeta donde están los libros
    myPath = "C:\TuCarpeta\"
    ' Extensión de los archivos, por ejemplo ".xlsx"
    myExtension = "*.xlsx"

    ' Asegúrate de que la ruta termine en \
    If Not myPath Like "*\" Then myPath = myPath & "\"

    ' Nombre del primer archivo
    myFile = Dir(myPath & myExtension)

    ' Bucle para abrir, ejecutar la macro y cerrar cada libro
    Do While myFile <> ""
        Set wb = Workbooks.Open(Filename:=myPath & myFile, ReadOnly:=False)
        
        ' Ejecuta la macro del libro maestro
        ' Asegúrate de que la macro esté definida como pública (Public Sub TuMacro())
        Call TuMacro
        
        ' Guarda y cierra el libro
        wb.Close SaveChanges:=True
        
        ' Siguiente archivo
        myFile = Dir
    Loop
End Sub

"TuMacro" es el nombre de la macro que está en tu libro "maestro" y que quieres ejecutar en los otros libros. Recuerda que esta macro debe estar definida como pública.

Recuerda ajustar la ruta de la carpeta, la extensión de los archivos y el nombre de tu macro.

Haz las pruebas, inténtalo y comparte en el foro el avance o errores.

publicado

Usa el archivo Plantilla como su propio nombre dice “Plantilla”   es donde está el código, lo ejecutas y te cambiará todos los archivos que se encuentren en la misma ruta. Ojo ¡¡ todos menos plantilla que solo te servirá para ejecutar el código. Te mando adjuntos para que haga las prueba.

Prueba.rar

publicado
Private Sub CommandButton1_Click()
EliminarDuplicadosYOrdenarPorFilaEnTodosLosArchivos
End Sub
Sub EliminarDuplicadosYOrdenarPorFilaEnTodosLosArchivos(): Application.ScreenUpdating = False
    Dim ruta As String
    Dim archivo As String
    Dim libro As Workbook
    Dim archivosModificados As String
    Dim contadorArchivosModificados As Integer

    archivosModificados = ""
    contadorArchivosModificados = 0
    ruta = ThisWorkbook.Path & "\"
    archivo = Dir(ruta & "*.xlsm")'>>>>>>>>> Aquí debes poner la extención de tus archivos a modificar
    
    Do While archivo <> ""
        ' Ignorar el archivo actual
        If archivo <> ThisWorkbook.Name Then
            Set libro = Workbooks.Open(ruta & archivo)
            EliminarDuplicadosYOrdenarPorFila libro.Sheets("Hoja1")
            libro.Save
            libro.Close
            contadorArchivosModificados = contadorArchivosModificados + 1
            archivosModificados = archivosModificados & vbNewLine & archivo
        End If
        archivo = Dir
    Loop
    MsgBox "Se han modificado " & contadorArchivosModificados & " archivos:" & vbNewLine & archivosModificados
End Sub

Sub EliminarDuplicadosYOrdenarPorFila(hoja As Worksheet)
    Application.ScreenUpdating = False
    Dim ultimaFila As Long
    Dim ultimaColumna As Long
    Dim rangoFila As Range
    Dim valoresUnicos As Collection
    Dim celda As Range
    Dim i As Long
    
    With hoja
        ultimaFila = .Cells(.Rows.Count, "A").End(xlUp).Row
        ultimaColumna = .Cells(3, "AB").Column

        For i = 3 To ultimaFila
            Set rangoFila = .Range(.Cells(i, 1), .Cells(i, ultimaColumna))
            Set valoresUnicos = New Collection
            For Each celda In rangoFila
                On Error Resume Next
                valoresUnicos.Add celda.value, CStr(celda.value)
                On Error GoTo 0
            Next celda
            rangoFila.ClearContents
            For j = 1 To valoresUnicos.Count
                .Cells(i, j).value = valoresUnicos(j)
            Next j
            .Range(.Cells(i, 1), .Cells(i, valoresUnicos.Count)).Sort Key1:=.Cells(i, 1), Order1:=xlAscending, Header:=xlNo
        Next i
    End With
End Sub

Código completo incluido en libro plantilla

publicado

Hola, es justo lo que busco, solo por un detalle en mis archivos modifico el rango A:AB en vez de aparecer los valores corregidos  en el rango AD:BE.

Nose como ajustarla

gracias

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.