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

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    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 sénior 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
    Points : 31 877
    Points
    31 877
    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
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    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 éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    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
    Responsable Access

    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
    Points : 14 524
    Points
    14 524
    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
    Responsable Access

    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
    Points : 14 524
    Points
    14 524
    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

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    Par défaut Bonjour Arkham46, le forum,
    Je n'arrive pas à faire fonctionner les deux bouts de code donnés même en lisant le tutoriel.

    "accole.dll" est installé par défaut. Ca ne fonctionne pas.
    J'ai installé la version "accesibility" proposé (lien mort). Le programme d'installation me dit que c'est déjà installé pour winXP.

    J'ai installé la dernière version pour Win7. Pareil.

    Rien à faire j'ai toujours des problèmes.

    En voici un sous Excel 2007 :
    membre de méthode ou de données introuvable.
    avec arrêt sur ".accHitTest".



    "accHitTest" est absent de la liste des propriétés/évènements du membre "ListBox" et "ListBoxes".

    Quelle est mon erreur ?

  8. #8
    Responsable Access

    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
    Points : 14 524
    Points
    14 524
    Par défaut
    Citation Envoyé par ESVBA Voir le message
    Rien à faire j'ai toujours des problèmes.

    En voici un sous Excel 2007 :

    avec arrêt sur ".accHitTest".

    tu passes bien par un objet IAccessible comme dans mon code juste au dessus?
    (pour que IAccessible soit reconnu, il y a une référence à ajouter "Microsoft Office XX Object Library")

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    Par défaut bonsoir Arkham46, le forum,
    il y a des fois...

    J'ai refait un fichier excel et ça fonctionne avec les deux codes sous 2007 !
    (Microsoft Office 12 Object Library est coché par défaut, j'ai vérifié avec les fichiers antérieurs).

    Pourquoi alors ? Aucune raison. J'étais aussi parti d'un fichier vide.

    Enfin, ca fonctionne très très bien. Pose du .

    Merci Arkham46.

    ESVBA

+ 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