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

Forumthread: Userform flackert stark - DoEvents?

Userform flackert stark - DoEvents?
14.07.2019 19:13:57
Jojo
Hallo zusammen,
ich habe eine relativ große Userform, die extrem flackert bzw. die Steuerelemente auf der Userform flackern.
Ich habe in verschiedenen Enter- und Exit Events jeweils ein Me.Repaint verwendet, da das jeweils aktive Steuerelement eine andere Rahmenfarbe zugewiesen bekommt, damit es für den Nutzer erkennbar ist, in welchem Steuerelement er sich gerade befindet. Beim Verlassen des Steuerelementes wird die Rahmenfarbe zurückgesetzt.
Ich kann die Datei, die die Userform enthält, leider in dieser Form nicht hochladen, da hier viele sensible Daten enthalten sind.
Die Userform an sich ist auf ShowModul = True.
Ich habe bereits im Internet gelesen, dass wenn i.B. Schleifen ins Spiel kommen hier DoEvents helfen soll. Allerdings verwende ich keine relevanten Loops und ich wüsste in diesem Fall nicht so Recht, wo ich das DoEvents platzieren muss.
Ich weiß, dass das so recht magere Angaben sind. Vielleicht hatte jemand schon mal ein ähnliches Problem und kann trotzdem helfen.
Vielen Dank an Euch im Voraus.
Viele Grüße.
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform flackert stark - DoEvents?
14.07.2019 19:20:35
Rainer
Hallo Jojo,
Ersetze doch zum Test alle
Me.Repaint
durch

DoEvents
DoEvents
und gucke was passiert.
Entweder flackert es oder nicht.
Wichtig ist, es doppelt auszuführen.
Gruß, Rainer
Anzeige
AW: Userform flackert stark - DoEvents?
14.07.2019 19:39:45
Jojo
Hi Rainer,
danke dir für deine Hilfe.
Ich habe die DoEvents eingebaut und das Me.Repaint einmal in einem Steuerelement beibehalten. Und genau hier fängt die Userform zu flackern an. Me.Repaint scheint also der Übeltäter zu sein.
Auch mit folgendem Code keine Besserung:
DoEvents
Me.Repaint
DoEvents
Me.Repaint ist ja doch recht nützlich an der ein oder anderen Stelle, aber unter diesen Umständen muss ich es wohl weglassen, es sei denn, es gibt noch eine andere Lösung :-)
Anzeige
AW: Userform flackert stark - DoEvents?
14.07.2019 20:35:08
Rainer
Hallo Jojo,
schau mal hier https://www.herber.de/bbs/user/130886.xlsm
Das ist eine UserForm ohne "Repaint".
Der doppelte "DoEvents" hat eigentlich den gleichen Effekt (Aktualisieren der Formen) ohne diese komplett neu zu Zeichnen.
Aber es steht dir natürlich frei, meine Vorschläge zu probieren.
Bei "VBA gut" kann ich dir nicht mehr viel neues erzählen.
Gruß, Rainer
Anzeige
AW: Userform flackert stark - DoEvents?
14.07.2019 21:48:00
Jojo
Hallo Rainer,
deine Vorschlag funktioniert wirklich gut, allerdings ist die einzige Einschränkung das teilweise die Rahmenfarbe der Steuerelemente nicht wieder zurückgesetzt werden :-(
Ich denke ich werde dann diesen Code einfach weglassen, dann ist zumindest das unschöne Flackern weg :-)
Vielen Dank dir nochmals.
Anzeige
AW: Userform flackert stark - DoEvents?
14.07.2019 23:16:51
Rainer
Hallo Jojo,
das ist schwer zu beurteilen ohne deine Mappe zu kennen.
Ich vermute den Fehler eher im Code-Ablauf. Setze doch mal eine Haltmarke auf die Zeile, die den Rahmen ändern soll und gucke ob der Code überhaupt ausgeführt wird oder nicht.
Gruß, Rainer
AW: Userform flackert stark - DoEvents?
15.07.2019 10:02:46
Johannes
Hallo Rainer,
ich habe dir mal eine Beispielmappe hochgeladen.
https://www.herber.de/bbs/user/130907.xlsm
Solange ich mit Tab durch die TextBoxen springe funktioniert es super.
Wenn ich dann aber mit der Maus in eine nicht aktive Textbox klicke, wird das Enter-Events offensichtlich nicht ausgeführt, d.h. die Rahmenfarbe bleibt unverändert.
Viele Grüße,
Jojo
Anzeige
AW: Userform flackert stark - DoEvents?
15.07.2019 10:59:19
Rainer
Hallo Jojo,
das war jetzt ein wenig Knobelei, aber es ist ganz witzig. Dein Code:
Private Sub TextBox1_Enter()
TextBox1.BorderColor = vbBlack
DoEvents
DoEvents
End Sub
funktioniert nicht so wie gedacht. Aber jetzt füge ich nur eine Zeile hinzu:
Private Sub TextBox1_Enter()
TextBox1.BorderColor = vbBlack
    TextBox1.BackColor = vbWhite
DoEvents
DoEvents
End Sub
und nun klappt es so wie es soll. Bitte frag mich nicht warum. Irgendwo in den Untiefen der Excel-Programmierung werden wahrscheinlich Hintergrundfarben anders priorisiert als Rahmenfarben. Oder was ganz anderes, ich hab keine Ahnung.
Ich habe aber den Code noch etwas einfacher gemacht:
Option Explicit
Private Sub TextBox1_Enter()
Call Rahmenfarbe
End Sub
Private Sub TextBox2_Enter()
Call Rahmenfarbe
End Sub
Private Sub TextBox3_Enter()
Call Rahmenfarbe
End Sub
Private Sub Rahmenfarbe()
Dim cCont As Control
For Each cCont In Me.Controls
If TypeName(cCont) = "TextBox" Then
If ActiveControl.Name = cCont.Name Then
cCont.BorderColor = vbBlack
cCont.BackColor = vbWhite
Else
cCont.BorderColor = RGB(217, 217, 217)
cCont.BackColor = vbWhite
End If
End If
Next cCont
'Me.Repaint
DoEvents
DoEvents
End Sub
Wenn du diesen Code nimmst hast du 2 Vorteile:
1. Brauchst du keinen "Exit" Event. Somit müssen nicht 2 Events gleichzeitig abgearbeitet werden.
2. Ist der Code für alle Textboxen identisch. Somit lager ich die Änderungnen in eine Extra-Sub aus und dein TextBox_Enter ist ein Einzeiler geworden.
Gruß, Rainer
Anzeige
AW: Userform flackert stark - DoEvents?
15.07.2019 11:03:54
Johannes
Hallo Rainer,
wow super...vielen Dank dir.
Ich habe es gerade einmal in der Beispieldatei getestet und in der Tat es funktioniert.
Ich werde es gegen Abend einmal in meiner Originaldatei testen und gebe dir dann nochmal final Feedback.
Tausend Dank für deine super Hilfe.
Gruß, Jojo
Anzeige
AW: Userform flackert stark - DoEvents?
15.07.2019 11:21:53
Rainer
Hallo Jojo,
danke für die Rückmeldung und viel Erfolg.
Melde dich einfach wieder wenn irgendwas nicht klappt wie es soll.
Gruß, Rainer
AW: Userform flackert stark - DoEvents?
15.07.2019 23:08:27
Jojo
Hallo Rainer,
also du bist ein Genie.
Das ist noch viel besser als das die Enter-Exit-Wechselei und der gesamte Code wird insofern wesentlich kompakter.
Tausend Dank und Chapeau. Toll dass man auch als fortgeschrittener VBA-Nutzer hier immer wieder Dinge dazulernen kann.
LG,
Johannes
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Userform flackert stark – Lösungen und Tipps


