Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1348to1352
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Automatische Datierung einer Formelberechnung

Automatische Datierung einer Formelberechnung
08.02.2014 14:16:23
Daniel
Halo zusammen, ich habe das folgende Problem.
Ich möchte gerne, dass in spalte 23 das datum eingetragen wird wenn sich in Spalte 20 etwas ändert. Nun habe ich auch schon code dafür gefunden, aber der schreibt das Datum nur rein wenn ich händisch etwas ändere und nicht wenn sich das Formelergebniss (Sverweis) der zelle ändert.
Hier der bisherige code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Columns(20)) Is Nothing Then
Exit Sub
Else
Target.Offset(0, 3) = Date
End If
End Sub

Ein Überwachen des Ereignisses das die Berechnung anstösst geht auch nicht, da dort immer wieder neu Daten eingetragen werden.
Hoffe ihr könnt mir helfen!

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
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

Anzeige
was vergessen ^^
09.02.2014 04:15:23
Franc
Ich hatte das beim ausprobieren mit der Uhrzeit getestet.
Im Code selbst ist zwar alles richtig aber bei meinem Kommentar, wo ich erklärt habe was man berücksichtigen muss, wenn es in einer anderen Zeile beginnt, habe ich noch Cells(i + 4, 21) = Now stehen.
Das stört zwar nicht aber nicht das du dich wunderst. ^^

AW: was vergessen ^^
09.02.2014 14:30:32
Daniel
Hallo Franc,
ersteinmal vielen dank!! Das ganze funktioniert gut allerdings ist es doch ganz schön langsam. Eigentlich möchte ich 10.000 Zellen abfragen habe es jetzt schon auf 5000 beschränkt. Ich habe versucht es etwas zu beschleunigen(siehe code unten) allerdings schmiert mir Excel ab wenn ich "Enable Events" oder "Calculation" aus bzw. auf manuell schalte.
Ich weiss du hast gesagt das es nur bedingt empfehlenswert ist warscheinlich genau aus dem Grund, aber gibt es möglichkeiten das ganze zu beschleunigen bzw den überwachten Bereich einzuschränken?
Private Sub Worksheet_Calculate()
' das Ereignis wird immer ausgelöst egal wo im Blatt etwas neu berechnet wird
With Application
.ScreenUpdating = False
'.EnableEvents = False
'.Calculation = xlCalculationManual
End With
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 + 8, 20)  varBereich(i, 1) Then Cells(i + 8, 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("T9:T5008").Value
With Application
.ScreenUpdating = True
'.EnableEvents = True
'.Calculation = xlCalculationAutomatic
End With
End Sub

Anzeige
AW: was vergessen ^^
09.02.2014 16:29:39
Franc
Der Bereich ist im Prinzip schon durch das Range("T9:T5008") eingeschränkt.
Aber wenn sich jede Zelle davon ändert, dann trägt er auch entsprechend viele Bereiche ein.
Ich habs grad mal bei mir getestet und kann keine nennenswerte Verzögerung feststellen. (bei 10.000 Zeilen)
Das mit den Events kannst eventuell so umgehen.
Ganz oben Public blAendern As Boolean
in dem Calculate am Anfang
blAendern = false und am ende blAendern = true
im Change Makro dann am Anfang die Zeile
if blAendern = false then exit sub
muss aber auch erstmal ausgelöst werden, weil boolean am anfang immer false hat
kannst auch andersrum schreiben - ist vielleicht nur bissi verwirrend
Kann aber auch zu Problemen führen bzw. dazu, dass das nicht ausgelöst wird obwohl man das will.
Ansonsten ... wenn du die Mappe hochlade darfst, könnte man sich das mal besser anschauen.

Anzeige
AW: was vergessen ^^
09.02.2014 18:25:46
Daniel
Hallo Franc,
jetzt ist es erträglich... mir war aufgefallen, dass die datei auf einmal 9 MB hatte, irgendwie sind mir da Formatierungen wohl bis ganz nach unten gerutscht.
Hochladen kann ich die datei leider nicht.
Danke nochmal!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige