Icône de la ressource

VBA - Vertical Scroll en ComboBox, ListBox et TextBox (ActiveX en Feuille et en UserForm) V11

Alain 79

XLDnaute Junior
Supporter XLD
Bonsoir Dudu2,
Je suis vraiment désolé car je dois abandonner l'utilisation de ta solution, pourtant très intéressante, pour naviguer dans une combo box.
Mais je rencontre trop souvent le problème décrit dans mon message n° 14 du 13 novembre.
Par moment tout fonctionne bien et d'un seul coup ça bloque avec le message d'erreur.
Dommage
 

Dudu2

XLDnaute Barbatruc
Bonsoir @Alain 79,
Je comprends. Je pensais bien que cela allait se reproduire. Quant à en identifier la cause...
Je peux te proposer une solution spéciale ComboBoxes (pas applicable aux ListBoxes) qui serait peut-être moins fragile. Elle ne se base pas sur les évènements MouseMove().
Je vais essayer de la mettre au propre et te l'envoyer.
 

Dudu2

XLDnaute Barbatruc
Voilà essaie le Module_ComboBoxScroll.
Je ne garantis pas du tout que tu n'auras pas le même problème car si ça se passe dans le Scroll lui-même ça ne changera rien. Et c'est un peu ce que je crains.

La différence est que le Scroll est lancé sur l'évènement ComboBox_DropButtonClick() qui a l'énorme avantage de se déclencher TOUJOURS lors de l'expansion de la ComboBox et lors de sa rétractation, de sorte qu'on est sûr de quelle ComboBox Scroller et quand.

Il y a un inconvénient mineur, c'est que lorsqu'on Scroll une ComboBox, tant qu'un clic n'importe où dans Excel ou ailleurs n'est pas intervenu, le Scroll de la ComboBox continue même si le curseur en est sorti.

Essaie et dis-moi si ça change quelque chose pour toi.
 

Pièces jointes

  • VBA Scroll Souris en ComboBox.xlsm
    50.2 KB · Affichages: 10

Usine à gaz

XLDnaute Barbatruc
Voilà essaie le Module_ComboBoxScroll.
Je ne garantis pas du tout que tu n'auras pas le même problème car si ça se passe dans le Scroll lui-même ça ne changera rien. Et c'est un peu ce que je crains.

La différence est que le Scroll est lancé sur l'évènement ComboBox_DropButtonClick() qui a l'énorme avantage de se déclencher TOUJOURS lors de l'expansion de la ComboBox et lors de sa rétractation, de sorte qu'on est sûr de quelle ComboBox Scroller et quand.

Il y a un inconvénient mineur, c'est que lorsqu'on Scroll une ComboBox, tant qu'un clic n'importe où dans Excel ou ailleurs n'est pas intervenu, le Scroll de la ComboBox continue même si le curseur en est sorti.

Essaie et dis-moi si ça change quelque chose pour toi.
Bsr Dudu2, le fil :)
ça fonctionne chez moi
:)
 

Dudu2

XLDnaute Barbatruc
@Toubabou,

J'ai ajouté le Scroll en TextBox.
Les TextBoxes ne se comportent pas de la même manière que les ListBoxes et ComboBoxes.

Déjà pour retrouver leurs positions l'API WindowFromPoint ne marche pas.
Pas de souci, on sait faire autrement avec une grande précision.

Ensuite, pour pouvoir y Scroller, il faut les activer ce qui n'est possible que si on active aussi leur Parent (Worksheet ou UserForm). Pas de souci, on sait faire aussi.

Elles ont quand même une spécificité que je n'ai pas réussi à contrer.
A leur toute première activation par Mouse Over:
- au tout premier Mouse Over dans la session du classeur pour une TextBox ActiveX de Worksheet,
- au tout premier Mouse Over dans la session du UserForm pour une TextBox ActiveX de UserForm,
la TextBox décide de faire un auto-Scroll maximum et d'afficher la fin du texte.

Je te donne le fichier à tester / vérifier et si c'est bon je le publierai.
Edit: Fichier publié en ressouce sous la version V4.
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
@Toubabou,

J'ai ajouté le Scroll en TextBox.
Les TextBoxes ne se comportent pas de la même manière que les ListBoxes et ComboBoxes.

Déjà pour retrouver leurs positions l'API WindowFromPoint ne marche pas.
Pas de souci, on sait faire autrement avec une grande précision.

Ensuite, pour pouvoir y Scroller, il faut les activer ce qui n'est possible que si on active aussi leur Parent (Worksheet ou UserForm). Pas de souci, on sait faire aussi.

Elles ont quand même une spécificité que je n'ai pas réussi à contrer.
A leur toute première activation par Mouse Over:
- au tout premier Mouse Over dans la session du classeur pour une TextBox ActiveX de Worksheet,
- au tout premier Mouse Over dans la session du UserForm pour une TextBox ActiveX de UserForm,
la TextBox décide de faire un auto-Scroll maximum et d'afficher la fin du texte.

Pour une TextBox ActiveX de Worksheet on ne peut guère l'activer qu'en y posant d'abord la souris puis en cliquant, donc cela n'est pas évitable.
Pour une TextBox ActiveX de UserForm, on peut aussi l'activer avec la tabulation si c'est prévu, dans ce cas un Mouse Over n'aura pas cet effet.

Je te donne le fichier à tester / vérifier et si c'est bon je le publierai.
Testé et approuvé lol
Encore un beau travail :)
Pas d'ascenseur pour le TextBox1 : c'est normal Docteur ? :)
:)
 

Dudu2

XLDnaute Barbatruc
Pas d'ascenseur pour le TextBox1 : c'est normal Docteur ?
Il y a une propriété TextBox.ScrollBars que l'utilisateur est libre de définir ou pas.
Je l'ai forcée pour essayer mais ça n'apporte rien en terme de gestion du Scroll car si ListBox et ComboBox on une propriété .TopIndex, ce n'est pas le cas de la TextBox et j'ai donc du jouer sur le TextBox.CurLine pour faire évoluer les lignes.
 

Toubabou

XLDnaute Impliqué
@Toubabou,

J'ai ajouté le Scroll en TextBox.
Les TextBoxes ne se comportent pas de la même manière que les ListBoxes et ComboBoxes.

Déjà pour retrouver leurs positions l'API WindowFromPoint ne marche pas.
Pas de souci, on sait faire autrement avec une grande précision.

Ensuite, pour pouvoir y Scroller, il faut les activer ce qui n'est possible que si on active aussi leur Parent (Worksheet ou UserForm). Pas de souci, on sait faire aussi.

Elles ont quand même une spécificité que je n'ai pas réussi à contrer.
A leur toute première activation par Mouse Over:
- au tout premier Mouse Over dans la session du classeur pour une TextBox ActiveX de Worksheet,
- au tout premier Mouse Over dans la session du UserForm pour une TextBox ActiveX de UserForm,
la TextBox décide de faire un auto-Scroll maximum et d'afficher la fin du texte.

Pour une TextBox ActiveX de Worksheet on ne peut guère l'activer qu'en y posant d'abord la souris puis en cliquant, donc cela n'est pas évitable.
Pour une TextBox ActiveX de UserForm, on peut aussi l'activer avec la tabulation si c'est prévu, dans ce cas un Mouse Over n'aura pas cet effet.

Je te donne le fichier à tester / vérifier et si c'est bon je le publierai.
Bonsoir Dudu2
Je viens de voir ton fichier, de le tester et encore une fois super travail. Il fonctionne super bien.
Je vais l'adapter à mon fichier
Merci encore
 

Dudu2

XLDnaute Barbatruc
Bonsoir @Toubabou,
Ok, dommage qu'il ne fonctionne pas pour @Alain 79 avec ces plantages aléatoires.
J'ai changé quelques petites choses (TypeName = au lieu de TypeOf Is) car je crois me souvenir que le TypeOf m'avait planté une fois. Mais la probabilité que ça règle son problème est minime.

Tu as remarqué cette histoire d'auto-Scroll en bas de la TextBox la toute première fois ?
Ce n'est pas très gênant mais ça peut surprendre les utilisateurs. Je ne peux rien y faire car je n'ai rien qui m'indique que la TextBox est dans l'état qui provoque ce phénomène.
 

Dudu2

XLDnaute Barbatruc
Tu as remarqué cette histoire d'auto-Scroll en bas de la TextBox la toute première fois ?
En fait ce comportement est celui qu'Excel a défini en standard pour ses TextBoxes.
Si on clique dans une TextBox sans Scroll pour la toute première fois de la session de son Parent (Worksheet ou UserForm), la fin du texte s'y place automatiquement.
Je n'ai trouvé aucune propriété reflétant la situation initiale provoquant ce phénomène.

Mais s'il fallait le contrer, ce serait tout à fait possible en maintenant une liste de type {Handle Parent + Nom TextBox} à nettoyer de temps en temps.

Le principe de la table:
- Sur un ControlScroll(), si le couple Handle Parent + Nom TextBox n'est pas dans la table, on force le TextBox.CurLine = 1 et on ajoute le couple dans la table.
- Sur un UnHook, 10 minutes au moins après le dernier nettoyage, avec n'importe quelle API (ex. IsWindowVisible) faire référence sous On Error au Handle Parent pour savoir s'il est encore vivant, et s'il ne l'est plus, retirer de la table tous les couples liés à ce Handle.
 
Dernière édition:

Toubabou

XLDnaute Impliqué
Par contre lorsque je transpose ton code dans mon fichier, je reçois le message d'erreur suivant:
1669231408586.png

Puis:
1669231450852.png

La TextBox s'ouvre bien a son début mais il n'est pas possible de scroller
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 139
Membres
112 669
dernier inscrit
Guigui2502