Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1840to1844
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Code Optimierung möglich?
10.08.2021 16:00:57
Sven1403
Moin an alle,
ich bin momentan dabei ein UserForm zu erstellen was eine einfach Eingabe ermöglicht. Der Nutzer soll Datumseingaben machen. Ich habe da was nettes gefunden. Jemand hat eine Klasse erstellt die ein Kalender enthält (damit spart man sich das Steuerelement was es gibt -> Grund: hier im Unternehmen ist das nicht standardmäßig installiert). Das hab ich nun so integriert, dass der Nutzer auf ein Textfeld im UserForm klickt, sich ein neues Form öffnet mit dem besagten Kalender. Siehe hier: Userbild
Klickt man nun ein Datum an wird das in das Textfeld im Screenshot eingetragen und mit Übernehmen an das Haupt Formular geschickt und da in die Ursprungs Textbox eingetragen.
Das zur Funktion.
Ich wollte das nun so nutzerfreundlich machen, dass der Nutzer sieht was er da im Kalender anklickt. Also ein einfacherer Hover Effekt. Ich musste mich da natürlich an die Kalender Klasse anpassen. Habe auch rausgefunden wie es funktioniert. Bloß nun flackert der Kalender wenn man zwischen den Labels entlang geht. Hier mal die Datei mit der Kalender Klasse: https://www.herber.de/bbs/user/147536.xls
Ich probiere es mal mit eigenen Worten zu erklären: Der Kalender besteht aus ganz vielen Labels mit einen großen sogenannten LabelClickArea. In diesem LabelClickArea kann man anhand der X/Y Koordinate die Reihe und Spalte rausfinden wo reingeklickt wird. Das wird hiermit gemacht:
intRow = sngY / 12 + 0.5
intCol = sngX / 12 + 0.5
Funktioniert auch alles perfekt.
Mein Ansatz war dann ein ziemlicher statischer, wo ich händisch alle möglichen Treffer definiert habe. Da hat es dann schon geflackert. Dachte wenn ich den Code mit Select Case verringere wird es besser. Wird es auch, ABER der Hover Effekt ist fehlerhaft... Hier noch einmal die Kalender Datei mit dem Fehler: https://www.herber.de/bbs/user/147537.xls
Einfach den Kalender über den Button öffnen und mit der Maus mal rumspielen. Mein Code ist im UserForm unter Private Sub LabelClickArea_MouseMove
Poste den auch nochmal hier:

Private Sub LabelClickArea_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
clsCal.CaptureClick
Cancel = True
End Sub
Private Sub LabelClickArea_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim intRow As Integer
Dim intCol As Integer
intRow = Y / 12 + 0.5
intCol = X / 12 + 0.5
Select Case intRow
Case 3
If intCol = 1 Then Label1.BackColor = RGB(211, 240, 224) Else Label1.BackColor = &HFFFFFF
If intCol = 2 Then Label2.BackColor = RGB(211, 240, 224) Else Label2.BackColor = &HFFFFFF
If intCol = 3 Then Label3.BackColor = RGB(211, 240, 224) Else Label3.BackColor = &HFFFFFF
If intCol = 4 Then Label4.BackColor = RGB(211, 240, 224) Else Label4.BackColor = &HFFFFFF
If intCol = 5 Then Label5.BackColor = RGB(211, 240, 224) Else Label5.BackColor = &HFFFFFF
If intCol = 6 Then Label6.BackColor = RGB(211, 240, 224) Else Label6.BackColor = &HFFFFFF
If intCol = 7 Then Label7.BackColor = RGB(211, 240, 224) Else Label7.BackColor = &HFFFFFF
Case 4
If intCol = 1 Then Label8.BackColor = RGB(211, 240, 224) Else Label8.BackColor = &HFFFFFF
If intCol = 2 Then Label9.BackColor = RGB(211, 240, 224) Else Label9.BackColor = &HFFFFFF
If intCol = 3 Then Label10.BackColor = RGB(211, 240, 224) Else Label10.BackColor = &HFFFFFF
If intCol = 4 Then Label11.BackColor = RGB(211, 240, 224) Else Label11.BackColor = &HFFFFFF
If intCol = 5 Then Label12.BackColor = RGB(211, 240, 224) Else Label12.BackColor = &HFFFFFF
If intCol = 6 Then Label13.BackColor = RGB(211, 240, 224) Else Label13.BackColor = &HFFFFFF
If intCol = 7 Then Label14.BackColor = RGB(211, 240, 224) Else Label14.BackColor = &HFFFFFF
Case 5
If intCol = 1 Then Label15.BackColor = RGB(211, 240, 224) Else Label15.BackColor = &HFFFFFF
If intCol = 2 Then Label16.BackColor = RGB(211, 240, 224) Else Label16.BackColor = &HFFFFFF
If intCol = 3 Then Label17.BackColor = RGB(211, 240, 224) Else Label17.BackColor = &HFFFFFF
If intCol = 4 Then Label18.BackColor = RGB(211, 240, 224) Else Label18.BackColor = &HFFFFFF
If intCol = 5 Then Label19.BackColor = RGB(211, 240, 224) Else Label19.BackColor = &HFFFFFF
If intCol = 6 Then Label20.BackColor = RGB(211, 240, 224) Else Label20.BackColor = &HFFFFFF
If intCol = 7 Then Label21.BackColor = RGB(211, 240, 224) Else Label21.BackColor = &HFFFFFF
Case 6
If intCol = 1 Then Label22.BackColor = RGB(211, 240, 224) Else Label22.BackColor = &HFFFFFF
If intCol = 2 Then Label23.BackColor = RGB(211, 240, 224) Else Label23.BackColor = &HFFFFFF
If intCol = 3 Then Label24.BackColor = RGB(211, 240, 224) Else Label24.BackColor = &HFFFFFF
If intCol = 4 Then Label25.BackColor = RGB(211, 240, 224) Else Label25.BackColor = &HFFFFFF
If intCol = 5 Then Label26.BackColor = RGB(211, 240, 224) Else Label26.BackColor = &HFFFFFF
If intCol = 6 Then Label27.BackColor = RGB(211, 240, 224) Else Label27.BackColor = &HFFFFFF
If intCol = 7 Then Label28.BackColor = RGB(211, 240, 224) Else Label28.BackColor = &HFFFFFF
Case 7
If intCol = 1 Then Label29.BackColor = RGB(211, 240, 224) Else Label29.BackColor = &HFFFFFF
If intCol = 2 Then Label30.BackColor = RGB(211, 240, 224) Else Label30.BackColor = &HFFFFFF
If intCol = 3 Then Label31.BackColor = RGB(211, 240, 224) Else Label31.BackColor = &HFFFFFF
If intCol = 4 Then Label32.BackColor = RGB(211, 240, 224) Else Label32.BackColor = &HFFFFFF
If intCol = 5 Then Label33.BackColor = RGB(211, 240, 224) Else Label33.BackColor = &HFFFFFF
If intCol = 6 Then Label34.BackColor = RGB(211, 240, 224) Else Label34.BackColor = &HFFFFFF
If intCol = 7 Then Label35.BackColor = RGB(211, 240, 224) Else Label35.BackColor = &HFFFFFF
Case 8
If intCol = 1 Then Label36.BackColor = RGB(211, 240, 224) Else Label36.BackColor = &HFFFFFF
If intCol = 2 Then Label37.BackColor = RGB(211, 240, 224) Else Label37.BackColor = &HFFFFFF
If intCol = 3 Then Label38.BackColor = RGB(211, 240, 224) Else Label38.BackColor = &HFFFFFF
If intCol = 4 Then Label39.BackColor = RGB(211, 240, 224) Else Label39.BackColor = &HFFFFFF
If intCol = 5 Then Label40.BackColor = RGB(211, 240, 224) Else Label40.BackColor = &HFFFFFF
If intCol = 6 Then Label41.BackColor = RGB(211, 240, 224) Else Label41.BackColor = &HFFFFFF
If intCol = 7 Then Label42.BackColor = RGB(211, 240, 224) Else Label42.BackColor = &HFFFFFF
End Select
With clsCal
.sngX = X
.sngY = Y
End With
End Sub
Die einzelnen Labels mit MouseMove ansprechen geht leider nicht weil die unter dem LabelClickArea liegen.
Falls einer eine Idee hat wie man den Fehler im oben stehenden Code beheben kann damit es richtig läuft oder eine Methode hat wo es auch läuft wäre ich sehr dankbar :)
Flackern tut es übrigens wenn ich die intRow Cases nicht nehme und dann wirklich alles statisch hinschreibe. Beispiel:

If intRow = 1 And intCol = 1 Then Label1.BackColor = usw.
Vielleicht freut sich ja auch einer über diese Kalender Klasse, die ich gefunden habe. Finde das Ding sau geil :P
Danke im Voraus
Gruß Sven

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

Betreff
Datum
Anwender
Anzeige
AW: Code Optimierung möglich?
10.08.2021 16:35:15
Yal
Hallo Sven,
das gesamte Select Case mit folgendem ersetzen:

For i = 1 To 42
Me.Controls("Label" & i).BackColor = &HFFFFFF
Next
Me.Controls("Label" & ((introw - 3) * 7 + intcol)).BackColor = RGB(211, 240, 224)
anders gesagt: zuerst alles auf Defualt-Farbe, dann gezielt den einen auf die RGB-Farbe setzen.
VG
Yal
AW: Code Optimierung möglich?
10.08.2021 21:36:42
Sven1403
Werde es morgen mal probieren. Schon einmal Danke Yal :)
AW: Code Optimierung möglich?
11.08.2021 08:55:19
Sven1403
Hi Yal bekomme in der Zeile

Me.Controls("Label" & ((introw - 3) * 7 + intcol)).BackColor = RGB(211, 240, 224)
folgenden Fehler:
Userbild
Anzeige
AW: Code Optimierung möglich?
11.08.2021 09:03:36
Sven1403
Nevermind war mein Fehler. Hab die Berechnung für intRow und intCol vergessen.
Leider flackert es immer noch wenn man über die einzelnen Tage hovert :(
AW: Code Optimierung möglich?
11.08.2021 13:04:53
peterk
Hallo
Probier mal folgendes

Private Sub LabelClickArea_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim intRow As Integer
Dim intCol As Integer
intRow = Y / 12 + 0.5
intCol = X / 12 + 0.5
If (intRow > 2) And (intRow  0) Then
Me.Controls("Label" & ((LastIntRow - 3) * 7 + LastIntCol)).BackColor = &HFFFFFF
Me.Controls("Label" & ((intRow - 3) * 7 + intCol)).BackColor = RGB(211, 240, 224)
LastIntRow = intRow
LastIntCol = intCol
End If
With clsCal
.sngX = X
.sngY = Y
End With
End Sub
und im Modul

Option Explicit
Public LastIntRow As Integer
Public LastIntCol As Integer
Sub ShowForm()
LastIntRow = 3
LastIntCol = 1
UserForm1.Show
End Sub

Anzeige
AW: Code Optimierung möglich?
11.08.2021 14:54:09
Sven1403
Oh mein Gott das funktioniert ohne Flackern :O Vielen Dank!
Was genau ist da anders? Weniger Berechnung?
Was mir aber aufgefallen ist, dass das Flackern bei anderen Lösungen nur auftretet wenn ich meine Auflösungsskalierung in Windows auf über 100% habe. Stelle ich die auf 100%, flackert es auch nicht mehr. Da ist es natürlich der Hammer, dass deine Lösung auch bei anderer Auflösungsskalierung funktioniert :) Weißt du evtl. woran es liegt dass bei anderen Lösung es nur mit hoher Auflösungsskalierung flackert?
AW: Code Optimierung möglich?
11.08.2021 15:09:20
Daniel
HI
wird wohl daran liege, dass andere Skalierungen für Windows schiwieriger zu handeln sind als 100%
man kann dem Rechner aber auch die Arbeit leichter machen und nur dann umfärben, wenn es notwendig ist.
dazu fragt man die Farbe ab und ändert nur dann, wenn das Steuerelement die Farbe noch nicht hat.

if me.Controls(...).BackColor   &HFFFFFF then me.Controls(...).BackColor =  &HFFFFFF
etwas mehr Code für dich, etwas weniger aufwand für den Rechner.
btw, hast du dir meine Lösung schon mal angeschaut, die ich dir in deiner ersten Anfrage geschickt habe, schon mal angeschaut?
wäre schön, wenn du auch da mal antwortest.
Gruß´Daniel
Anzeige
AW: Code Optimierung möglich?
11.08.2021 15:49:49
Sven1403
Hi Daniel.
Ja habe deinen Code da probiert und auch geantwortet :) Ich weiß nicht warum ich den Beitrag doppelt gepostet habe ^^
AW: Code Optimierung möglich?
11.08.2021 15:56:48
Daniel
kann passieren, wenn man durch die Browserhistorie klickt.
wenn man über Seite mit dem Absenden des Beitrags geht, wird dieser nochmal gesendet und erneut eingestellt.
Eine Absicherung fehlt da.
Gruß Daniel
AW: Code Optimierung möglich?
11.08.2021 15:11:39
peterk
Hallo
Bei meiner Lösung werden gezielt nur 2 Labels angesprochen, bei den vorherigen Lösungen 43 (die Schleife), bei deiner Lösungen hab ich nicht gezählt, da bei einer vertikalen Bewegung der alte Label nicht zurückgesetzt wurde.
Peter
Anzeige
AW: Code Optimierung möglich?
11.08.2021 17:49:42
Sven1403
Eine Frage dazu noch:
Wenn ich jetzt die ersten Reihen des Kalenders auch mit dem Hover Effect bestücken möchte, müsste ich dann nur:

If (intRow > 2) And (intRow  0) Then
in:

If (intRow > 0) And (intRow  0) Then
ändern?

286 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige