AW: Automatische Datierung einer Formelberechnung
09.02.2014 04:11:14
Franc
Das geht aber wie in den Kommentaren vom Makro beschrieben ist das nur bedingt empfehlenswert, weil du keine Abfrage wie intersect haben kannst und somit immer alles ausgeführt/geprüft wird.
Von daher empfehle ich dir auch nicht T:T als Range zu nehmen sondern nur den benutzen Bereich.
In meinem Beispiel nehme ich T1:T100
Vergiss das Public nicht mit reinzunehmen, was direkt hiernach folgt aber so nicht als Code angezeigt wird. Ohne dem funktioniert es nicht.
Public varBereich As Variant
' mit "Public varBereich As Variant" bleibt der Inhalt auch nach Ende des Makros erhalten
Private Sub Worksheet_Activate()
' das wird nur ausgeführt, wenn das Blatt nicht schon aktiv war
' wenn es bereits aktiv war, bleibt die 1. Änderung "unbemerkt"
varBereich = Range("T1:T100").Value
End Sub
Private Sub Worksheet_Calculate()
' das Ereignis wird immer ausgelöst egal wo im Blatt etwas neu berechnet wird
Dim i
On Error GoTo leer
' wenn das Blatt aktiv war und noch nichts geändert wurde, ist das Array leer
' und erzeugt einen Fehler und dann soll es zu "leer" springen und den Bereich einlesen
For i = LBound(varBereich) To UBound(varBereich)
' stehen werte im array, werden sie nun verglichen
' dazu muss der Bereich aber bekannt sein
' wenn es in Zeile 1 anfängt ist es einfach
If Cells(i, 20) varBereich(i, 1) Then Cells(i, 23) = Date
' fängt es in einer anderen Zeile an, muss man das berücksichtigen
' beispiel - der Bereich ist nicht T1:T100 sondern T5:T100
' dann muss die Zeile für den Vergleich wie folgt lauten
' If Cells(i + 4, 20) varBereich(i, 1) Then Cells(i + 4, 21) = Now
' i = 1 + 4 = 5 ;-), i ist beim 1. Wert 1, weil das Array in dem Fall bei 1 beginnt
' und nicht wie sonst bei 0 aber das ist hier auch ok
Next
leer: 'hierher springt er beim ersten initialisieren bzw. wenn die Tabelle aktiv war
' was tun wir? wir lesen den Bereich ein, den wir überwachen wollen
varBereich = Range("T1:T100").Value
End Sub