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: 9

patricktoulon

XLDnaute Barbatruc
Bonjour @Dudu2
je viens de télécharger la ressource donc fichier dudu2 (11)
c'est vraiment pas pour t'ennuyer mais je t'assure que ça ne fonctionne pas
j'ai ajouté une feuille figé avec deux listbox
alors en effet comme sur mon modele quand on scroll et que le listbox fou le camp et revien là le scroll se met a fonctionner
mais si on veux passer a l'autre c'est fini

pour être honnête j'ai déjà trouvé quelques éléments de réponses en faisant des tests sur mon modèle
je me suis apercu de certaines petites chose
c'est pas net encore et un peu bancale encore selon moi
demo.gif

et c'est bien le fichier de ta resource
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox(11).xlsm
    71 KB · Affichages: 0

patricktoulon

XLDnaute Barbatruc
re
je viens de tester ton 12 eme fichier post#390
et oui mais elles sont sur la même panes
et le problème et le même que ce fractionné(+figé ou pas)
et je te rassure c'est le même problème avec ma version
ce n'est pas une question de rectangle dans nos deux versions ils sont bien déterminés
ce n'est visiblement pas non plus une question de panes active ou pas (j'ai testé) en activant la panes du controls avant
et comme ca bloquait moi la premiere chose que je fait c'est
je bloque VBA et le debloque tout de suite apres
et ben ca repart
1667742336570.png



regarde bien ce que je fait
et quand je retourne sur l'autre il y a un deraillement et hop je rescroll a l'envers pour faire revenir le control et hop ca remarche mais la 1en panes(2) ne remarche plus
demo.gif
 

patricktoulon

XLDnaute Barbatruc
maintenant je te montre avec mon modèle brouillon 3
mais comme la combobox ne réagi pas pareil ca scintille au move dans la partie haute dans le child ça scintille plus
mais bon c'est bancale encore
demo.gif


l'astuce c'est quoi
ben des que la sub hookmouse est appelée
1°je fait un ctrl.activate
2°ben des que je quitte le rectangle je défige et re fige

donc partie 1
VB:
Public Sub HookMouseX(ByVal CtrL As Object, Optional ByVal FenParent As Object = Nothing)
    Dim pos As POINTAPI
    If Not FenParent Is Nothing Then Set USFForm = FenParent
    If Not CtrlHooked Is Nothing Then If CtrlHooked.Name <> CtrL.Name Then UnHookMouse
    If plHooking < 1 Then
        Set CtrlHooked = CtrL
        If Not FenParent Is Nothing Then
            rct2 = getControlRectangleForM(CtrL)
        Else
            rct2 = getControlRectangleWorksheet(CtrL)
        CtrL.Activate '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        End If
        plHooking = SetWindowsHookExA(WH_MOUSE_LL, AddressOf LowLevelMouseProc, 0, 0)
    End If
End Sub

et pour quand je quitte le rectangle donc au unhook
VB:
Public Sub UnHookMouse()
' désactive le hook s'il existe
derefige
    If plHooking <> 0 Then UnhookWindowsHookEx plHooking: plHooking = 0:  Set CtrlHooked = Nothing
End Sub
et la sub derefige
VB:
Sub derefige()
    Application.ScreenUpdating = False
    If TypeName(CtrlHooked) = "ComboBox" Then Exit Sub
    With ActiveWindow
        X = .SplitRow
        Y = .SplitColumn
        frz = .FreezePanes
        .FreezePanes = False
        DoEvents
        If X > 0 Or Y > 0 Then
            .SplitRow = X
            .SplitColumn = Y
            .FreezePanes = frz
        End If
    End With
    Application.ScreenUpdating = True
End Sub

je te l'accorde c'est bancale mais ça fonctionne
 

Dudu2

XLDnaute Barbatruc
Alors effectivement, avec les Panes, les ListBoxes ActiveX ont de gros problèmes !
Ces problèmes ne se manifestent pas avec la ComboBoxes.

Dans ma config (2016 64 bits) nativement (Sans Scroll) une ListBox qui n'est pas en Pane #1, a son ascenseur qui n'est pas fonctionnel, quelque soit le Pane actif. Pour le rendre fonctionnel, il faut d'abord scroller le Pane ou modifier le Zoom !!!
Gros bug Excel !

