Por supuesto puede hacerse también con macros, más precisamente, programando un evento.
El código del evento, que ponemos en el módulo de la hoja correspondiente, es el siguiente:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngColumnaNombre As Range
Set rngColumnaNombre = Range("A:A")
If Union(Target, rngColumnaNombre).Address = rngColumnaNombre.Address Then
Select Case Len(Target)
Case Is > 0
Target.Offset(0, 1) = Now
Case Else
Target.Offset(0, 1).ClearContents
End Select
End If
End Sub
En nuestro ejemplo la columna A contiene los nombres y la columna B el registro de la fecha. Si borramos un nombre, también la fecha es eliminada.
El código evalúa la celda activa cuando se produce un cambio en la hoja; si la celda activa está en la columna A y no esta vacía, se registra la fecha y hora en la celda paralela de la columna B.
En este código definimos una variable de tipo rango
Set rngColumnaNombre = Range("TablaNombres").Columns(1)
La variable se refiere a la primera columna de la tabla “TablaNombres”
Esto nos permite crear una rango dinámico de manera que valores introducidos fuera de la tabla no disparan el evento.
Existen, por supuesto, otras formas de crear rangos dinámicos en el código.
1 – crear un nombre que se refiera al rango dinámico usando una fórmula con las funciones DESREF o INDICE; por ejemplo
=Hoja1!$A$2:INDICE(Hoja1!$A:$A,CONTARA(Hoja1!$B:$B)+1)
El código es
Private Sub Worksheet_Change(ByVal Target As Range)
If Union(Target, Range("TablaNombres")).Address = Range("TablaNombres").Address Then
Select Case Len(Target)
Case Is > 0
Target.Offset(0, 1) = Now
Case Else
Target.Offset(0, 1).ClearContents
End Select
End If
End Sub
2 – definir el rango en el código
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TablaNombres As Range
Set TablaNombres = Range(Range("A2"), Cells(Range("A2").End(xlDown).Row + 1, 1))
If Union(Target, TablaNombres).Address = TablaNombres.Address Then
Select Case Len(Target)
Case Is > 0
Target.Offset(0, 1) = Now
Case Else
Target.Offset(0, 1).ClearContents
End Select
End If
End Sub