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

Forumthread: Worksheet_Change-Event Bug bei Dropdown

Worksheet_Change-Event Bug bei Dropdown
24.06.2022 15:57:39
Lukas
Hallo Zusammen,
ich habe ein Makro geschrieben, welches bei der Änderung einer Zelle in der jeweiligen Zeile den Verfasser und das Datum einträgt. Das ganze funktioniert soweit auch alles wie gewünscht. Wenn ich nun aber einen Doppelklick in eine Zelle mache, in welcher eine Dropdown hinterlegt ist (per Datenüberprüfung) und dann auf die Auswahl des Dropdown-Menüs klicke, bekomme ich den Laufzeitfehler 50290 "Anwendungs- oder objektdefinierter Fehler".
Hat jemand eine Idee wie man dieses Verhalten umgehen kann?
Code siehe unten.

Public Sub ChangeLog(ByVal Target As Range, Worksheet As Object)
Dim neValues As Range
Dim tableRange As Range
Dim targetRow As Integer
Dim changeDateColumn As Integer
Dim changedByColumn As Integer
Dim uniqueIDColumn As Integer
Dim tableHeader As Integer
Dim GUID As String
Dim uniqueID As String
'Die folgenden Variablen beschreiben den SpaltenIndex der ChangeDate & Erfasser & Unique Spalte. Diese sind unter Formeln --> Namensmanager definiert
changeDateColumn = Worksheet.Names("ChangeDate").RefersToRange.Column
changedByColumn = Worksheet.Names("ChangedBy").RefersToRange.Column
uniqueIDColumn = Worksheet.Names("UniqueID").RefersToRange.Column
'Hier wird geprüft ob es sich bei der Änderung um den ChangeLog oder die UniqueID handelt, wenn ja beende an dieser Stelle
If Target.Column = changeDateColumn Or Target.Column = changedByColumn Or Target.Column = uniqueIDColumn Then
Exit Sub
End If
'tableRange beschreibt den Bereich der definierten Tabelle auf dem Arbeitsblatt
Set tableRange = Worksheet.ListObjects(1).DataBodyRange
tableHeader = Worksheet.ListObjects(1).HeaderRowRange.Row
'Prüft, ob sich die geänderte Zelle in der Tabelle befindet
On Error Resume Next
Set neValues = Intersect(Target, tableRange)
On Error GoTo 0
'Wenn sich die Zelle in der Tabelle befindet, dann trage in der entsprechenden Zelle das Datum und den Erfasser ein. Target.Row  tableHeader verhindert Bugs, in denen die Spaltenbeschriftung verändert wird.
If Not neValues Is Nothing And Target.Row  tableHeader Then
Worksheet.Cells(Target.Row, changeDateColumn).Value = Now
Worksheet.Cells(Target.Row, changedByColumn).Value = Environ("Username")
End If
uniqueID = Worksheet.Cells(Target.Row, uniqueIDColumn).Value
If uniqueID = "" Then
GUID = GenGuid()
Worksheet.Cells(Target.Row, uniqueIDColumn).Value = GUID
End If
End Sub
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheet_Change-Event Bug bei Dropdown
24.06.2022 16:05:40
Daniel
Hi
in welcher Programmzeile tritt der Fehler auf?
kannst du die Datei mit dem Fehler hochladen, damit man das nachvollziehen kann?
Gruß Daniel
AW: Worksheet_Change-Event Bug bei Dropdown
24.06.2022 16:32:13
Lukas
Hi Daniel, der Fehler tritt direkt in der ersten Zeile auf also in dieser:

