XL 2019 Molette Scroll sur ListBox

gg13

XLDnaute Occasionnel
Bonjour,

Je commence un nouveau projet pour lequel je devrai utiliser des ListBox et ComboBox.
Ces listes seront longues et je voudrais utiliser le scroll de la molette plutôt que les ascenseurs.

Après renseignement sur le site j’ai voulu utiliser ce post :
Mouse Wheel Hook (faire défiler le contenu d'une combobox/listbox avec la roulette)

Je galère depuis 2 jours et malgré plusieurs essais je n’arrive pas à intégrer ces différentes macros, plusieurs messages d’erreurs ….
Je ne comprends pas tout.
Si vous pouvez m’aider un peu je vous remercie d’avance.

Je joins le fichier exemple avec les listBox .

GG13
 

Pièces jointes

  • NBA1.3.xlsm
    37.6 KB · Affichages: 11

Usine à gaz

XLDnaute Barbatruc
J'ai amélioré la réactivité du Scroll pour la rendre totale en réduisant le contrôle d'intervalle d'appels de la LowLevelMouseProc callback function. Maintenant seuls les appels sur un Timer identique sont ignorés.

De plus, j'ai placé en priorité la condition de fermeture de la fenêtre VBE pour le 64Bits que je n'arrive toujours pas à faire avec l'API lorsque l'Accès approuvé au modèle d'objet du projet VBA n'est pas coché. Je suis obligé de le faire en activant la fenêtre VBE et en faisant Alt + F4.
Je vais placer un fichier à l'intention de toute personne souhaitant résoudre ce problème.

Là je pense qu'on approche la formule qui va bien.
Bonjour Dudu2, Bonjour Patrick et les autres lol :)
Dudu2 : ça fonctionne parfait
:)
 

Dudu2

XLDnaute Barbatruc
Voilà, je n'arrive pas à fermer la fenêtre VBE par l'API.
Avec DestroyWindow c'est la cata.
Avec un PostMessage WM_CLOSE, ça ferme tout le classeur Excel si pas modifié.

Dans le code voir:
VB:
    '-------------------------------------------------
    'Sub interne pour fermer la fenêtre VBE avec l'API
    '-------------------------------------------------
Aux as de l'API faisant acte de volontariat d'intervenir sur cette question...

Edit: j'ajoute à l'intention de @patricktoulon, que, quoiqu'il fasse, il faut faut gérer ce Bug Excel 64 Bits et fermer la fenêtre VBE si on veut pas que le Scroll plante Excel.
A moins peut-être de ne pas utiliser l'évènement MouseMove(), ce qui est possible sur les ComboBox seulement pour lesquelles je vais essayer de faire un code spécifique.
 

Pièces jointes

  • Close VBE Window.xlsm
    30.3 KB · Affichages: 2
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
de mon coté je fait des expérience pour étayer mes dires
donc dans mon modele 32 déactive le call back et je fait un CallNextHookEx
donc

voila ma lowlevelmouse avec le callbackbloqué
VB:
Private Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim pos As POINTAPI, obj As Object, r As Range, CtL
    On Error Resume Next
    GetCursorPos pos
    
    If pos.Y < rct2.Top Or pos.Y > rct2.Bottom Or pos.X < rct2.Left Or pos.X > rct2.Right Then
        If TypeName(CtrlHooked.Parent) = "Worksheet" Then
            If TypeName(CtrlHooked) = "ComboBox" Then
                  With ActiveSheet: If .OLEObjects(1).Name <> CtrlHooked.Name Then .OLEObjects(1).Activate Else .OLEObjects(2).Activate
                End With
            End If
        Else
             If Not FenpParent Is Nothing Then If FenpParent.Controls(1).Name <> CtrlHooked.Name Then FenpParent.Controls(1).SetFocus Else FenpParent.Controls(2).SetFocus
        End If
        
        UnHookMouse
        Exit Function
    End If

    If (nCode = HC_ACTION) Then
        If wParam = WM_MOUSEWHEEL Then
            'LowLevelMouseProc = True    'JE BLOQUE LE CALLBACK
            With CtrlHooked
                Select Case TypeName(CtrlHooked)    ' déplace l'ascenseur en fonction de la molette ' l'info est stockée dans lParam
                Case "ListBox", "ComboBox": If GetHookStruct(lParam).mouseData > 0 Then .TopIndex = .TopIndex - 1 Else .TopIndex = .TopIndex + 1
                Case "Frame": If GetHookStruct(lParam).mouseData > 0 Then .ScrollTop = .ScrollTop - 3 Else .ScrollTop = .ScrollTop + 3
                End Select
            End With
        End If
        Exit Function
    End If
    DoEvents
    ' JE FAIT UN NOUVEL APPEL AVEC CALLNEXTHOOKEX
    LowLevelMouseProc = CallNextHookEx(0&, nCode, wParam, ByVal lParam)
    On Error GoTo 0
End Function

en bien résultat j'ai exactement le même problème en tout point qu'avec tes fichier 1 à 8
démonstration avec la combobox
on vois bien que la combo est scroller et la feuille en même temps
demo.gif



et maintenant démo avec ton fichier 8
le résultat il est exactement le meme
demo.gif
 

patricktoulon

XLDnaute Barbatruc
oui je suis a jour autant que l'on puisse l'être
cela dit je ne pense pas que ce soit un problème de ce genre puisque le mien ne me pose pas de problème

une nouvelle et inquiétante qui puis est
une autre expérience
j'ouvre ton fichier 8
je scroll blablabla ça déconne mais ca réagit
je ferme ton fichier (excel fermé)
je rouvre le mien de fichier
et là surprise surprise ça marche plus
mais que se passe t il
j'ai un soupçon
ni une ni 2 je vais dans vbe et je déclenche manuellement la sub unhook
je reviens sur la feuille et hop voila t il pas que ca remarche
je me dis ok un de ces hook ne c'est pas fermé
quelque seconde plus tart allez hop la je n'ai plus de souris dans quoi que ce soit window explorer , internet ou quoi que ce soit d'autre compme application obligé de fermer window brutalement
 

Dudu2

XLDnaute Barbatruc
J'ai remarqué que tu ne traites pas le WM_MOUSEMOVE.
J'ai testé aussi comme ça et ça fonctionne.
Mais le UnHook se fera au prochain WM_MOUSEWHEEL, et je trouve que c'est un peu tard, c'est pour ça que j'ai gardé le traitement du WM_MOUSEMOVE pour UnHooker si la souris sort de la zone.

Après ça n'explique pourquoi chez toi y a tout qui Scroll !
T'as vérifié si les volets de ton salon scrollaient de concert ?
1667398298720.gif
 

Dudu2

XLDnaute Barbatruc
Assez rigolé les Scrollers fous ! 🤣 Revenons, aux choses sérieuses.

J'ai trouvé par hasard sur Internet ici, un appel d'API qui ferme la fenêtre VBE sans faire de dégâts collatéraux comme le DestroyWindow (après on peut plus rien faire car Mémoire insuffisante) ou le SendMessage WM_CLOSE (qui ferme tout Excel).

Les 64Bits, essayez d'ouvrir l'éditeur VBA (Alt + F11) puis positionnez la souris sur un Control sous Scroll, vous verrez, je vais vous le dézinguer vite fait
1667417005617.gif
.

Du coup, je couvre proprement la fermeture du VBE de manière rapide et transparente même si l'accès aux macros n'est pas autorisé. Ceci dit je ne contrôle la présence de la fenêtre VBE que toutes les 3 secondes.
Et là, je vois plus trop ce que je pourrais améliorer.
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox.xlsm
    67.2 KB · Affichages: 6

Gégé-45550

XLDnaute Accro
Assez rigolé les Scrollers fous ! 🤣 Revenons, aux choses sérieuses.

J'ai trouvé par hasard sur Internet ici, un appel d'API qui ferme la fenêtre VBE sans faire de dégâts collatéraux comme le DestroyWindow (après on peut plus rien faire car Mémoire insuffisante) ou le SendMessage WM_CLOSE (qui ferme tout Excel).

Les 64Bits, essayez d'ouvrir l'éditeur VBA (Alt + F11) puis positionnez la souris sur un Control sous Scroll, vous verrez, je vais vous le dézinguer vite fait Regarde la pièce jointe 1154149.

Du coup, je couvre proprement la fermeture du VBE de manière rapide et transparente même si l'accès aux macros n'est pas autorisé. Ceci dit je ne contrôle la présence de la fenêtre VBE que toutes les 3 secondes.
Et là, je vois plus trop ce que je pourrais améliorer.
Bonsoir Dudu2
Testé en 64 bits, le VBE est effectivement "dézingué vite fait".
Par contre, relative mauvaise nouvelle, lorsque l'on déploie la liste de l'ActiveX ComboBox1, pas de problème pour le scroll à la molette mais ... si on déplace le curseur en dehors de la zone de défilement, celle-ci ne se replie pas et scroll de la feuille.
Cela n'arrive pas avec le ListBox.
Bonne soirée
 

Statistiques des forums

Discussions
315 093
Messages
2 116 133
Membres
112 667
dernier inscrit
foyoman