wie schaffe ich es, dass das worksheet_change Ereignis nur bei manueller Eingabe im Tabellenblatt aber nicht bei Änderungen durch vba-Befehle ausgelöst wird?
Gruß Anette
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
' wird im definierten Bereich ein Wert geändert, wird in der nächsten Spalte das Datum eingetragen
Dim RaBereich As Range, RaZelle As Range
' Bereich der Wirksamkeit
Set RaBereich = Range("D:D")
'ActiveSheet.Unprotect
Application.EnableEvents = False
For Each RaZelle In Range(Target.Address)
If Not Intersect(RaZelle, RaBereich) Is Nothing Then RaZelle.Offset(0, 1) = Date
Next RaZelle
'ActiveSheet.Protect
Application.EnableEvents = True
Set RaBereich = Nothing
End Sub
Um das worksheet_change Ereignis in Excel VBA so zu gestalten, dass es nur bei manuellen Eingaben ausgelöst wird, kannst du folgenden Code verwenden:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim RaBereich As Range, RaZelle As Range
' Bereich der Wirksamkeit
Set RaBereich = Range("D:D")
Application.EnableEvents = False
For Each RaZelle In Range(Target.Address)
If Not Intersect(RaZelle, RaBereich) Is Nothing Then
RaZelle.Offset(0, 1) = Date ' Datum in die nächste Spalte eintragen
End If
Next RaZelle
Application.EnableEvents = True
Set RaBereich = Nothing
End Sub
In diesem Beispiel wird das worksheet_change Ereignis nur für den Bereich D:D aktiviert. Das Datum wird in die benachbarte Zelle eingetragen, wenn eine manuelle Eingabe erfolgt.
Fehler: Das worksheet_change Ereignis wird auch bei VBA-Änderungen ausgelöst.
Application.EnableEvents = False gesetzt ist, bevor Änderungen durch VBA vorgenommen werden. Aktiviere die Ereignisse wieder mit Application.EnableEvents = True.Fehler: Das Datum wird nicht eingetragen.
Eine alternative Methode besteht darin, eine zusätzliche Variable zu verwenden, um festzustellen, ob die Änderung manuell oder durch VBA erfolgt ist. Du könntest beispielsweise eine globale Variable setzen, die vor Änderungen durch VBA auf True gesetzt wird und nach der Änderung wieder auf False.
Dim ManuelleEingabe As Boolean
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If ManuelleEingabe Then
' Dein Code für manuelle Eingaben
End If
End Sub
Sub VBAÄnderung()
ManuelleEingabe = False
' Änderungen durch VBA
ManuelleEingabe = True
End Sub
Hier ist ein Beispiel, wie du das worksheet_change Ereignis für mehrere Zellen gleichzeitig anpassen kannst:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim RaBereich As Range
Set RaBereich = Range("D1:D10") ' Definierter Bereich
If Not Intersect(Target, RaBereich) Is Nothing Then
Application.EnableEvents = False
Target.Offset(0, 1).Value = Date ' Datum eintragen
Application.EnableEvents = True
End If
End Sub
In diesem Beispiel wird das Datum nur für die Zellen D1 bis D10 eingetragen, wenn eine manuelle Änderung vorgenommen wird.
Intersect-Befehl, um festzustellen, ob die Änderung in einem bestimmten Bereich erfolgt ist.Application.EnableEvents, um unerwünschte Schleifen von Ereignisaufrufen zu vermeiden.1. Wie kann ich das worksheet_change Ereignis für mehrere Bereiche nutzen?
Du kannst mehrere Intersect-Befehle verwenden oder die Bereiche in einer Union zusammenfassen, um die Überprüfung zu vereinfachen.
2. Funktioniert das bei allen Excel-Versionen?
Ja, der Code sollte in den meisten modernen Excel-Versionen (Excel 2010 und später) funktionieren, solange VBA unterstützt wird.
3. Was passiert, wenn ich Application.EnableEvents vergesse?
Wenn du Application.EnableEvents nicht auf False setzt, kann dies zu einer Endlosschleife führen, da Änderungen durch das Ereignis erneut ausgelöst werden.