changeDateColumn = Worksheet.Names("ChangeDate").RefersToRange.Column
Hier mal eine Dummy-Datei
https://www.herber.de/bbs/user/153751.xlsm
Grüße,
Lukas
Anzeige
AW: Worksheet_Change-Event Bug bei Dropdown
24.06.2022 16:51:48
Daniel
oh mann
und warum muss die Zelle, die einen DropDown hat suchen ?
warum sagst du mir das nicht.
Wäre alles kein Problem, wenn ich dir jede Minute, die ich für dich verwende, auch in rechnung stellen dürfte, aber da du hier ja kostenfreie Hilfe erhoffst, solltest du es potentiellen Helfern so einfach wie möglich machen und ein bisschen mehr Zeit in die Beschreibung für das Problem und wie man den Fehler erzeugt, investieren, damit diese es so einfach wie möglich haben dir zu helfen.
Ich kann jetzt auch nur feststellen, dass das Problem anscheinend die Kombination aus DropDown und direkte Zellbearbeitung bewirkt.
Da kann ich dir auch nur raten, keinen Doppelklick in die Zelle zu machen, wenn du den DropDown benutzen willst.
Beim normalen Eingeben in die Bearbeitungszeile (ohne Doppelklick) funktioniert das Makro.
Wenn du das mit dem Doppelklick gewohnt bist, nimm in den Eigenschaften den Haken "Direkte Zellbearbeitung zulassen" raus.
Gruß Daniel
Anzeige
AW: Worksheet_Change-Event Bug bei Dropdown
27.06.2022 08:37:54
Lukas
Hi Daniel,
sorry dafür! Hatte einfach nicht dran gedacht - ich gelobe Besserung!
Meine Lösung war jetzt einfach per VBA bei den Zellen mit Dropdowns den Doppelklick zu deaktivieren. So lässt sich zumindest mal der Fehler vermeiden.
Danke dir nochmal für deine Hilfe!
AW: Worksheet_Change-Event Bug bei Dropdown
24.06.2022 16:59:21
GerdL
Hallo Lukas,
probiere es mal so.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Worksheet As Object
Set Worksheet = Me
Application.EnableEvents = False
ChangeLog Target, Worksheet
Application.EnableEvents = True
End Sub
Deine Variablen sind m.E. aber zu überarbeiten.
Gruß Gerd
Anzeige
AW: Worksheet_Change-Event Bug bei Dropdown
27.06.2022 08:34:31
Lukas
Hi Gerd,
danke für deine Hilfe! das Event deaktivieren habe ich ausprobiert, hat aber leider den Fehler nicht behoben. Mein Holzweg war einfach den Doppelklick für die Dropdown-Zellen per VBA zu sperren.
Bzgl. der Variablen: Als Anfänger bin ich über jeden Tipp wie man das besser gestalten kann froh!
Beste Grüße!
Anzeige
AW: Worksheet_Change-Event Bug bei Dropdown
24.06.2022 19:17:20
onur
Könnte damit zusammenhängen, dass du das Change-Event und damit ebenso Sub ChangeLog jeweils DREI mal ausführst, weil du weder die Events im Change-Event abschaltest noch direkt dort schon "filterst", in welchem Bereich auf Änderungen reagiert werden soll.
Ausserdem ist der Code sowas von aufgebläht, dass man ihn auch mit höchstens halb so viel Codezeilen schreiben könnte.
Anzeige
AW: Worksheet_Change-Event Bug bei Dropdown
27.06.2022 08:06:57
Lukas
Hi Onur,
hast recht, ich versuche das mal direkt im Change Event zu filtern bzw. abzuschalten.
Zum Thema Code: Ich bin absoluter Anfänger in VBA. Mein Ziel war es direkte Referenzen auf bspw. den Spaltenindex zu vermeiden, sodass beim einfügen einer Spalte das Makro noch funktioniert. Zudem wollte ich Active.Worksheet vermeiden - Wenn du ein paar Tipps für mich hast, wie ich den Code noch effizienter gestalten kann dann bin ich darüber sehr dankbar.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Umgang mit dem Worksheet_Change-Event Bug bei Dropdowns in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne Deine Excel-Datei und gehe zu dem Arbeitsblatt, in dem Du das Dropdown-Menü verwenden möchtest.

  2. Aktiviere die Entwicklertools: Falls Du die Entwicklertools nicht siehst, gehe zu Datei > Optionen > Menüband anpassen und aktiviere die Entwicklertools.

  3. Füge das Dropdown-Menü hinzu: Wähle die Zelle aus, gehe zu Daten > Datenüberprüfung und erstelle Dein Dropdown-Menü.

  4. Füge Deinen VBA-Code ein: Drücke ALT + F11, um den VBA-Editor zu öffnen. Klicke auf dein Arbeitsblatt im Projekt-Explorer und füge den folgenden Code ein:

    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim Worksheet As Object
       Set Worksheet = Me
       Application.EnableEvents = False
       ChangeLog Target, Worksheet
       Application.EnableEvents = True
    End Sub
  5. Ändere die Funktion ChangeLog: Stelle sicher, dass Dein ChangeLog-Code wie folgt aussieht, um Laufzeitfehler 50290 zu vermeiden:

    Public Sub ChangeLog(ByVal Target As Range, Worksheet As Object)
       ' Dein bestehender Code hier...
    End Sub
  6. Teste das Dropdown: Klicke auf die Zelle mit dem Dropdown und wähle einen Wert aus. Achte darauf, dass Du keinen Doppelklick machst, um Laufzeitfehler zu vermeiden.