Schritt-für-Schritt-Anleitung

  1. Identifiziere das Problem: Überprüfe, ob dein Userform beim Wechseln zwischen Steuerelementen stark flackert. Oftmals kann dies durch zu viele Me.Repaint-Aufrufe verursacht werden.

  2. Ersatz von Me.Repaint: Ersetze in deinem Code alle Me.Repaint-Aufrufe durch DoEvents. Beispiel:

    DoEvents
    DoEvents
  3. Testen: Führe deinen Code aus und teste, ob das Flackern weiterhin auftritt. Es kann hilfreich sein, die DoEvents-Aufrufe zu verdoppeln, um das Verhalten zu überprüfen.

  4. Anpassungen vornehmen: Wenn das Flackern weiterhin besteht, überprüfe den Ablauf deines Codes. Setze Haltepunkte und schaue, ob der Code an den richtigen Stellen ausgeführt wird.

  5. Optimierung: Wenn du die Rahmenfarbe der Steuerelemente ändern möchtest, stelle sicher, dass die BackColor auch angepasst wird. Beispiel:

    TextBox1.BorderColor = vbBlack
    TextBox1.BackColor = vbWhite

Häufige Fehler und Lösungen

  • Flimmern der Userform: Das Flackern kann durch übermäßige Repaint-Aufrufe entstehen. Reduziere diese Aufrufe zugunsten von DoEvents.

  • Mauszeiger flackert: Wenn dein Mauszeiger flackert, könnte dies mit der Art der Steuerelemente und deren Aktualisierungen zusammenhängen. Überprüfe, ob du unnötige Updates durch Repaint verursachst.

  • Rahmenfarbe wird nicht zurückgesetzt: Wenn die Rahmenfarbe der Steuerelemente nicht zurückgesetzt wird, stelle sicher, dass du die Logik in den Exit-Events korrekt implementierst.


Alternative Methoden

  • VBA Userform Repaint: Du kannst das Flimmern auch durch gezielte Verwendung von DoEvents in deinen Events steuern. Achte darauf, dass du die Effekte von DoEvents und Repaint kombinierst.

  • Verwendung von Timer: In manchen Fällen kann die Verwendung eines Timers helfen, um die Benutzeroberfläche zu aktualisieren, ohne dass es zu einem Flackern kommt.


Praktische Beispiele

Hier ist ein Beispiel, wie du DoEvents in einem Userform einsetzen kannst:

Private Sub TextBox1_Enter()
    TextBox1.BorderColor = vbBlack
    TextBox1.BackColor = vbWhite
    DoEvents
    DoEvents
End Sub

In diesem Beispiel wird die Hintergrundfarbe gesetzt, bevor DoEvents aufgerufen wird, um sicherzustellen, dass es nicht zu einem Flackern kommt.


Tipps für Profis

  • Vermeide unnötige Repaints: Reduziere die Anzahl der Me.Repaint-Aufrufe, um das Flimmern zu minimieren. DoEvents ist in vielen Fällen die bessere Wahl.

  • Code modularisieren: Lagere Code in separate Subroutinen aus, um die Lesbarkeit und Wartbarkeit zu verbessern. Zum Beispiel kann eine Funktion zur Änderung der Rahmenfarbe für alle TextBoxen genutzt werden.

  • Fehlerprotokollierung: Implementiere eine Fehlerprotokollierung, um Probleme beim Ausführen von Userforms zu identifizieren.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen DoEvents und Me.Repaint?
DoEvents gibt dem Betriebssystem die Kontrolle zurück, sodass es andere Aufgaben erledigen kann, während Me.Repaint die Userform neu zeichnet. Zu viele Repaint-Aufrufe können zu Flimmern führen.

2. Wie setze ich die Rahmenfarbe einer TextBox zurück?
Du kannst dies in den Exit-Events der TextBox machen, indem du die Rahmenfarbe auf die Standardfarbe zurücksetzt.

3. Warum flackert meine Userform trotz Verwendung von DoEvents?
Flackern kann durch viele Faktoren verursacht werden, darunter auch die Anzahl der Steuerelemente und die Art, wie sie aktualisiert werden. Überprüfe deinen Code auf unnötige Updates.

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