XL 2021 Commentaire au survol d'un checkbox d'un userform

Nicolas JACQUIN

XLDnaute Occasionnel
Supporter XLD
Bonjour à tous,

Comme le titre le dit, je cherche à mettre un commentaire ou note au survol d'un checkbox d'un userform,
je sais que ça se fait et qui en a qui savent faire, mais plus moyen de trouver.

Merci d'avance à tous
 
Solution
Bonjour tous le monde,
J'ai trouvé ma solution je pense

Dans un module

VB:
Public Const MyString1 = "Les 1"
Public Const MyString2 = "Les 2"
Public Const MyString3 = "Les 3"
Public Const MyString4 = "Les 4"

Et dans le userform

Code:
Private Sub CheckBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox1, vbCrLf & MyString1
End Sub

Private Sub CheckBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox2, vbCrLf & MyString2
End Sub

Private Sub CheckBox3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox3, vbCrLf & MyString3...

fanch55

XLDnaute Barbatruc
Bonsoir,
1715275293283.png
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Avec ControlTipText apparemment ce n'est pas possible.

Mettre Un Label qui afficherait le texte voulu lors du passage sur Le CheckBox
Exactement, mais le problème c'est de l'effacer quand le survol cesse.

Alors tu m'as fait ressortir une fonction MouseIsOverObject() en Module_MouseIsOverObject dans ce code que j'avais faite pour la ressource de Scroll qui détermine si la souris est sur un Object (Userform, Control de UserForm ou ActiveX, Edit: ou Range).
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Oublié d'ajouter un DoEvents dans la boucle pour pouvoir cocher la CheckBox.
Et privatiser les fonctions du Module_MouseIsOverObject.

Fichier mis à jour
10/05/2024 13h58
 

Pièces jointes

  • Control MouseMove afficher un Label.xlsm
    38.6 KB · Affichages: 6
Dernière édition:

fanch55

XLDnaute Barbatruc
Un autre exemple de code ( les tiptext sont stockés dans le Tag )
N'aime pas les contrôles contigus non plus sauf si on code les mousemove pour chaque controle .....
VB:
Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    TipText ComboBox1
End Sub
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    TipText TextBox1, 100
End Sub
Private Sub Checkbox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    TipText CheckBox1
End Sub
Private Sub UserForm_Initialize()
    CheckBox1.Tag = "ligne1" & vbLf & "ligne2" & vbLf & "ligne4" & vbLf & "ligne5"
    TextBox1.Tag = "TextBox1" & vbLf & "TextBox2" & vbLf & "TextBox4" & vbLf & "TextBox5"
    ComboBox1.Tag = "Combobox1" & vbLf & "Combobox2" & vbLf & "Combobox3" & vbLf & "Combobox4"
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label1.Visible = False
End Sub
Sub TipText(Ctl As Control, Optional W As Long)
    With Label1
        If W > 0 Then
            .AutoSize = False
            .Width = W
        Else
            .AutoSize = True
            .Width = 9999
        End If
        .Caption = Ctl.Tag
        .Left = Ctl.Left + 10
        .Top = Ctl.Top + Ctl.Height + 1
        .Visible = True
        .ZOrder 0
    End With
End Sub
 

Dudu2

XLDnaute Barbatruc
Alors, comme @fanch55 et suggéré par @Valtrase, j'ai fait cette version simplifiée qui utilise l'évènement UserForm_MouseMove().

Même remarque, ça marche si les limites du Control sous MouseMove ne sont pas trop proches de celles d'un ou plusieurs autres Controls ou du UserForm lui-même. Car en déplacement rapide de la souris, l'espace appartenant spécifiquement au UserForm est trop court pour permettre de déclencher l'évènement UserForm_MouseMove() à coup sûr.

C'est la raison pour laquelle, dans le Scroll, où il n'était pas acceptable de laisser une porte ouverte, j'avais dû faire la fonction citée plus haut en Post #9. Mais ici, pour un Label qui resterait affiché indûment, ce n'est pas aussi essentiel.
 

Pièces jointes

  • Control MouseMove afficher un Label - Simplifié.xlsm
    29.6 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
bonsoir
2 vraies solutions
soit tu classe avec un label dynamique et tu classe en même temps le parent pour agir sur le move du parent
soit il ten faut deux comme sur les feuille un a peine plus grand que l'autre le moindre déplacement va agir sur le plus grand qui efface les deux le move sur ton control affiche les deux le plus grand est un label transparent bien entendu
alors comment ca se passe
etape
1: tu move sur ton control
creation dynamique du label N° 1 transparent(remarque il peut être déjà en place caché quelque part (invisible)
mise au niveau du control (il doit dépasser de tout les coté et mise en arrière plan du label(zorder 1)
2° creation du label N°2 dit tiptext et placement ou tu veux (lui aussi peut être déjà là caché quelque part et ou invisible inscription du texte de l'info dans le label N°2
quand tu va sortir du control même si le label transparent est en dessous comme il dépasse tu va passer dessus son event mose move efface les deux

astuce vielle comme le monde ;)
je te fait un exemple ou tu as compris ?
 

patricktoulon

XLDnaute Barbatruc
démonstration
3 checkbox doivent avoir leur tooltip text perso
un label mask (le violet dans la démo)
un label pour le commentaire(le jaune dans la démo)
exemple de code comme ça vite fait
1715299412887.png


VB:
Private Sub CheckBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox1, "turlututu " & vbCrLf & " chapeau pointu" & vbCrLf & "vive les casquettes"
End Sub

Private Sub CheckBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox2, "oui lui aussi  " & vbCrLf & "il a droit a" & vbCrLf & "son commentaire"
End Sub

Private Sub CheckBox3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox3, "blablabla " & vbCrLf & " blablabla" & vbCrLf & "blablabla"
End Sub

Private Sub calquetrans_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    calquetrans.Visible = False: commentaire.Visible = False
End Sub
Private Sub commentaire_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    calquetrans.Visible = False: commentaire.Visible = False
End Sub
Sub commentary(check, comm)
    calquetrans.Visible = True
    calquetrans.ZOrder 1
    commentaire.Visible = True
    With check
        calquetrans.Move check.Left - 10, check.Top - 10, check.Width + 20, check.Height + 20
        commentaire.Move check.Left + check.Width / 1.5, check.Top - commentaire.Height - 5
        commentaire.Caption = check.Name & vbCrLf & comm
   If commentaire.Top < 0 Then commentaire.Top = 0
   If commentaire.Left + commentaire.Width > Me.InsideWidth Then commentaire.Left = Me.InsideWidth - commentaire.Width
   End With
End Sub

tu vois c'est pas compliqué
démonstration avec le mask sans transparence pour que tu vois et comprenne le rôle du violet
demo.gif

et maintenant on lui enlève simplement le backstyle
demo.gif


et voila terminé
pas besoins de tag et de touticouintiti
 

Discussions similaires

Statistiques des forums

Discussions
312 506
Messages
2 089 121
Membres
104 038
dernier inscrit
Helpme59