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

Userform flackert

Forumthread: Userform flackert

Userform flackert
09.12.2025 10:00:32
Chris
Liebes Forum,

innerhalb eines Frames auf einer Userform habe ich 53 Labels, um Kalenderwochen eines Jahres anzuzeigen.
Bewegt man die Maus über ein Label wird der Hintergrund grün bzw. grau, sobald sich der Mauszeiger weiter bewegt.

Das funktioniert prima, jedoch flackert die Userform stark. Das Zurücksetzen der Labels auf grau erfolgt per Schleife.

Wieß jmd. wie man das Flackern unterdrücken kann?

Hier die Codes:

Private Sub Label100_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

ORDER.Label100.BackColor = RGB(192, 255, 192) 'grün
End Sub


Zurück auf grau:

Private Sub Frame7011_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)


Dim KWN As Long
For KWN = 100 To 152

If Me.Controls("Label" & KWN).BackColor = RGB(192, 255, 192) Then
icnt = icnt + 1
End If

If icnt > 1 Then
Exit Sub
Else
Me..Controls("Label" & KWN).BackColor = RGB(227, 227, 227) 'grau

End If
Next KWN
End Sub


Chris


Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform flackert
09.12.2025 10:54:46
Alwin Weisangler
Hallo Chris,

du bewegst die Maus im Frame und lässt eine Schleife durch alle Labels laufen. Da brauchts einen anderen Weg. Allerdings verschwindet das Flackern auch nicht völlig. Das liegt am Frame Control.
Hier mal ein Beispiel:
https://www.herber.de/bbs/user/179799.xlsm

Gruß Uwe
Anzeige
AW: Userform flackert
09.12.2025 12:08:03
daniel
Hi

kleiner Tip:
führe das Umfärben nur dann aus, wenn es notwendig ist.
Wenn das Label schon grün ist, muss es ja nicht nochmal gefärbt werden:

Private Sub Label100_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

with ORDER.Label100
if .BackColor > RGB(192, 255, 192) then .BackColor = RGB(192, 255, 192) 'grün
end with
End Sub


gleiches dann beim MouseMove über das Frame:
Private Sub Frame7011_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Dim KWN As Long
For KWN = 100 To 152
with Me.Controls("Label" & KWN)
If .BackColor > RGB(227, 227, 227) Then .BackColor = RGB(227, 227, 227)
end with
Next KWN
End Sub


andere Möglichkeit:
weise das umgefärbte Label einer Objektvariablen zu und verwende diese zur Prüfung, ob noch was gefärbt werden muss:

Dim lbl as control


Private Sub Label100_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
if lbl is nothing then
set lbl = Label100
lbl.BackColor = RGB(192, 255, 192)
end if
end Sub

Private Sub Frame7011_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
if not lbl is nothing then
lbl.BackColor = RGB(227, 227, 227)
set lbl = nothing
End if
end Sub


beachte: mangels Beispieldatei habe ich die Codes nicht getestet.
mögliche Tippfehler daher bitte eigenständig korrigieren.
bei der zweiten Möglichkeit kann es ggf zu unerwünschten Effekten kommen, wenn man die Maus sehr schnell bewegt, so dass ein MouseMove zwischen den Labels nicht erkannt wird.

Gruß Daniel
Anzeige
AW: Userform flackert
09.12.2025 15:07:36
Chris
Hallo Daniel,

danke für die Rückmeldung, der erste Vorschlag funktioniert - eben nur einfärben wenn das Label nicht bereits grün ist - kein Flackern mehr zu erkennen!
Bei der zweiten Variante - hier steht Dim lbl as control - ganz oben, weiß ich nicht genau wohin mit dem Code, da ich

Dim lbl as control
Private Sub Label100_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

...
52 mal wiederholen muss, eben für jeden Label....

Wie gesagt, der erste Vorschlag läuft super!

Gruß
Chris
Anzeige
AW: Userform flackert
09.12.2025 15:15:36
daniel
das dim lbl as control muss einmal da stehen, und zwar außerhalb der Makros, normalerweise ganz oben, unterhalb von Option Explicit
dass ist dann eine Variable, die von allen Makros dieses Moduls verwendet werden kann und die ihren Wert behält, wenn ein Makro zu ende ist.

im Prinzip ist dann die Idee, dass du dir in der Variable speicherst, welches Label grade grün gefärbt wurde.
das kannst du dann dafür nutzen um zu prüfen, ob noch eine Label entfärbt werden muss.
Aber wie gesagt, es könnte da Probleme geben, weil die MouseMove-Erkennung manchmal etwas träge ist, und nicht immer reagiert, wenn man die Maus schnell bewegt

Gruß Daniel
Anzeige
AW: Userform flackert
09.12.2025 16:05:54
daniel
52 mal wiederholen muss, eben für jeden Label....

wenn du die 52 Wiederholungen vermeiden willst, dann dann hast du mehrere Möglichkeiten
a) Programmierprofi werden und Klassenprogramierung lernen

b) folgenden Workaround anwenden, allerdings funktioniert dieser nur, wenn die Labels nebeneinander liegen und keine weiteren Steuerelemente, in die der Anwender etwas eingeben soll (Textboxen, Checkboxen usw), dazwischen liegen:

1. lege über die 53 Labels noch ein weiters Label, dieses sollte alle Labels abdecken und noch einen kleinen Rand drum herum. Dieses Label muss eine Ebene höher liegen als die anderen Labels und diese verdecken.
2. setze den Hintergrund dieses zusätzlichen Labels auf Transparent, damit du die darunter liegenden Labels trotzdem siehst.

3. verwende jetzt nur das MouseMoveevent dieses neuen Labels. Mit Hilfe folgender Schleife kannst du prüfen, welches der anderen Labels sich unter dem Mauszeiger befindet und gefärbt werden muss.

im Beispiel ist das Label, dass über den anderen liegt, das Label5
die Standardfarbe ist nicht dein Grau, sondern blau (war für mich einfacher zu programmieren), aber das kannst du ja anpassen:

Private Sub Label5_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Dim crt As Control
Dim x1 As Single
Dim y1 As Single

y1 = Y + Label5.Top
x1 = X + Label5.Left
For Each crt In Me.Controls
If crt.Top = y1 And crt.Left = x1 And (crt.Top + crt.Height) >= y1 And (crt.Left + crt.Width) >= x1 Then
If crt.BackColor > vbGreen Then crt.BackColor = vbGreen
Else
If crt.BackColor > vbBlue Then crt.BackColor = vbBlue
End If
Next
End Sub

damit brauchst du zum Umfärben nur 1 einziges Makro und nicht mehr über 50.

Gruß Daniel
Anzeige
AW: Userform flackert
09.12.2025 11:27:08
Alwin Weisangler
Vielleicht noch zur Ergänzung:

Weil Frame kein echtes Fenster ist, kommt man nicht via API .hWnd da dran. Ich wüsste jetzt keinen Weg, wie man ein Flackern via API durch die Hintertür verhindern kann. Vielleicht liest das Volti mit. Der kann da vielleicht besser weiterhelfen. Was aber in Sachen Übersichtlichkeit hilft, ist so was in einer Klasse zu handhaben.

Gruß Uwe
Anzeige
AW: Userform flackert
09.12.2025 14:58:42
Alwin Weisangler
Hallo Miteinanader,

Mit DoEvents in Klasse verschwindet das Problem in Gänze:

in Klassenmodul cls_Label:


Option Explicit
Private WithEvents p_Label As MSForms.Label

Property Set Label(oLabel As MSForms.Label)
Set p_Label = oLabel
End Property

Private Sub p_Label_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim i&
If Sperre = False Then
For i = 100 To 152
DoEvents
Frm_MitFrame.Controls("Label" & i).BackColor = RGB(227, 227, 227)
Next
SperreFrame = False
End If
Sperre = True
p_Label.BackColor = RGB(192, 255, 192)
End Sub

Darauf hätte ich eigentlich gleich kommen sollen.

Gruß Uwe
Anzeige
AW: Userform flackert
09.12.2025 16:41:06
Alwin Weisangler
Ich weiß viele Scheuen sich vor der Nutzung der Möglichkeiten einer Klassenprogrammierung. Aber ich denke bei so vielen Controls macht die Nutzung solcher Möglichkeiten durchaus Sinn.

Hier noch fürs Userform der ressourcenschonendere Weg zum Laden der Labels in die Klasse.
Ins Modul des Userforms:


Option Explicit
Dim cLbl() As cls_Label

Private Sub LabelsLesen()
Dim CoLbl As Control, i As Long
ReDim cLbl(0 To 52)
For Each CoLbl In Me.Controls
If TypeName(CoLbl) = "Label" Then
Set cLbl(i) = New cls_Label
Set cLbl(i).Label = CoLbl
i = i + 1
End If
Next CoLbl
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If SperreFrame = False Then
Sperre = False
SperreFrame = True
End If
End Sub

Private Sub UserForm_Initialize()
LabelsLesen
End Sub



Gruß Uwe
Anzeige
AW: Userform flackert
09.12.2025 16:46:29
Alwin Weisangler
da kannst man nun auch die Boolean Variablen aus den Prozeduren rausnehmen. Die sind nun überflüssig.
https://www.herber.de/bbs/user/179802.xlsm

Gruß Uwe
AW: ... lässt sich ...
10.12.2025 10:21:38
schauan
... so was auch vermeiden, abgesehen von langsamer arbeiten :-) ?

Userbild
Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18