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

Dudu2

XLDnaute Barbatruc
Ben écoute, le changement de parent, ça marche au 1er appel et ensuite ça crash complet sur l'appel de la fonction publique.

De toutes façons, le SetForegroundWindow marche bien. Il faut le protéger des ESCAPE.

En plus, dans la fonction publique de l'Usf2 qui fait l'Usf2.Show (dans l'activate de l'Usf2 c'est trop tard) on peut savoir si le Handle appelant est celui de l'Application.Hwnd ou pas. De sorte qu'on sait si c'est un appel de 1er niveau (Excel Window) ou d'un autre niveau (UserForm). Ça n'a pas d'utilité directe.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour
je vois pas le problème pour le userform appelant
avec la fonction publique tu le transmet a l'instance de l'userform lui même c'est tout après tu connais l'appelant partout dans le userform
tu peux même déterminer les 2 handles avant le show du 2

je crains fort que tu n'ai bien assimilé ce qu'est un handle

et c'est pas étonnant vu les exemples d'explication que l'on trouve sur le net

en français handle est souvent traduit comme "poignée"

et donc certains utilisateurs non avertis le prennent pour argent comptant et estiment que la poignée est accessible uniquement quand l'userform est affiché

il n'en est rien en fait

un handle c'est l'adresse mémoire de l'userform

a partir du moment ou il est "loadé" et je dis bien loadé( pas affiché avec show ) et bien le handle est accessible

et le load se fait a partir du moment ou une fonction du module userform est utiliseé

c'est vrai que la fonction load n'est pas implémenté dans VBA c'est pas fait pour aider

démonstration dans le fichier joint
 

Pièces jointes

  • usrform appelant.xlsm
    18.5 KB · Affichages: 7
Dernière édition:

Dudu2

XLDnaute Barbatruc
je crains fort que tu n'ai bien assimilé ce qu'est un handle
J'ai passé 20 ans dans l'informatique, au début sur des Mainframes IBM, ensuite sur de Mini-ordinateurs de toutes sortes, puis sur Unix autant du coté système que du coté applicatif, avant de quitter la technique pour aller vers du "Marketing" toujours en lien avec l'informatique dans une entreprise internationale.
Dans ma jeunesse, j'ai dû coder des centaines de milliers de lignes, peut-être des millions, en Assembleur, Fortran, Cobol, PL1, C (surtout) , C++ et d'autres langages divers. J'ai écrit des outils de gestion de fichier, un moniteur transactionnel sur Unix et des tonnes d'applications plus ou moins complexes en lien avec des serveurs divers en utilisant toutes sortes de protocoles d'interface.

Alors, @patricktoulon, si ton affirmation est vraie à propos de mon incompréhesion de ce qu'est un Handle, il faudra que je suive un stage de reconversion d’œnologie ou de yoga. Mais avant tout, tu ne devrais pas prendre l'hypothèse que les gens sont des ignorants.
 

Dudu2

XLDnaute Barbatruc
et le load se fait a partir du moment ou une fonction du module userform est utiliseé
Pas seulement, le Load se fait à partir du moment où une simple propriété est référencée.
UserForm1.Visible -> ça le load et la fonction UserForm_Initialize est exécutée.
UserForm1.Width -> idem
If Obj Is UserForm1 -> idem
Unload UserForm1 -> idem s'il n'est pas Loadé !

c'est vrai que la fonction load n'est pas implémenté dans VBA
Ah bon ? T'as jamais essayé Load UserForm1 ?

Mais bon, j'ai ptet pas bien compris
1666774502661.gif
 

Dudu2

XLDnaute Barbatruc
Bonjour la liste,

Pour revenir au sujet d'origine, j'ai exploité l'API GetFocus() indiqué par @patricktoulon pour faire du Scroll en ListBox UserForm plus synthétique en code. A noter que ce GetFocus ne peut pas fonctionner pour un Control ActiveX, mais c'est pas grave, on n'est pas des amateurs
1666857997554.gif
, on sait gérer.

Voici donc en avant-première
1666857500345.gif
du Festival du Scroll, un fichier dont je vais faire une ressource où la simplicité le dispute à l'efficacité (soyons modestes !).

Exemple de Scroll en ListBox:
VB:
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call ListBoxScroll(Me.ListBox1)
End Sub

Exemple de Scroll en ComboBox:
VB:
Private Sub ComboBox1_DropButtonClick()
    Call ComboBoxScroll(Me.ComboBox1)
End Sub

Mais comment peut-on faire plus simple ? Je vous le demande !
1666857898147.gif
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox.xlsm
    63.2 KB · Affichages: 6
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour @Dudu2
je te propose ma version
tout se fait dans la procédure en addressof
a pour effet de libérer toute autre action avec la souris dans le fichier et aussi la réponse est immédiate
car la procédure détecte non seulement la molette mais aussi le déplacement de la souris

seule le userform demo combobox utilise le rectangle du userform
visiblement le fait de développer et undevelopper la combo perturbe la détermination du rectangle control
et visible c'est le handle du userform qui est pris par le getfocus

donc au pire débloquer le unhook au mosemove du userform
dans tout les cas quand on sort du userform le hook s'arrête
 

Pièces jointes

  • molette souris pour listebox2 et frame combobox sur userform ou feuille excel V 3.0 patrick...xlsm
    74.1 KB · Affichages: 8

patricktoulon

XLDnaute Barbatruc
sans doute un problème de déclaration 64 d'api je n'ai plus 2016 je ne peux tester
pour la variable i ben déclare là

@Dudu2 me vient une idée finalement
rangefrompoint pourait tres bien faire office de contrôle absolu de sécurité
puisqu'il retourne par son typename range ou un oleobject ou nothing
donc dans la partie on userform on pourrait ajouter
if typename(rangefrompoint(pos.x,pos.y)="Range" then unhook 'cest pour le cas ou le userform serait affiché dessus une feuille
 

Dudu2

XLDnaute Barbatruc
@patricktoulon,
Dans ta méthode tu as le problème du UnHook. Et c'est un GROS problème ! En tous cas, ça oblige à gérer toutes les situations où il est nécessaire.

Dans ma méthode, et je l'ai déjà dit, je n'ai pas ce problème. Pourquoi ?
Parce que j'ai adapté les fonctions de Hook (venues d'Internet, je saurais pas faire ça) pour y ajouter, lors du Move de la souris (If wParam = WM_MOUSEMOVE Then), le test de présence ou pas du curseur dans le RECT de la ListBox pour savoir si on continue ou pas le Scroll.

Alors j'ai quand même sécurisé un UnHook sur le UserForm_QueryClose(), mais je vais regarder pour m'en passer car dans ce cas le Control Hooké part en erreur si le UserForm n'est plus là et ça doit pouvoir se récupérer facilement.
 

Dudu2

XLDnaute Barbatruc
Voilà, c'est fait !
Il faut reprendre le fichier du post #55.
Même plus besoin, pour un UserForm, de gérer le UnHook dans le QueryClose.

Que ce soit pour une ListBox ou une ComboBox, on appelle une seule fonction à 1 seule endroit:
- Évènement ListBox_MouseMove() pour la ListBox
- Évènement ComboBox_Click() pour la ComboBox

Elle est pas belle la vie du développeur passionné de Scroll ?
 

Statistiques des forums

Discussions
312 380
Messages
2 087 792
Membres
103 664
dernier inscrit
wolvi71