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

Forumthread: UserForm - MouseOver - zentral auswerten

UserForm - MouseOver - zentral auswerten
23.07.2013 11:04:12
Michael
Hi.
Ich habe hier ein Userform, mit ettlichen Controls.
Nun werte ich u.a. auch das MouseOver Event aus.
Je nach Controls unter dem Mauszeiger wird eine Info angezeigt oder auch nicht.
Anzeigen ist klar, bei MouseOver des entsprechenden Controls.
Ausblenden ist anwändiger, bei MouseOver bei allen anderen Controls.
Das Lästige ist nun, das der Code nur mehr schwer lesbar ist, da ich den MouseOver für jedes Control abfangen muß.
Gibt es eine Möglichkeit das MouseOver zentral abzufangen und die Aktion an Hand des Control Namens zu steuern - dachte da an eien Art zentrales Event?
Danke
Michi

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: UserForm - MouseOver - zentral auswerten
23.07.2013 13:03:33
fcs
Hallo Michi,
bist sicher, das sich um ein VBA-Userform handelt, diese kennen die Steuerelement-Ereignisse MouseMove, MouseUp und MouseDown aber nicht MouseOver.
Warum nutzt du nicht die VBA-Steuerelement-Eigenschaft "ControlTipText" für deine Zwecke?
Wenn es sich um VBA-Userform handelt, dann kannst du das MouseMove-Ereignis des Userforms selber nutzen, um das Steuerelement mit der Info auszublenden.
Gruß
Franz
In einem Excel-VBA-Userform könnte man das etwa so umsetzen.
Möglicherweise bekommt man die Ereignisauswertung über ein Klassenmodul auch zentral hin, da hab ich aber zu wenig Erfahrungen, speziell wenn wie hier verschieden Steuerelemente in einer Klasse behandelt werden sollen.
Beispiel-Code
'Userform Code
Private Sub prcMouseMove(strControl As String, strText As String, _
Optional bolOberhalb As Boolean = False)
'Blendet für Steuerelement mit Name strControl das Label "LabelInfo" mit _
dem Text strText ein
'Label wird entsprechend der Option bolOberhalb über oder unter dem Steuerelement angezeigt
Dim dblLeft As Double, dblTop As Double
With Me.Controls(strControl)
dblLeft = .Left
If bolOberhalb = True Then
dblTop = .Top - Me.LabelInfo.Height
Else
dblTop = .Top + .Height
End If
End With
With Me.LabelInfo
.Caption = strText
.Top = dblTop
.Left = dblLeft
.Visible = True
End With
End Sub
Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
prcMouseMove "ComboBox1", "Hier den namen auswählen", True
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
prcMouseMove "CommandButton1", "Press this Button"
End Sub
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
prcMouseMove "Label1", "I am a Label"
End Sub
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
prcMouseMove "Textbox1", "Hier Vorname eingeben"
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
'blendet das Infolabel aus
With Me.LabelInfo
.Visible = False
.Caption = ""
End With
End Sub

Anzeige
AW: UserForm - MouseOver - zentral auswerten
23.07.2013 13:43:54
Michael
Hi Franz.
Sorry, hab mich vertan, ist natürlich wie Du schon berichtigt hast das MouseMove Event.
Auch in Deinem Beispiel muß ich zu jedem Control das MouseMove Event vorhalten.
Meine Userform hat ... moment ... 126 Controls incl. der Userform, zwar nicht immer alle sichtbar (Situationsbedingtes ein-/ausblenden und MultiPage) aber bei jedem brauch ich das Event.
Hauptsächlich deswegen, damit ich auch schnelle und ruckartige Mausbewegungen immer sauber getriggert werden.
"Wenn es sich um VBA-Userform handelt, dann kannst du das MouseMove-Ereignis des Userforms selber nutzen, um das Steuerelement mit der Info auszublenden."
Just das macht halt bei schnellen und ruckartigen Bewegungen Probleme, so dass ich mich nicht nur auf das UserForm_MouseMove verlassen kann.
ControlTipText ist leider nicht Multiline und reicht mir bei weitem nicht aus.
Es werden auch diverse Infobilder mit angezeigt.
Bemühe auch schon seit 3-4 Tagen Google, aber auch ohne Erfolg.
Es funktioniert aktuell prima, nur die extreme Anzahl an Codezeilen erschwert den Überblick doch ungemein.
Dachte halt an eine Art globales Event, ohne für jedes Control ein eigenes Event haben zu müssen.
Michi

Anzeige
AW: UserForm - MouseOver - zentral auswerten
23.07.2013 13:54:22
Michael
Ups, noch offfen ...

AW: UserForm - MouseOver - zentral auswerten
23.07.2013 14:43:13
Luschi
Hallo Michi,
hier mal ein Beispiel, wie mit Klassenprogrammierung so ein Problem löst wird.
Originaldatei: http://hajo-excel.de/uebersicht.htm - UserForm12
Ich habe das 'MouseOver'-Ereignis für das CheckBox-Formular und das 'Click'-Ereignis
für das OptionButton-Formular hinzugefügt, sowie das Aufräumen der 2 Array veranlaßt.
https://www.herber.de/bbs/user/86517.zip
Gruß von Luschi
aus klein-Paris

Anzeige
AW: UserForm - MouseOver - zentral auswerten
24.07.2013 08:47:36
Michael
Hi Luschi,
War zwar einiges an umprogrammieren, aber es hat super funktioniert!
Vielen Danke für die Hilfe!
Michi
aus Bamberg
PS: Wo ist den "klein-Paris"?
;
Anzeige
Anzeige

Infobox / Tutorial

MouseOver-Ereignisse in Excel UserForms zentral auswerten


Schritt-für-Schritt-Anleitung

Um das MouseMove-Event in einem Excel UserForm zentral auszuwerten, kannst Du folgende Schritte befolgen:

  1. Erstelle ein UserForm: Öffne Excel und gehe zu den Entwicklertools. Wähle "Visual Basic" und erstelle ein neues UserForm.

  2. Füge Steuerelemente hinzu: Platziere die gewünschten Steuerelemente (z.B. ComboBox, CommandButton, Label, TextBox) auf dem UserForm.

  3. Füge ein Label für die Infoanzeige hinzu: Erstelle ein Label, das die Informationen anzeigen soll, wenn der Mauszeiger über einem Steuerelement ist.

  4. Programmiere die zentralisierte MouseMove-Methode: Implementiere eine Methode, die die MouseMove-Ereignisse der Steuerelemente verarbeitet. Dazu kannst Du den folgenden Beispielcode verwenden:

    Private Sub prcMouseMove(strControl As String, strText As String, _
    Optional bolOberhalb As Boolean = False)
        Dim dblLeft As Double, dblTop As Double
        With Me.Controls(strControl)
            dblLeft = .Left
            If bolOberhalb Then
                dblTop = .Top - Me.LabelInfo.Height
            Else
                dblTop = .Top + .Height
            End If
        End With
        With Me.LabelInfo
            .Caption = strText
            .Top = dblTop
            .Left = dblLeft
            .Visible = True
        End With
    End Sub
  5. Verknüpfe die MouseMove-Ereignisse der Steuerelemente: Für jedes Steuerelement, das Du hinzugefügt hast, rufe die prcMouseMove-Methode im MouseMove-Ereignis auf, wie im folgenden Beispiel gezeigt:

    Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
    ByVal X As Single, ByVal Y As Single)
        prcMouseMove "ComboBox1", "Hier den Namen auswählen", True
    End Sub
  6. Implementiere das UserForm_MouseMove-Ereignis: Um das Label auszublenden, wenn die Maus über das UserForm bewegt wird, kannst Du folgendes verwenden:

    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
    ByVal X As Single, ByVal Y As Single)
        With Me.LabelInfo
            .Visible = False
            .Caption = ""
        End With
    End Sub

Häufige Fehler und Lösungen

  1. MouseOver nicht erkannt: Stelle sicher, dass Du das richtige Ereignis verwendest. In VBA gibt es kein MouseOver-Event, sondern nur das MouseMove-Event.

  2. Label bleibt sichtbar: Wenn das Label nicht ausgeblendet wird, überprüfe, ob die UserForm_MouseMove-Methode korrekt implementiert ist.

  3. Leistungseinbußen: Bei vielen Steuerelementen kann es zu Performance-Problemen kommen. Überlege, ob Du die Anzahl der Steuerelemente reduzieren oder die Logik optimieren kannst.


Alternative Methoden

Eine alternative Methode zur zentralen Auswertung des MouseMove-Events könnte die Verwendung von Klassenmodulen sein. Damit kannst Du die Logik für die MouseMove-Ereignisse in ein separates Modul auslagern und für jedes Steuerelement eine Instanz der Klasse erstellen.


Praktische Beispiele

Hier ist ein Beispiel, wie Du das MouseMove-Event für eine CheckBox und einen Button zentral verwalten kannst:

Private Sub CheckBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    prcMouseMove "CheckBox1", "Hier die Auswahl bestätigen"
End Sub

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    prcMouseMove "CommandButton1", "Drücke diesen Button"
End Sub

In diesem Beispiel wird das zentrale MouseMove-Ereignis genutzt, um spezifische Informationen für jedes Steuerelement anzuzeigen.


Tipps für Profis

  • Nutze Klassenmodule für eine bessere Strukturierung Deines Codes, insbesondere bei einer hohen Anzahl an Steuerelementen.
  • Halte den Code dringend lesbar. Vermeide übermäßige Verschachtelungen.
  • Verwende Option Explicit in Deinen Modulen, um Fehler durch nicht deklarierte Variablen zu vermeiden.

FAQ: Häufige Fragen

1. Wie funktioniert das MouseMove-Event?
Das MouseMove-Event wird ausgelöst, wenn der Mauszeiger über ein Steuerelement bewegt wird. In VBA kannst Du das MouseMove-Event für jedes Steuerelement individuell bearbeiten.

2. Kann ich MouseOver für mehrere Steuerelemente gleichzeitig verwenden?
Ja, indem Du eine zentrale Methode wie prcMouseMove implementierst, kannst Du das MouseMove-Event für alle Steuerelemente zentral steuern, ohne für jedes einzelne Steuerelement einen eigenen Code zu schreiben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige