Macro al cerrar libro que cree hojas en directorios

Busco ayuda, ya que quiero generar una macro que al cerrar el libro de excel:

  1. Me guarde los cambios.
  2. Genere un libro por cada hoja de calculo que tengo en ese libro
  3. Me copie los libros que yo elija en los directorios de la red que le diga (en la macro le indicare el directorio)
  4. Me cierre el libro.

He llegado hasta el punto 2, pero no llego a más.

Por aquí voy:

 Sub auto_close()
For i = 1 To Sheets.Count
 Application.SheetsInNewWorkbook = 1
On Error Resume Next
Sheets(i).Select
    Cells.Copy
    nombre_hoja = ActiveSheet.Name
        Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    ActiveSheet.Paste
        Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & nombre_hoja, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False
ActiveWorkbook.Close False
  Application.DisplayAlerts = True
Next i
End Sub

1 respuesta

Respuesta
1

Te anexo la macro con la opción de poner los nombres de los libros y de las rutas en la macro. Le hice unos ajustes a tu macro para crear un libro por hoja y también agregué la parte para copiar el libro a una ruta.

Sub auto_close()
'Act.Por.Dante Amor
    Application.ScreenUpdating = False
    '
    libros = Array("primera", "Hoja2")
    destinos = Array("C:\trabajo\", "C:\a1\")
    '
    For i = 1 To Sheets.Count
        Sheets(i).Copy
        Application.DisplayAlerts = False
        '
        hoja = ActiveSheet.Name
        ruta = ThisWorkbook.Path & "\"
        '
        ActiveWorkbook.SaveAs Filename:=ruta & hoja, FileFormat:=xlNormal
        libro = ActiveWorkbook.Name
        ActiveWorkbook.Close False
        Application.DisplayAlerts = True
        '
        For j = LBound(libros) To UBound(libros)
            If hoja = libros(j) Then
                FileCopy ruta & libro, destinos(j) & libro
                Exit For
            End If
        Next
    Next
    MsgBox "Copia terminada", vbInformation
End Sub

La macro funciona así, por ejemplo, tienes 3 hojas: "Primera", "Hoja2" y "Hoja3".

Cuando ejecutas la macro te crea 3 libros, llamados cada libro "Primera.xls", "Hoja2.xls" y "Hoja3.xls".

En la macro le tienes que indicar a cuáles nombres de hojas los vas a copiar y en qué ruta los quieres, eso lo tienes que indicar en esta parte de la macro:

    libros = Array("primera", "Hoja2")
    destinos = Array("C:\trabajo\", "C:\a1\")

En mi ejemplo le estoy diciendo que el libro "primera.xls", después de que la hoja "primera" se cree como libro "primera.xls", este libro lo copie a la ruta "C:\trabajo\", lo mismo para el libro "Hoja2.xls", después de crear el libro "Hoja2.xls" que lo copie a la ruta "C:\a1\". Por último no puse la "Hoja3", ese libro no lo quiero copiar, por lo tanto, no lo incluyo en el arreglo de "libros".

Entonces, cambia en el arreglo de "libros" los libros que si quieras copiar y en el arreglo de "destinos" pon las rutas correspondientes para cada libro.

Por último si quieres cerrar tu libro, solamente escribe: ThisWorkbook. Close

La primera parte me sale bien, pero el mover las hojas determinadas a los directorios no me sale:

He hecho dos ejemplos de mover las hojas 1 y 2 a los directorios

KK\1 y kk\2 del disco e;\ pero algo me dice que no es lo correcto...

GRACIAS POR TU PACIENCIA::::

Sub auto_close()
'Act.Por.Dante Amor
    Application.ScreenUpdating = False
    '
    libros = Array("primera", "Hoja2")
    destinos = Array("C:\trabajo\", "C:\a1\")
    '
    For i = 1 To Sheets.Count
        Sheets(i).Copy
        Application.DisplayAlerts = False
        '
        hoja = ActiveSheet.Name
        ruta = ThisWorkbook.Path & "\"
        '
        ActiveWorkbook.SaveAs Filename:=ruta & hoja, FileFormat:=xlNormal
        libro = ActiveWorkbook.Name
        ActiveWorkbook.Close False
        Application.DisplayAlerts = True
        '
        For j = LBound(libros) To UBound(libros)
            If hoja = libros(j) Then
                libros = Array("1", "2")
                destinos = Array("e:\kk\1\", "e:\kk\2\")
                FileCopy ruta & libro, destinos(j) & libro
                Exit For
            End If
        Next
    Next
    ThisWorkbook.Close
End Sub

Ya lo he solucionado,,

Donde ponía To UBound(libros), hay que poner

To UBound(destinos)

Me has hecho un gran favor...

Muchas gracias.

Para alguien que le pueda valer... queda así

Sub auto_close()
'Act.Por.Dante Amor
    Application.ScreenUpdating = False
    For i = 1 To Sheets.Count
        Sheets(i).Copy
        Application.DisplayAlerts = False
        '
        hoja = ActiveSheet.Name
        ruta = ThisWorkbook.Path & "\"
        '
        ActiveWorkbook.SaveAs Filename:=ruta & hoja,    FileFormat:=xlNormal
        libro = ActiveWorkbook.Name
        ActiveWorkbook.Close False
        Application.DisplayAlerts = True
        '
                libros = Array("1", "2", "3")
                destinos = Array("e:\kk\1\", "e:\kk\2\", "e:\kk\3\")
                For j = LBound(libros) To UBound(destinos)
                If hoja = libros(j) Then
                FileCopy ruta & libro, destinos(j) & libro
                Exit For
            End If
        Next
    Next
    ThisWorkbook.Close
End Sub

Una pregunta más.
Del libro de excel

  • Me ha creado un libro nuevo por cada hoja en el mismo directorio.
  • Me ha copiado las hojas que yo quiero al directorio que yo quiero (no todas)
    Pregunta
    • ¿cómo puedo eliminar las hojas que se han creado?
    • Ya que solo quiero dejar el libro original y los directorios con las hojas copiadas.Se me ocurre
      • Kill "path\fichero1.xls"
      • Kill "path\fichero2.xls"
      • Kill "path\fichero3.xls"
    • Así con todos los ficheros que quiero eliminar.
    • ¿Hay alguna opción de incluir todos los ficheros en la misma sentencia sin tener que ponerlo uno a uno?
      Muchas gracias por tu ayuda...

Podrías crear una pregunta nueva por cada petición

Yo lo que quiero es borrar todos los xls que me ha generado.

Al final la cosa se va complicando, ya que es un libro con muchas hojas y lo que quiero es que cada vez que cierro el libro, extraer solo 3 o 4 hojas determinadas y copiarlas cada una en un directorio distinto, (como ya existe esa hoja en ese directorio sobreescribir)..

Esa es la idea, la macro actual me crea un libro con una hoja cada uno, me lo copia en un directorio predeterminado y me deja todas las hojas copiadas, lo que quiero es borrarlas, si no hay otra opcion, con el kill voy eliminando una a una

¿se te ocurre otra cosa?

Tu pregunta original dice esto:

"Genere un libro por cada hoja de calculo que tengo en ese libro"

Si solamente quieres extraer algunas hojas, podemos modificar la macro para que solamente extraiga las hojas que deseas y guardar esas hojas como libros en cada una de sus rutas.

La macro hace actualmente esto:

1.- Para cada hoja en el libro

2.- Crea hoja "1" como libro nuevo

3.- Guarda libro nuevo "ruta\1.xls"

4.- Copia archivo "ruta\1.xls" a  "e:\kk\1\"

5.- Ahora quieres borrar "ruta\1.xls"

Son 5 pasos, cuando podrías hacerlo en 3.

1.- Para las hojas 1,2 y 3

2.- Crea hoja "1" como libro nuevo

3.- Guardar libro nuevo como  "e:\kk\1\"

Ahí en la macro tienes los elemento para hacer lo mismo si necesidad de copiar y después borrar los archivos. Si quieres que te ayude con la nueva macro, podrías crear una nueva pregunta en todo expertos, si gustas puedes poner al final del título que va dirigida a Dante Amor.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas