Nos gustaría hacer una macro que guarde un historial de las modificaciones que se vayan haciendo en la hoja. Que incluya, por ejemplo, la dirección de la celda, el dato que se haya escrito, y la fecha y la hora de modificación. Algo como el comando Historial, pero diseñado a nuestro gusto. ¿Es posible? ¿Cómo sería esa macro?
Es posible crear una macro que se ejecute automáticamente cada vez que cambia un valor en la hoja y que guarde los datos que pide Walter en la misma hoja o en un archivo externo. En este caso veamos cómo llevar a cabo la segunda alternativa. La macro sería más o menos así:
Private Sub Worksheet_Change(ByVal Target As Range)
Open “historia.txt” For Append As #1
If Target.Column = 1 Then
direccion = Target.Address
dato = Target.Value
Write #1, direccion, dato, Now
End If
Close #1
End Sub
Por tener el nombre especial Worksheet_ Change, esta macro se ejecuta automáticamente cada vez que cambia un dato cualquiera. Lo primero que hace es abrir el archivo de texto que hemos llamado “historia”. Luego verifica que la celda modificada pertenezca a la columna [A] (propiedad Column igual a 1). En caso afirmativo, guarda en variables adecuadas las coordenadas de la celda modificada (propiedad Address) y su nuevo valor (propiedad Value), y graba todo en un registro del archivo historia, junto con la fecha y hora de la modificación, tomadas de la función Now.
Esta macro no se escribe en un módulo, sino en el código de una hoja. Para eso:
1. Tomamos las opciones [Herramientas/Macro/Editor de Visual Basic].
2. Una vez dentro del editor, tomamos las opciones [Ver/Explorador de proyectos].
3. Dentro del explorador, seleccionamos la rama correspondiente a la hoja cuyo historial se quiera construir.
4. Tomamos las opciones [Ver/Código]. Se abre la ventana de código de la hoja, con dos listas desplegables en la parte superior.
5. En la primera lista seleccionamos [Worksheet] y en la segunda [Change].
Esto escribe la primera y la última línea de la macro. Nosotros tenemos que completar el código según se indica más arriba.