Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

worksheet_change nur bei manuelle eingabe

Forumthread: worksheet_change nur bei manuelle eingabe

worksheet_change nur bei manuelle eingabe
15.02.2005 08:08:02
Anette
Hallo,
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
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: worksheet_change nur bei manuelle eingabe
15.02.2005 08:16:02
Harald
Moin Anette,
da Du keinen Hintergrund angegeben hast, hier nur ein Beispiel.

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

Gruß
Harald
Anzeige
Vielen Dank Harald! O.T.
Anette
;
Anzeige
Anzeige

Infobox / Tutorial

worksheet_change für manuelle Eingaben optimieren


Schritt-für-Schritt-Anleitung

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.


Häufige Fehler und Lösungen

  • Fehler: Das worksheet_change Ereignis wird auch bei VBA-Änderungen ausgelöst.

    • Lösung: Stelle sicher, dass 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.

    • Lösung: Überprüfe, ob die Zelle im definierten Bereich (z.B. D:D) liegt. Stelle sicher, dass dein Code korrekt in das Arbeitsblattmodul eingefügt wurde.

Alternative Methoden

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

Praktische Beispiele

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.


Tipps für Profis

  • Verwende den Intersect-Befehl, um festzustellen, ob die Änderung in einem bestimmten Bereich erfolgt ist.
  • Nutze Application.EnableEvents, um unerwünschte Schleifen von Ereignisaufrufen zu vermeiden.
  • Dokumentiere deinen Code gut, um die Nachvollziehbarkeit zu gewährleisten, besonders wenn du mit mehreren Entwicklern an einem Projekt arbeitest.

FAQ: Häufige Fragen

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.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige