XL 2013 VBA Scroll en ListBox (dans un UserForm)

Dudu2

XLDnaute Barbatruc
Bonjour,

Je chercher un code qui marche pour scroller une ListBox dans un UserForm avec la molette de la souris.
Sur Internet il y a plein d'exemples inspirés du code de Peter Thornton mais il y a toujours un truc qui coince à l'exécution.

Quelqu'un aurait-il une version opérationnelle en 32 bits ? en 64 bits ?

Cordialement,
D.
 

Dudu2

XLDnaute Barbatruc
Bon, j'ai trouvé quelque chose qui n'est pas bidon avec des références manquantes, des variables non déclarées, bref un truc bien fait, et c'est ici que je l'ai trouvé:
 

Dudu2

XLDnaute Barbatruc
Merci JM27.
Ton fichier est le même que celui cité dans le lien plus haut.
Cette solution solution fonctionne mais elle a malgré tout un défaut:
il faut d'abord cliquer dans la ListBox pour que le scroll soit opérationnel.
J'ai essayé différente choses sans succès.
 

patricktoulon

XLDnaute Barbatruc
bonjour
perso j'utilise ce modèle depuis longtemps
pas besoins de sélectionné pour que ça marche
oserais-je quand même dire qu'un listview fait cela nativement
 

Pièces jointes

  • molette souris pour listebox dans userform api .xlsm
    21 KB · Affichages: 138

patricktoulon

XLDnaute Barbatruc
re
pour une combo et avoir le dropdown auto

VB:
Dim dpdown As Boolean
Private Sub ComboBox1_Enter()
 Call HookMouse(Me.ComboBox1, eUSERFORM, Me.Name)
End Sub

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
dpdown = False
UnHookMouse
End Sub

Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call HookMouse(ComboBox1, eSHEET)
End Sub

Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Not dpdown Then ComboBox1.DropDown: ComboBox1.SetFocus: dpdown = True
End Sub
 

Dudu2

XLDnaute Barbatruc
Un petit détail...
Dans une liste de 25 items, quand on Scroll tout en bas, et qu'on Scroll tout en haut, le Scroll s'arrête au 2ème item de la liste. Le 1e n'est visible qu'en revenant avec l'ascenseur.

J'ai introduit une petite correction avec l'instruction:
If .TopIndex < 3 Then .TopIndex = 0 Else .TopIndex = .TopIndex - 3
VB:
            With CtrlHooked
                ' déplace l'ascenseur en fonction de la molette
                ' l'info est stockée dans lParam
                If GetHookStruct(lParam).mouseData > 0 Then
                    If .TopIndex < 3 Then .TopIndex = 0 Else .TopIndex = .TopIndex - 3
                Else
                    .TopIndex = .TopIndex + 3
                End If
            End With
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir dudu2

perso je pense que devoir ajuster une position par vba après hook de la souris est une preuve flagrante d'un défaut de conception si c'est moi je prends ce code et le fou a la poubelle

le hooking doit juste servir a strictement t'apporter le bouton 3 de la souris qui est la molette et rien de plus si c'est pas le cas c'est de la daube surtout que la on parle de hooker la souris et une seule erreur te pourri la vie et pas que dans excel
bref jette moi çà tu n'en est peut être pas conscient mais le hooking peut être très dangereux quand on le maîtrise pas
pardonnez ma franchise ;)
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 104
dernier inscrit
JEMADA