Avec le Scroll, évidemment, on souffre de ce problème car pour une ListBox qui n'est pas en Pane #1, l'évènement MouseMouve() ne se déclenche pas ! Jusqu'à ce qu'on ait Scrollé son Pane ou modifier le Zoom.

Alors on pourrait dire, qu'il ne faut pas être plus royaliste que le roi. Mais en prime (et ça ça fait suer !), si je ferme (menu système) et enregistre le classeur après avoir Scrollé une ListBox non Pane #1, ça se plante parfois (sans que j'ai indentifié la cause) sur une instruction qui n'a rien à voir.
1667758923341.png


Dans ma configuration, un Ctrl.Activate ne sert à rien parce que aucun code n'est exécuté, l'évènement MouseMouve() n'étant pas déclenché. Donc je n'ai pas la main.

Moralité, tu as bien trouvé un beau Bug Excel !
Et celui-là est impossible à contourner (évènement MouseMouve() ne se déclenche pas) sauf à gérer un système de Scrolls programmés sur les Panes 2 à 4 si ils contiennent des ListBoxes à l'activation de la feuille.

Mais je ne le ferai pas car ce n'est pas un Bug du Scroll. La seule chose que je vais faire c'est tenter d'empêcher le plantage erreur# 50290.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
comme je travaille dans mon modèle a l'inverse du tiens, le mien pré et post first hook j'ai pu résoudre le problème
je travaille à éliminer ce petit sursaut en empêchant le screenupdating mais avec les api
le screenupdating d'Excel n'est pas suffisant
sinon ça tourne tout du moins sur les figés les fractionnés non figés pas encore
personne n’était aller aussi loin que nous sur le rollupdown de la souris sur les controls scrollable
il va de soit que je continue a travailler sur combo , listbox , frame
demo.gif
 

Dudu2

XLDnaute Barbatruc
Ok, j'ai pas bien compris comment tu peux intervenir sur le Scroll alors qu'on n'a pas la main vu que l'évènement MouseMouve() n'est pas déclenché sur une ListBox en Pane #2 à #4.

De toutes façons, quand bien même on peut activer le Scroll en ListBox après Scroll du Pane ou modification du Zoom, je n'ai pas réussi à empêcher cette foutue erreur 50290 aléatoire en fermeture / enregistrement du classeur après avoir Scrollé une ListBox en Pane #2 à #4. Alors dans la V2 du fichier en Ressource, j'ai purement et simplement ignoré cette situation. Le Scroll ListBox ActiveX ne fonctionnera que sur le volet #1.
 

patricktoulon

XLDnaute Barbatruc
Ok, j'ai pas bien compris comment tu peux intervenir sur le Scroll alors qu'on n'a pas la main vu que l'évènement MouseMouve() n'est pas déclenché sur une ListBox en Pane #2 à #4.
tu a pris parti de tout régler dans le looping
moi j'ai pris parti de régler ça au hookmouse(avant le set windowhookex et au unhookmouse
c'est ton montage qui est handicapant pour palier a plein d'erreur
c'est d'ailleurs pour ça que tu en gérais quelque une
ces erreur là elle ne se déclenchent pas chez moi et d'ailleurs elle ne peuvent pas

1°parce que dans mon modèle ,controlhooked ne peut en aucun cas être nothing dans lowlevelmouseproc
chez toi des fois oui ( ce qui cause des pseudo latence )puisque quelque ratés et récupération par un callnexthook

2° je ne fait pas le calcul rectangle a chaque tour comme toi avec ton over truc (ce qui cause des latences )je le fait au hookmouse et je test seulement les 4 cotés dans la proc

3° séparer en fonction réutilisable comme tu le fait c'est bien mais pas trop dans ce contexte
car tu crée encore des latence alors que la lowlevelmouseproc elle elle tourne a 1000 tours seconde

4° une fonction en adressof ne subie pas les latence vba puisqu'elle est executé comme si c'est une fonction dans une dll c'est ce qui permet de faire autre chose en même temps(libérer vba ) donc si tout le reste ne suit pas il y a des blancs
donc moins de code il y a, et moins de passerelles il y a ,mieux c'est et surtout pour le hooking de la souris

demain j’essaierais d'adapter sur le tiens
ça va pas être triste par ce que tu n'a pas fait simple quoi que la version 10 (l'avant dernière ) a vachement fait du régime

une dernière chose
ta fonction objectpane est loin de résoudre les problème de capture dynamique de position
et je crois que c'est elle qui crée le plus de latence je sais pas j'ai pas étudier à fond
la capture dynamique de position pane d'un object(surtout sur multi panes ) tiens en 3 lignes
c'est propre net et clair et la réponse est immédiate

en fait c'est bien ta façon d’enchaîner les fonctions et subfonctions qui crée des latences
et parfois même elle rendent difficile l'identification du problème

je te dis ça pas pour te faire C... toi aussi tu a travaillé des heures dessus

tiens je te donne mon objectpane a moi c'est simple c'est extrait de ma fonction rectangle
VB:
Function objectpane()
'extrait de la fonction getControlRectangleWorksheet
GetCursorPos psX ' le curseur se promene on capte ses point X et Y
    panIndex = 1 'on considere le pane1 par defaut  au départ
     With ActiveWindow
        'si le point x > que le left de la panes(2) alors panindex= 2
        If .Panes.Count >= 2 Then If psX.X > .Panes(2).PointsToScreenPixelsX(.Panes(2).VisibleRange.Left) Then panIndex = 2
        'la dessus on va ajouter
        'si il y  plus de 2 panes alors
        'si le point y plus grand que le pane(3).top alors panindex=panindex+2
        If .Panes.Count > 2 Then If psX.Y > .Panes(3).PointsToScreenPixelsY(.Panes(3).VisibleRange.Top) Then panIndex = panIndex + 2
         End With
End Function
'c'est simple comme un bonjour et c'est dynamique  puisque lancé lors du move de la souris avant plhooking dans hookmouse
2 conditions qui te donnent la pane dynamiquement
conclusion
les cas possibles retournés

cas N°1
si les deux conditions ne sont pas remplies alors c'est 1

cas N°2
condition1 remplie + condition2 non rempli alors c'est 2(ca veux dire que l'on a 1 ou x lignes figé

cas N° 3
condition 1 n'est pas rempli + condition2 remplie alors c'est 3(ca veux dire que l'on a des lignes et colonnes figées )

cas N°4
condition1 remplie + condition2 remplie aussi alors c'est 4 pareil ligne et colonnes figées

je pense pas que l'on peut faire plus simple
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Pour "activer" ces ListBoxes en Panes #2 à #4 voilà ce qu'il faudrait faire (voir Module Workbook).

Par contre je n'ai pas réussi à trouver quelque chose qui empêche l'erreur 50290 de se produire quand:
- Scroll dans ListBox Pane #2
- Cliquer fermer le classeur sur la croix du menu système
- Choisir Enregistrer
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox - Test Panes.xlsm
    95.6 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
re

Bonjour @Dudu2
mes soupcons que j'avais sont confirmé à 100%
dans ton modèle en fait tu n'arrête pas le hook même après être sorti depuis longtemps du moindre control
là maintenant j'en ai la preuve
il suffisait de faire une action dans le unhookmouse pour s'en rendre compte

je m'en suis rendu compte
car j'ai mis ma fonction (astuce pour débloquer le problème )de pane au unhookmouse comme je te l'ai dis hier

et voilà ce qui se passe
ça fonctionne mais regarde ce qui se passe quand je suis en dehors des controls et que je continue a bouger la souris
comme tu peux le voir les sursauts je continue à les avoir même dans les cellules

demo.gif



et là je te montre avec le mode création activé (donc vba arrêté)que ta lowlevelmouseproc continue à tourner

comme ca ca te montre aussi ce que je t'ai dis précédemment
a savoir que cette fonction en addressof est libérée de VBA elle tourne toute seule
là on vois bien que en passant sur les controls ça n'agit plus mais la unhookmouse est relancée indéfiniment
demo.gif


ton erreur vient de là
 

Dudu2

XLDnaute Barbatruc
Je ne sais pas sur quoi tu tu bases pour affirmer tout ça. On repart dans des délires et des discussions sans fin. Et je ne joue plus à ce jeu là.

Le problème des ListBoxes en Panes #2 à #4 je l'ai parfaitement cerné je n'ai pas besoin d'autres infos sinon pour éviter l'erreur 50290 (voir mon Post #398). Ce serait une vraie valeur ajoutée que tu trouves quelque chose là-dessus.

mes soupcons que j'avais sont confirmé à 100%
dans ton modèle en fait tu n'arrête pas le hook même après être sorti depuis longtemps du moindre control
  1. Et d'un si je n'arrêtais pas le Hook alors le Scroll du Control continuerait quand la souris en sort.
  2. Et de deux, j'ai mis des traces pour te démontrer que le UnHook est fait.
    (Les traces facilement utilisables avec la fonction TraceOnSheet() incluse dans le code.)
    Trace.gif
Mais bon, j'ai plus envie de répondre à ces démontages en règle du code que j'ai fait, démontages complètement à coté de la plaque.
Si tu as quelque chose à démontrer, poste ton fichier et je regarderai comment ça fonctionne.
 

patricktoulon

XLDnaute Barbatruc
oui je viens d'enlever ma fonction de defigage (pour débloquer les panes)et s'a s’arrête
donc on a un problème de fenêtre maîtresse je sais pas comment tu t y prends pour déterminer ça
je te démonte pas je veux simplement que l'on y arrive toi avec ta méthode moi avec la mienne c'est tout
maintenant si ca te fait C..... je n'interviens plus y a pas de soucis reste comme ca

je te dis qu'une seule chose
tel que c'est monté les prochaines étapes au niveau des panes seront inextricables
un cercle sans fin

je regrette de ne pas être en 64 pour tester la mienne et faire les corrections nécessaires
 

Dudu2

XLDnaute Barbatruc
J'ai expliqué en Post #394 le problème des ListBoxes ActiveX en Panes #2 à #4.
J'ai placé un fichier en Post #398 qui sait contourner ce problème sur la base des explications fournies.

MAIS HÉLAS ! Je n'ai pas réussi à empêcher la très étrange erreur 50290 qui se produit un peu n'importe où dans le code (si je mets des traces, c'est dans la fonction de traces, sinon c'est dans la fonction GetListBoxActiveXRECT()).

Cette erreur qui se produit où elle veut montre bien qu'il y a quelque chose de pourri au royaume des ListBoxes Panes #2 à #4. C'est la raison pour laquelle dans la V2 de la ressource, j'ai choisi de ne pas les traiter pour éviter 1) le contournement ridicule du Post #398 et 2) le plantage en 50290. Dommage mais y a pas d'autre solution.
 

patricktoulon

XLDnaute Barbatruc
bon j'ai réussi a le mettre dans ton fichier version 11
visiblement dans le 10 il y avait des belugues
démonstration
plus de problème de panes mais uniquement sur figés pas sur fractionné
et les sursauts se voient moins dans ton fichier mais c'est normal ca fait toujour cet effet avec des fichier 2016 sur mon 2013 le graphique est plus précis
je te met ca au propre il y a un tout petit soucis avec les combo encore car toi tu prends le rectangle de la child moi j'inclue la combo dans le rectangle
demo.gif
 

Dudu2

XLDnaute Barbatruc
maintenant si ca te fait C..... je n'interviens plus y a pas de soucis reste comme c
Interviens quand tu veux, mais utilise ton code et un fichier pour démontrer ce qu'il y a à démontrer au lieu de passer ton temps à critiquer le plus souvent à tors tel ou tel point dans mon code. Si tu sais ce qu'il faut faire, alors fais-le, envoie le fichier et basta.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bon voila
la sub s'appelle releasepane elle permet de libérer les listbox dans les partie figées
la fonction defige et enleve le splitrow et splitcoloumn et le remet immediatement
comme c'etait
elle sont donc accessible des l'event mouse en passant dessus
par contre ta gestion de fenêtre cause des soucis avec les combo
c'est a dire le scroll fonctionne mais des que l'on sort de la combo et que qu'on sélectionne une cellule c'est une fenêtre autre quelconque ouverte derrier excel qui se met au first plan et ça bloque tout
j'ai tout essayé thisworkbook.activate etc.... rien n'y fait

en tout cas ca fonctionne mon astuce
il faut seulement le faire une fois avant bien sur ( dans le sheet activate par exemple)
apres c'est le unhookmouse qui la lance a chaque sortie de controls et réactive donc tout les autres


ma sub utilise 2 api
je n'arrive pas à déterminer la quelle est la plus efficace pour un lock screenupdating
l'api lockwindowupdate et l'api sendmessage
c'est pour éliminer le petit sursaut quand je defige et re fige

attention j'ai toujours ton erreur à la fermeture (je pense savoir pourquoi)
1667814624501.png

ton fichier 11 joint
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox(11).xlsm
    77.9 KB · Affichages: 5

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 117
dernier inscrit
augustin.morille