Häufige Fehler und Lösungen

  • Laufzeitfehler 50290: Dieser Fehler tritt häufig auf, wenn Du einen Doppelklick in eine Zelle mit einem Dropdown-Menü machst. Um dies zu umgehen, deaktiviere die direkte Zellbearbeitung in den Excel-Optionen.

  • Code wird mehrfach ausgeführt: Wenn Du das Worksheet_Change-Ereignis nicht filterst, kann der Code mehrmals ausgelöst werden. Schalte die Application.EnableEvents-Eigenschaft wie oben beschrieben aus und ein.


Alternative Methoden

  • Verwendung von Worksheet_SelectionChange: Anstelle des Worksheet_Change-Events kannst Du das workbook_sheetselectionchange-Ereignis verwenden, um Änderungen an Dropdowns zu überwachen. Das reduziert das Risiko von Konflikten bei der direkten Zellbearbeitung.

  • Verwendung von Formularsteuerelementen: Anstelle eines Dropdowns in einer Zelle kannst Du ein Formularsteuerelement verwenden, das weniger Konflikte mit dem vba worksheet_change-Event verursacht.


Praktische Beispiele

Hier ist ein einfaches Beispiel für eine ChangeLog-Funktion, die den aktuellen Benutzer und das Datum in eine Tabelle einträgt:

Public Sub ChangeLog(ByVal Target As Range, Worksheet As Object)
    Dim changeDateColumn As Integer
    Dim changedByColumn As Integer

    changeDateColumn = Worksheet.Names("ChangeDate").RefersToRange.Column
    changedByColumn = Worksheet.Names("ChangedBy").RefersToRange.Column

    If Not Intersect(Target, Worksheet.Range("A1:A10")) Is Nothing Then
        Worksheet.Cells(Target.Row, changeDateColumn).Value = Now
        Worksheet.Cells(Target.Row, changedByColumn).Value = Environ("Username")
    End If
End Sub

Tipps für Profis

  • Vermeide direkte Zellreferenzen: Nutze Namensmanager, um weniger anfällig für Fehler zu sein, insbesondere bei Spaltenänderungen.
  • Debugging: Verwende Debug.Print, um den Fortschritt Deiner Subroutinen zu verfolgen und mögliche Fehlerquellen schneller zu identifizieren.
  • Optimierung des Codes: Halte Deinen Code so kurz und prägnant wie möglich, um die Lesbarkeit und Wartbarkeit zu verbessern.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Worksheet_Change und Worksheet_SelectionChange?
Worksheet_Change wird ausgelöst, wenn sich der Inhalt einer Zelle ändert, während Worksheet_SelectionChange ausgelöst wird, wenn Du die Auswahl einer Zelle änderst.

2. Wie kann ich den Laufzeitfehler 50290 beheben?
Um den Fehler zu vermeiden, stelle sicher, dass Du keine Doppelklicks in Zellen mit Dropdowns machst oder deaktiviere die direkte Zellbearbeitung in den Excel-Optionen.

3. Was kann ich tun, wenn mein Makro nicht funktioniert?
Überprüfe, ob die Application.EnableEvents-Eigenschaft korrekt gesetzt ist und ob Deine Zellen richtig referenziert werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige