IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Afficher dans controltiptext d'une ListBox le texte survolé par la souris [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut Afficher dans controltiptext d'une ListBox le texte survolé par la souris
    Bonjour,

    j'ai des listes déroulantes contenant de longs textes.

    Je souhaiterais que par le survol de la souris sur une ligne, on puisse afficher l'intégralité du texte dans une étiquette sans cliquer dessus (sans perdre la sélection actuelle). Un "controlTips" en fonction du survol par le curseur de la souris de la zone de liste.

    Je ne retrouve pas le code.

    Merci pour vos indices.

    ESVBA

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Une alternative
    à côté de ta listbox tu crée un label Label1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub UserForm_Initialize()
    Me.ListBox1.RowSource = "Feuil1!A1:A20" 'initialisation de la listbox
    With Me.Label1                          'Mise en forme du label prix comme info bulle
        .Caption = ""
        .BackColor = &H80000018
        .Visible = False
    End With
    End Sub
     
    Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim i As Integer
    Dim msg As String
    With Me.ListBox1
        i = (Y - 1) \ (.Font.Size + 1) + .TopIndex
        If i <= .ListCount - 1 Then msg = .List(i)
        If X * Y <= 10 Or Y >= .Height - 5 Or X >= .Width - 15 Then msg = vbNullString
    End With
    With Me.Label1
        .Visible = Len(msg) > 0
        .Top = Me.ListBox1.Top + Y
        .Caption = msg
    End With
    End Sub

  3. #3
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut bonjour Mercatoq et le forum,
    Pour des indices, ça ressemble à une solution.

    Merci.
    Je pensais à quelque chose de plus complexe.
    Je teste ça.

    ESVBA

  4. #4
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut Hélàs...
    j'ai un problème lorsqu'il y a une dizaine de lignes dans la "listbox".

    Il se produit un décalage, j'obtiens la ligne du dessous dans le "label1".

    Après divers essais, je constate :
    • La taille de la police définie dans VBE pour la "listbox" est de "8".
    • La taille indiquée par ".Font.size" est de "8,25".
    • Le "Y" varie de "0,75" par déplacement mimimal sur l'écran.
    • La variation de "Y" est de "9,75" pour une ligne de la listbox.
    • Et (vérifié) de "10,5" pour sauter à la ligne d'après (9.75+0.75).
    • Il y a une "ligne vide de pixel entre chaque item" ou plus.
    • Le changement de taille et de police ne changent rien. Sauf mauvais choix.



    Je suis perdu pour relier toutes ces données. Je ne vois pas comment faire ?

    ESVBA

  5. #5
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    bjr

    on peut utiliser les fonctions d'accessibilité

    si j'extrais du module clAccessibility ce qui nous intéresse pour que le code soit moins lourd, cela se résume à ce module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Option Explicit
     
    Private Declare Function AccessibleObjectFromPoint Lib "oleacc" (ByVal lX As Long, ByVal lY As Long, ppacc As IAccessible, pvarChild As Variant) As Long
    Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As PointAPI) As Long
    Private Type PointAPI
        X As Long
        Y As Long
    End Type
     
    Public Function GetListIndexUnderMouse() As Long
    Dim lPt As PointAPI
    Dim lChild As Variant
    GetCursorPos lPt
    AccessibleObjectFromPoint lPt.X, lPt.Y, Nothing, lChild
    GetListIndexUnderMouse = CLng(lChild) - 1
    End Function
    il suffit d'appeler GetListIndexUnderMouse sur souris déplacée sur la liste pour avoir l'index de la ligne survolée

    Remarque : j'ai testé avec Excel 2003

  6. #6
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    une autre version, avec une API en moins, cette fois-ci je suis sur Excel 2007
    je n'ai pas expliqué cette méthode dans l'article mais on peut passer par un objet IAccessible pour utiliser les fonctions d'accessibilité acc* des contrôles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Option Explicit
     
    Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As PointAPI) As Long
    Private Type PointAPI
        X As Long
        Y As Long
    End Type
     
    Public Function GetListIndexUnderMouse(pObject As IAccessible) As Long
    Dim lPt As PointAPI
    Dim lChild As Variant
    GetCursorPos lPt
    lChild = pObject.accHitTest(lPt.X, lPt.Y)
    GetListIndexUnderMouse = CLng(lChild) -1
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Objective-C] comment afficher dans un scrollview une image ou une vidéo puis du texte?
    Par Seelass dans le forum Objective-C
    Réponses: 0
    Dernier message: 17/07/2012, 15h55
  2. [XL-2003] Afficher les valeurs d'une listbox multi dans le tableur
    Par tarantino dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/10/2010, 09h28
  3. afficher le contenu d'une zone de texte dans une page WEB
    Par tomman dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 11/06/2007, 14h55
  4. Réponses: 4
    Dernier message: 17/07/2006, 13h41
  5. Réponses: 2
    Dernier message: 19/01/2006, 19h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo