Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Event on Change() verhindern

Event on Change() verhindern
16.05.2019 13:23:47
AnBad
Hallo,
wie löst man das folgende Problem korrekt?
Ich habe eine Userform erstellt. Die Userform beinhalten drei Kombinationsfelder (ComboBox) und mehrer Textfelder, die alle bei Aufruf befüllt werden (UserForm_Initialize). So weit alles klar.
Wenn beim Start somit auch der Wert z.B. des Kombinationsfeld1(ComboBox1) festgelegt wird, so wird dann sofort auch die Sub ComboBox1_Change() ausgeführt. Und das möchte ich vermeiden.
Aber wie? Wie kann man verhindern, dass andere Sub durch Change() ausgeführt werden? Jedoch müssten Private Subs und Funktionen weiterhin funktionieren.
Tausend Dank
Michael
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Event on Change() verhindern
16.05.2019 13:30:11
ChrisL
Hi Michael
Application.EnableEvents = False
Nicht vergessen, die Events anschliessend wieder einzuschalten! (würde empfehlen dies auch im Fehlerhandling zu berücksichtigen)
cu
Chris
AW: Event on Change() verhindern
16.05.2019 13:31:15
AnBad
Tausen Dank!
Einen schönen Tag noch!!
AW: Event on Change() verhindern
16.05.2019 13:53:48
Werner
@Chris,
hallo Chris, seit wann kann man das Change Event eines Controls auf einer Userform mit Application.EnableEvents verhindern? Damit lässt sich doch das Change Event auf einem Tabellenblatt verhindern, bei mir zumindest.
@AnBad
mit einer boolschen Variablen z.B., die als Public deklariert ist.
Public boJetztNicht As Boolean
Private Sub ComboBox1_Change()
If Not boJetztNicht Then
MsgBox "Heute ist " & Me.ComboBox1
End If
End Sub
Private Sub UserForm_Initialize()
boJetztNicht = True
Me.ComboBox1.AddItem "Montag"
Me.ComboBox1.AddItem "Dienstag"
Me.ComboBox1.AddItem "Mittwoch"
Me.ComboBox1.AddItem "Donnerstag"
Me.ComboBox1.AddItem "Freitag"
Me.ComboBox1.AddItem "Samstag"
Me.ComboBox1.AddItem "Sonntag"
Me.ComboBox1 = "Donnerstag"
boJetztNicht = False
End Sub

Gruß Werner
Anzeige
ups... stimmt owT.
16.05.2019 13:56:13
ChrisL
.
AW: Event on Change() verhindern
16.05.2019 14:31:32
Daniel
Hi
die Frage ist, ob Change wirklich das am besten geeignete Event ist.
Change reagiert auf jede Änderung der Combobox, auch unabhängig davon, ob sie vom Anwender oder über ein Makro ausgeführt wird.
Wenn man nur auf Eingaben des Anwenders reagieren will, sind häufig andere Events geeigneter, z.B. Exit, AfterUpdate, MouseUp/MouseDown, Click, weil diese dann nicht auf jede Änderung reagieren und somit der von Werner gezeigte Workaround nicht notwendig ist.
Gruß Daniel
Anzeige
AW: Event on Change() verhindern
17.05.2019 08:42:03
AnBad
Hi,
sorry, ich komme nicht klar...
Also:
1) Application.EnableEvents = False, das funktioniert leider nicht.
2) Ich habe daraufhin alle Combobox von "Auswahl1_Change()" auf "Auswahl1_Click()" geändert. Leider auch kein Erfolg.
3) Kombination von 1) und 2) hat auch nix gebracht.
Wenn während dem Durchlauf von "Private Sub UserForm_Initialize()" die Zeile "Auswahl1.ListIndex = xyz" kommt, dann springt das Programm zum "Private Sub Auswahl1_Click()". Und das will ich verhindern.
Klar, ich habe schon mit globalen Variablen gearbeitet. D.h. im Initialize() eine Variable auf z.B. 1 gesetzt und dann in Subs eine if Variable = 1 then goto ende. Aber das erscheint mir nicht professionel.
Gibt es keine gute Lösung?
Viele Grüße und ein schönes Wochenende.
Michael
Anzeige
AW: Event on Change() verhindern
17.05.2019 08:57:32
Daniel
Hi
1. Application.EnableEvents funtioniert nur für Events der Mappe und der Tabellenblätter, aber nicht für Events der Userform! (kannst du also komplett vergessen)
2. das Klick-Event spricht immer dann an, wenn sich der ListIndex der Combobox ändert und das passiert wenn du den Wert der Combobox ändert, auch per Code.
du musst dir halt die verschiedenen Events mal in der Hilfe anschauen.
dort sollte ja beschrieben sein, in welchen Fällen sie auslösen (einen groben Hinweis gibt ja immer der Eventname selbst).
Wenn du eines findest, welches nur dann auslöst, wenn es deinen Wünschen entspricht, kannst du dieses verwenden.
wenn du keines findest, musst du dir mit der von Werner beschriebenen Methode behelfen.
Gruß Daniel
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Event on Change() in Excel VBA verhindern


Schritt-für-Schritt-Anleitung

Um das Change-Event einer ComboBox in einer Userform zu verhindern, kannst Du folgende Schritte befolgen:

  1. Öffne Deinen VBA-Editor (Alt + F11) und wähle die Userform aus, die Du bearbeiten möchtest.
  2. Füge eine öffentliche boolesche Variable hinzu:
    Public boJetztNicht As Boolean
  3. Implementiere die ComboBox Change-Subroutine:
    Private Sub ComboBox1_Change()
       If Not boJetztNicht Then
           MsgBox "Heute ist " & Me.ComboBox1
       End If
    End Sub
  4. Fülle die ComboBox im UserForm_Initialize:
    Private Sub UserForm_Initialize()
       boJetztNicht = True
       Me.ComboBox1.AddItem "Montag"
       Me.ComboBox1.AddItem "Dienstag"
       Me.ComboBox1.AddItem "Mittwoch"
       Me.ComboBox1.AddItem "Donnerstag"
       Me.ComboBox1.AddItem "Freitag"
       Me.ComboBox1.AddItem "Samstag"
       Me.ComboBox1.AddItem "Sonntag"
       Me.ComboBox1 = "Donnerstag"
       boJetztNicht = False
    End Sub

Durch diese Methode wird das Change-Event nur dann ausgeführt, wenn die Auswahl manuell durch den Benutzer geändert wird.


Häufige Fehler und Lösungen

  • Fehler: Application.EnableEvents = False funktioniert nicht für Userform-Events.

    • Lösung: Benutze die oben beschriebene boolesche Variable (boJetztNicht), um das Change-Event zu steuern.
  • Fehler: Das Click-Event wird ausgelöst, wenn der ListIndex geändert wird.

    • Lösung: Verwende das AfterUpdate-Event oder andere Events, die nicht auf jede Änderung reagieren.

Alternative Methoden

  1. Verwende das AfterUpdate-Event:

    • Dieses Event wird nur ausgelöst, wenn der Benutzer die Auswahl ändert und nicht, wenn dies durch Code geschieht.
      Private Sub ComboBox1_AfterUpdate()
      MsgBox "Auswahl aktualisiert auf: " & Me.ComboBox1
      End Sub
  2. Nutze MouseDown oder MouseUp Events:

    • Diese Events können verwendet werden, um Aktionen auszuführen, die nur auf Benutzerinteraktionen reagieren, und nicht auf Programmänderungen.

Praktische Beispiele

Hier ist ein Beispiel, das die Verwendung einer ComboBox und die Verhinderung des Change-Events demonstriert:

Public boJetztNicht As Boolean

Private Sub ComboBox1_Change()
    If Not boJetztNicht Then
        MsgBox "Sie haben " & Me.ComboBox1 & " ausgewählt."
    End If
End Sub

Private Sub UserForm_Initialize()
    boJetztNicht = True
    Me.ComboBox1.AddItem "Äpfel"
    Me.ComboBox1.AddItem "Bananen"
    Me.ComboBox1.AddItem "Kirschen"
    Me.ComboBox1 = "Bananen" ' Setzt den Wert ohne Change-Event auszulösen
    boJetztNicht = False
End Sub

In diesem Beispiel wird das Change-Event nicht ausgelöst, wenn die ComboBox initialisiert wird.


Tipps für Profis

  • Vermeide unnötige Events: Überlege, ob Du wirklich auf das Change-Event reagieren musst oder ob andere Events besser geeignet sind (z.B. AfterUpdate).
  • Fehlerbehandlung implementieren: Wenn Du Application.EnableEvents verwendest, denke daran, Events immer wieder zu aktivieren, um unerwartete Verhaltensweisen zu vermeiden.
  • Dokumentation lesen: Mache Dich mit den verschiedenen Events der ComboBox vertraut, um das passende Event für Deine Anforderungen auszuwählen.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Change und AfterUpdate? Das Change-Event wird bei jeder Änderung der ComboBox ausgelöst, während AfterUpdate nur nach einer Benutzerinteraktion reagiert.

2. Kann ich das Click-Event für die ComboBox verwenden? Ja, das Click-Event reagiert, wenn der Benutzer auf die ComboBox klickt, könnte aber auch durch Programmänderungen ausgelöst werden.

3. Wie kann ich sicherstellen, dass mein Code robust ist? Verwende boolesche Variablen, um zu steuern, wann Events ausgelöst werden, und implementiere Fehlerbehandlung, um Probleme zu vermeiden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige