Ad esempio questa, in sostituzione della macro precedente:
- Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LogNum As Integer
CheckArea = "A2:C10" '<<< Area da tenere sotto controllo
Track = "Z1" '<<< Cella dove scrive data/Ora
LogNum = 300 '<< N° di blocchi che si conserveranno
'
If Application.Intersect(Target, Range(CheckArea)) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Range(Track).Offset(Range(Track).Value * 2 + 1) <> Environ("UserName") Then
Range(Track).Value = (Range(Track).Value + 1) Mod LogNum
End If
Range(Track).Offset(Range(Track).Value * 2 + 1) = Environ("userName")
Range(Track).Offset(Range(Track).Value * 2 + 2) = Now()
Range(Track).Offset(Range(Track).Value * 2 + 3).Range("A1:A2").Clear
Application.EnableEvents = True
End Sub
In questo caso non si occupa una sola cella per il track, ma la colonna sottostante alla cella "Track", per una quantita' di record definibile in LogNum. Per limitare il tempo di lavoro della macro il buffer di tracking e' usato in modalita' "rolling", cioe' riscrivendo le aree prima usate man mano che il numero di log aumenta, e la cella Track e' usata come indice nel buffer. Ogni log usa 2 celle.
La lettura va fatta dalla data/ora piu' recente all' indietro, e continuando dal fondo quando si arriva all' inizio colonna.
Si scrive nel buffer di log lo "UserName" (quello di Windows) e data/ora; altre opzioni sono il nome macchina [usare Environ("Computername")] o il domain name [usare Environ("DomainName")]; escluderei lo UserName di excel, quello si puo' variare con Strumenti /Opzioni, tab Generale.
Se lo stesso utente fa nella stessa sessione piu' modifiche viene memorizzata solo la piu' recente.
Ricky perdonera' l' invasione...
Ciao.