Cómo hacer un respaldo en otro libro de ciertas hojas al cerrar un libro de Excel
Tengo una base de datos de Excel y necesito que se genere un respaldo de ciertas hojas (por ejemplo: Hoja1, Hoja2), de ese libro al cerrarlo, pero en otro libro llamado "respaldo". El objetivo es salvar de un desastre la información capturada de la base de datos sin el programa que la interpreta.
1 Respuesta
H o l a:
Pon la siguiente macro en los eventos de tu libro.
Cambia "Hoja1" y "Hoja2", por lo nombres de hojas que desees respaldar.
Cambia "respaldo.xlsx" por el nombre del archivo que contendrá el respaldo. Este archivo deberá estar en la misma carpeta donde tienes el archivo, o bien, si lo prefieres en otra carpeta, cambia esta línea:
ruta = l1.Path & "\"
Por una carpeta, por ejemplo:
ruta = "C:\trabajo\respaldo\"
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'Por.Dante Amor Application.ScreenUpdating = False Set l1 = ThisWorkbook ruta = l1.Path & "\" arch = "respaldo.xlsx" If Dir(ruta & arch) <> "" Then Set l2 = Workbooks.Open(ruta & arch) l1.Sheets("Hoja1").Copy after:=l2.Sheets(l2.Sheets.Count) l1.Sheets("Hoja2").Copy after:=l2.Sheets(l2.Sheets.Count) l2.Save l2.Close MsgBox "Respaldo con éxito", vbInformation, "RESPALDAR" Else MsgBox "No existe el archivo respaldo", vbCritical, "RESPALDAR" End If End Sub
Instrucciones para poner la macro en los eventos ThisWorkbook
- Abre tu libro de excel
- Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
- Del lado izquierdo dice: VBAProject, abajo dale doble click a ThisWorkbook
- Del lado derecho copia la macro
':) ':)
Hola, gracias por tu apoyo, la macro funciona bien, el único problema es que al abrir varias veces el libro hace el respaldo de las hojas y las repite no las sustituye o actualiza, es decir, en el libro "respaldo.xlsx" va adicionando hojas: hoja1, hoja2, luego al siguiente respaldo hoja1, hoja2, hoja1(2), hoja2(2), luego hoja1, hoja2, hoja1(2), hoja2(2), hoja1(3), Hoja2(3) y así sucesivamente. Solo ese pequeño detalle, Gracias!!
Te anexo la macro actualizada
Sub Respaldar() 'Por.Dante Amor Application.ScreenUpdating = False Application.DisplayAlerts = False Set l1 = ThisWorkbook ruta = l1.Path & "\" arch = "respaldo.xlsx" If Dir(ruta & arch) <> "" Then Set l2 = Workbooks.Open(ruta & arch) For Each h In l2.Sheets h.Name = "borrar " & h.Index Next l1.Sheets("Hoja1").Copy after:=l2.Sheets(l2.Sheets.Count) l1.Sheets("Hoja2").Copy after:=l2.Sheets(l2.Sheets.Count) For Each h In l2.Sheets If Left(h.Name, 6) = "borrar" Then h.Delete End If Next l2.Save l2.Close MsgBox "Respaldo con éxito", vbInformation, "RESPALDAR" Else MsgBox "No existe el archivo respaldo", vbCritical, "RESPALDAR" End If End Sub
':) ':)
Ahora no respalda nada, tampoco sale el mensaje "respaldo con éxito", el archivo de respaldo se encuentra en la misma ruta del archivo original, da la impresión que no se ejecuta.
Tienes que tener 2 hojas en tu archivo, y deben tener los nombres "hoja1" y "hoja2".
¿Cambiaste algo en la macro?
¿Tienes las macros habilitadas en tu archivo?
La macro la pusiste en el archivo que tiene las hojas "hoja1" y "hoja2"
¿El archivo respaldo está cerrado?
Revisa lo anterior y prueba nuevamente.
Sub Respaldar()
'Por.Dante Amor
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set l1 = ThisWorkbook
ruta = l1.Path & "\"
arch = "Respaldo Análisis.xlsx"
If Dir(ruta & arch) <> "" Then
Set l2 = Workbooks.Open(ruta & arch)
For Each h In l2.Sheets
h.Name = "borrar " & h.Index
Next
l1.Sheets("Predio").Copy after:=l2.Sheets(l2.Sheets.Count)
l1.Sheets("Resultados Laboratorio").Copy after:=l2.Sheets(l2.Sheets.Count)
l1.Sheets("Recomendaciones").Copy after:=l2.Sheets(l2.Sheets.Count)
l1.Sheets("Análisis Foliar").Copy after:=l2.Sheets(l2.Sheets.Count)
For Each h In l2.Sheets
If Left(h.Name, 6) = "borrar" Then
h.Delete
End If
Next
l2.Save
l2.Close
MsgBox "Respaldo con éxito", vbInformation, "RESPALDAR"
Else
MsgBox "No existe el archivo respaldo", vbCritical, "RESPALDAR"
End If
End Sub
Así es como está la macro en ThisWokBook, son las hojas que debo respaldar, y no lo hace, la primera macro si funcionaba solo era que repetía las hojas. Saludos
Disculpa, te envié mi macro de pruebas.
Cambia la macro de thisworkbook por esta:
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'Por.Dante Amor Application.ScreenUpdating = False Application.DisplayAlerts = False Set l1 = ThisWorkbook ruta = l1.Path & "\" arch = "respaldo.xlsx" If Dir(ruta & arch) <> "" Then Set l2 = Workbooks.Open(ruta & arch) For Each h In l2.Sheets h.Name = "borrar " & h.Index Next l1.Sheets("Hoja1").Copy after:=l2.Sheets(l2.Sheets.Count) l1.Sheets("Hoja2").Copy after:=l2.Sheets(l2.Sheets.Count) For Each h In l2.Sheets If Left(h.Name, 6) = "borrar" Then h.Delete End If Next l2.Save l2.Close MsgBox "Respaldo con éxito", vbInformation, "RESPALDAR" Else MsgBox "No existe el archivo respaldo", vbCritical, "RESPALDAR" End If End Sub
Hola, me da error 52 en tiempo de ejecución, "nombre o número de archivo incorrecto" y al depurar me señala esta línea" If Dir(ruta & arch) <> "" Then". Cuando sustituyo "ruta=l1.Path & "\"", por la ruta real me da el mensaje "No existe el archivo respaldo" y si al final de la ruta real pongo el nombre del archivo también me dice lo mismo, te envío cómo está:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Por.Dante Amor
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set l1 = ThisWorkbook
ruta = "C:\Users\Oscar\OneDrive\Seprotec\INFORMACION TECNICA\ANALISIS DE SUELOS"
arch = "Respaldo Análisis.xlsx"
If Dir(ruta & arch) <> "" Then
Set l2 = Workbooks.Open(ruta & arch)
For Each h In l2.Sheets
h.Name = "borrar " & h.Index
Next
l1.Sheets("Predio").Copy after:=l2.Sheets(l2.Sheets.Count)
l1.Sheets("Resultados Laboratorio").Copy after:=l2.Sheets(l2.Sheets.Count)
l1.Sheets("Recomendaciones").Copy after:=l2.Sheets(l2.Sheets.Count)
l1.Sheets("Análisis Foliar").Copy after:=l2.Sheets(l2.Sheets.Count)
For Each h In l2.Sheets
If Left(h.Name, 6) = "borrar" Then
h.Delete
End If
Next
l2.Save
l2.Close
MsgBox "Respaldo con éxito", vbInformation, "RESPALDAR"
Else
MsgBox "No existe el archivo respaldo", vbCritical, "RESPALDAR"
End If
End Sub
Saludos!!
- Compartir respuesta