Actualización automática de macro cuando cambian los datos fuentes

Tengo una macro que me crea una hoja resumen con datos de celdas de varias hojas del mismo libro, necesito que la macro se actualice al cambiar los datos de las hojas fuentes o con alguna otra función que no sea eliminar la hoja resumen y volver a ejecutarla macro.

Esta es mi macro creada:

Sub RESUMEN()

Sheets.Add after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = "xresumenx"
For Each hoja In ActiveWorkbook.Sheets
If hoja.Name <> "xresumenx" Then
Sheets("xresumenx").Range("a65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c3")
Sheets("xresumenx").Range("b65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c5")
Sheets("xresumenx").Range("c65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c6")
Sheets("xresumenx").Range("d65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ab32")
Sheets("xresumenx").Range("e65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ac32")
Sheets("xresumenx").Range("f65000").End(xlUp).Offset(1, 0).Value = hoja.Range("an32")
Sheets("xresumenx").Range("g65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ao32")
End If
Next
End Sub

Respuesta
1

Suponiendo que cuando hayas hecho las modificaciones tienes que guardar el libro, puedes crear un evento beforesave tal que así:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
For Each hoja In ActiveWorkbook.Sheets
    If hoja.Name <> "xresumenx" Then
    Sheets("xresumenx").Range("a65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c3")
    Sheets("xresumenx").Range("b65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c5")
    Sheets("xresumenx").Range("c65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c6")
    Sheets("xresumenx").Range("d65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ab32")
    Sheets("xresumenx").Range("e65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ac32")
    Sheets("xresumenx").Range("f65000").End(xlUp).Offset(1, 0).Value = hoja.Range("an32")
    Sheets("xresumenx").Range("g65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ao32")
    End If
Next
End Sub

De este modo siempre tendrás la hoja xresumenx actualizada cuando guardes el libro

Chevere se me actualiza al guardar pero debo borrar los datos anteriores para que funcione el evento BeforeSave, solo faltaría incluirle que sustituya los datos existentes por los nuevos, para eso le quite el Offset(1, 0) de cada línea al Beforesave pero me sustituye solo los datos de la última línea.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
For Each hoja In ActiveWorkbook.Sheets
    If hoja.Name <> "xresumenx" Then
    Sheets("xresumenx").Range("a65000").End(xlUp).Value = hoja.Range("c3")
    Sheets("xresumenx").Range("b65000").End(xlUp).Value = hoja.Range("c5")
    Sheets("xresumenx").Range("c65000").End(xlUp).Value = hoja.Range("c6")
    Sheets("xresumenx").Range("d65000").End(xlUp).Value = hoja.Range("ab32")
    Sheets("xresumenx").Range("e65000").End(xlUp).Value = hoja.Range("ac32")
    Sheets("xresumenx").Range("f65000").End(xlUp).Value = hoja.Range("an32")
    Sheets("xresumenx").Range("g65000").End(xlUp).Value = hoja.Range("ao32")
    End If
Next
End Sub

Así se encuentra el Beforesave actualemente

Ok, incluyo la línea Sheets("xresumenx"). ClearContents que borrará todos los datos de la hoja resumen antes de empezar la macro.

Si hay datos en la hoja xresumenx que no se pueden borrar, entonces la línea debería especificar el rango a borrar

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheets("xresumenx").ClearContents
For Each hoja In ActiveWorkbook.Sheets
    If hoja.Name <> "xresumenx" Then
    Sheets("xresumenx").Range("a65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c3")
    Sheets("xresumenx").Range("b65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c5")
    Sheets("xresumenx").Range("c65000").End(xlUp).Offset(1, 0).Value = hoja.Range("c6")
    Sheets("xresumenx").Range("d65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ab32")
    Sheets("xresumenx").Range("e65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ac32")
    Sheets("xresumenx").Range("f65000").End(xlUp).Offset(1, 0).Value = hoja.Range("an32")
    Sheets("xresumenx").Range("g65000").End(xlUp).Offset(1, 0).Value = hoja.Range("ao32")
    End If
Next
End Sub

1 respuesta más de otro experto

Respuesta

Tienes que crear un evento change en la hoja/s en los que hayan cambios y quieras que se actualicen los datos:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then RESUMEN ''' SI A1 DE ESTA MISMA HOJA CAMBIA, SE EJECUTA EL MACRO RESUMEN
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas