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

Dudu2

XLDnaute Barbatruc
@Staple1600,
Oui, comme d'hab, j'ai tout vu.
Mais je crois maîtriser ces Declare, je ne me pose pas de questions à ce sujet. Devrais-je ?

@patricktoulon,
Non, tu ne m'as pas perdu, je suis là chapeau pointu.
Alors je vous passe le dernier code qui devrait être compatible 32/64 bits.
En plus, le luxe à portée de souris, je donnes 2 options pour déterminer les RECT:
VB:
'=============
'Secure option
'True : Do NOT refer to WindowFromPoint to get Object RECT
'       For 64 Bits Office could be turned to True in case of problem
'       Not needed in 32 Bits Office (in principle)
'=============
#Const SecureOption = False
'#Const SecureOption = True

L'option Secure calcule les RECT de par les positions traditionnelles, et pour ce qui me concerne, je trouve très précis quand même.

C'est à essayer bien sûr !
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox.xlsm
    68.3 KB · Affichages: 8

patricktoulon

XLDnaute Barbatruc
hollala!! holala!! contrairement a toute tes précédentes version sur 2013 celle ci c'est Out complet
je dis bien sur 2013 32

alors maintenant sur la feuille
on scroll la feuille en même temps que le control
demo.gif


après sur le userform on observe un léger décrochage mais c'est pas bien grave si on va trop vite avec la mollette
demo.gif
 

Staple1600

XLDnaute Barbatruc
[aparté précisionel]
@Dudu2
Je posais juste la question
(car pas de feebback à ce sujet)
Précisions: j'essaie de répondre aux questions qu'on m'adresse nommément
(Et j'espère que la réciproque soit vraie ;) )
Exemple: tu m'as demandé de tester ma version
J'ai répondu dans le message#254
[/aparté précisionel]

Je te teste ton dernier fichier actuellement
 

Dudu2

XLDnaute Barbatruc
Les traces c'est parce que ce n'est pas encore finalisé.
Je vais retester la version 32 bits sur un Laptop. Pourtant j'ai repris le code qui fonctionnait avant.

@patricktoulon, dans ton cas, tu peux essayer avec #Const SecureOption = True

Par contre il y a quelque chose qui ne va pas...
Si on édite le VBA, par exemple en ajoutant n'importe quoi dans un module, et qu'on repart dans les Scrolls sans passer par la case Save, chez moi (Office 2016 64bits) ça part en Crash quand même. La recomplilation dérange Mister Hook.
 

Dudu2

XLDnaute Barbatruc
J'ai compris pourquoi il y a des hésitations parfois dans le Scroll.

C'est que ma fonction MouseIsOverTheBox() retourne False alors que le curseur est bien dans la zone et qu'elle devrait retourner True. Du coup je Unhook et le Control n'est plus Hooké jusqu'au prochain mouvement de souris qui va faire que MouseIsOverTheBox() retournera True.

Alors ça c'est un grand mystère ! Décidément ce n'est pas une simple affaire.
 

patricktoulon

XLDnaute Barbatruc
non c'est normal
l'event move avec le return de x et y a un gros defaut
si tu bouge trop vite le x et ou y te donne zero
en gros il y a une perte de captage de l'event c'est bien connu
et c'est pour ca aussi que des fois quand on bouge trop vite le x ou y donne le dernier x et y capté même si on est en dehors du control

c'est lourd l'event move très lourd

comme on est dans un looping en addressof le prochain movement de souris molette ou move ça repart
c'est tout a fait compréhensible
tu dois commencer à comprendre pourquoi je ne m'en sert pas et me sert du mouseup et inclu en soustraction le height en pixel de la combo je n'ai plus de soucis
au mouse up
si ctrlhooked<> obj blablabla
blablabla api pour child(combo)
lacement du hook(il tournera en boucle en addressof )
dans ce looping on est dedans ou dehors et on fait selon
terminé
pour les listbox ou les frames on peut utilise le move là la fenêtre ne change pas de handle
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
En fait mon code ne fonctionne que par chance, mais c'est un bazar épouvantable avec les WindowFromPoint().
Morailté, je vais tout virer de ce qui relève des ces foutus WindowFromPoint() et n'utiliser que l'option alias "SecureOption" dans le code précédent. Avec ça j'ai la fenêtre sans recourir à l'API. Au moins je maîtrise ce que je fais et c'est bon à 100% chez moi. Ou même 95% dans d'autres configs ça me va.
 

patricktoulon

XLDnaute Barbatruc
ok
et que pense tu de cette approximation (change le ppx pour toi )
ca te donne le rectangle de la combo plus le child
pas d'api et pas besoins même
pour les combo adaptable facilemanet pour le reste

en fait j'ai repris ma sub de placement dans le calendrier tout simplement
VB:
Function getControlRectangleForm(Obj As Object) As RECT
    Dim Lft As Double, Rgt As Double, top As Double, P As Object, PInsWidth As Double, PInsHeight As Double
    Dim K As Double, r As RECT, ppx#
    Lft = Obj.Left: top = Obj.top: Set P = Obj.Parent    ' Normalement Page, Frame ou UserForm
    Do
        PInsWidth = P.InsideWidth: PInsHeight = P.InsideHeight    ' Le Page en est pourvu, mais pas le Multipage.
        If TypeOf P Is MSForms.Page Then Set P = P.Parent    ' Prend le Multipage, car le Page est sans positionnement.
        K = (P.Width - PInsWidth) / 2: Lft = (Lft + P.Left + K): top = (top + P.top + P.Height - K - PInsHeight)
        If Not (TypeOf P Is MSForms.Frame Or TypeOf P Is MSForms.MultiPage) Then Exit Do
        Set P = P.Parent
    Loop
    ppx = (4 / 3) '(4/3)*1.25'pour dudu2
    With ActiveWindow.Panes(1)
    r.Left = .PointsToScreenPixelsX(Lft) - .PointsToScreenPixelsX(0)
    r.top = .PointsToScreenPixelsY(top) - .PointsToScreenPixelsY(0)
    r.Right = (r.Left + (.PointsToScreenPixelsX(Obj.Width) - .PointsToScreenPixelsX(0)))
    r.Bottom = (r.top + (.PointsToScreenPixelsY(Obj.Height) - .PointsToScreenPixelsY(0)))
    r.Bottom = r.Bottom + (((Obj.ListRows + 1.5) * Obj.Font.Size) *ppx)
    End With
    getControlRectangleForm = r
End Function

bien sur il faut quand même déclarer un type rect
 

Dudu2

XLDnaute Barbatruc
Alors voilà, le résultat est parfait en terme de Scroll et je suis sûr que cette méthode de récupération des zones de Scroll marche partout et n'expose à aucun risque.

MAIS ! Pas de bol ! Il suffit de faire une modif n'importe où dans le code du projet VBA sans fermer le classeur pour qu'au prochain Scroll un peu rapide dans un Control quelconque (ActiveX ou UserForm) Excel se crash. Du moins sur ma config.

Par exemple sur ListBox1:
1667248819317.png

Et là les amis, je ne sais pas quoi faire et ça met en échec tout le boulot pour Scroller.

Je joins le fichier qui marche mais qui marche pas !
1667249034388.gif
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox.xlsm
    70.6 KB · Affichages: 5

Membres actuellement en ligne

Statistiques des forums

Discussions
315 097
Messages
2 116 186
Membres
112 679
dernier inscrit
Yupanki