Icône de la ressource

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

Le fichier à télécharger contient:
  1. Le Module_ScrollListComboTextBoxes à importer dans le projet VBA.
  2. Un UserForms de test contenant des ComboBoxes, des ListBoxes et des TextBoxes.
  3. Une feuille de test contenant une ComboBox, une ListBox et une TextBox ActiveX.
Les principales caractéristiques:
  • Permet le Scroll vertical avec la molette de la souris dans les Controls ComboBox, ListBox et TextBox ActiveX et UserForm
Mise en œuvre très simple:
  • Placer le Module_ScrollListComboTextBoxes dans la projet VBA.

  • Dans le code de la feuille ou du UserForm, sur l'évènement ComboBox_MouseMove() ou ListBox_MouseMove() ou TextBox_MouseMove(), appeler la fonction ControlScroll() avec le nom du Control.

  • Restriction: le Scroll vertical dans une ListBox ActiveX d'un volet non #1 (volets #2 à #4 d'une fenêtre fractionnée) n'est pas géré.
VB:
'-------------------------------------
'The Scroll is managed through:
'- 1 single event ComboBox_MouseMove()
'              or ListBox_MouseMove()
'              or TextBox_MouseMove()
'
'- 1 single function ControlScroll(<Object to Scroll>)
'   Argument:
'   - Me.ComboBox or Me.ListBox or Me.TextBox Object on which to trigger the Scroll.
'   - Not present means stop the Scroll on the currently Scrolled Object, if any.
'-------------------------------------
'
'Example:
'-------
'Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'    Call ControlScroll(Me.ComboBox1)
'End Sub
'
'Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'    Call ControlScroll(Me.ListBox1)
'End Sub
'
'Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'    Call ControlScroll(Me.TextBox1)
'End Sub

Remarques:
  • Avec Office 64Bits, le compilateur VBA génère une improbable erreur (Variable objet ou variable de bloc With non définie) lorsqu'un Control est scrollé et que la fenêtre VBE (l'éditeur VBA) est ouverte !
    C'est pourquoi, dans ce cas, si la souris "survole" un Control sous Scroll, la fenêtre VBE sera fermée automatiquement par le code VBA.

  • En raison d'un autre Bug Excel, le mécanisme de Scroll n'est pas activable sur les ListBoxes ActiveX sur les volets #2 à #4 d'une fenêtre fractionnée. Nativement (sans Scroll), les ascenseurs ne sont pas opérationnels sur ces volets sauf à modifier le Zoom ou Scroller manuellement les volets pour "réveiller" Excel. Le mécanisme de Scroll est victime des mêmes symptômes et subit en plus de graves conséquences (erreur #50290) en cas de Scroll dans ces ListBoxes.

  • Attention ! Ce mécanisme de Scroll vient avec un petit inconvénient.
    Lorsqu'une erreur Excel se produit alors que le Scroll est actif, c'est à dire que la souris "survole" un Control sous Scroll, il arrive souvent que Excel se ferme brutalement sans autre formalité !
    Il est donc recommandé de sauvegarder régulièrement ses fichiers avant les tests ou de désactiver le mécanisme de Scroll le temps de la mise au point du code.
Versions:
  • V1 - Initiale
  • V2 - Tiens compte du Bug Excel sur ListBoxes ActiveX sur les volets #2 à #4 (voir commentaire dans le code).
  • V3 - Détermination très précise des fenêtres des Controls avec l'API WindowFromPoint grâce à une trouvaille de @patricktoulon concernant l'identification des fenêtres DropDown des ComboBoxes.
  • V4 - Ajout du Scroll en TextBox.
  • V5 - La fermeture de la fenêtre de l'Éditeur VBE nécessite de replacer la fénêtre du UserForm au 1er plan.
  • V6 - Modification de la détermination des RECT des ListBoxes et ComboBoxes faites avec les API Windows WindowFromPoint() & GetWindowRect() qui parfois ne donnent pas le résultat escompté (RECT du UserForm au lieu de celui de la ListBox), au profit d'une boucle simple de recherche de position du Control dans le UserForm ou de l'exploitation des coordonnées du Control ActiveX.
    Gestion du cas de UserForm minimisé par le menu système ajouté avec cette ressource par exemple pour arrêter le Scroll.
  • V7 - Ajout de précaution d'une boucle d'attente de l'activation effective de la fenêtre sur SetForegroundWindow().
  • V8 - Identifie un UserForm sans Caption qui ne peut être minimisé car pas de menu système.
  • V9 - Supprime le Scroll quand le UserForm Parent n'existe plus et revient sur la détermination du RECT des ComboBoxes qui ne peut être trouvé pour sa partie DorpDown que par les API Windows.
  • V10 - Correction de la correction de la V5 qui n'a pas été correctement codée / testée !
  • V11 - Ajoute le paramètre optionnel ScrollStep (défaut = 3) et l'applique aussi aux TextBoxes

Scroll1.gif


Scroll2.gif

Derniers avis

Merci pour toutes ces bonnes informations qui fonctionnent au top !
Un code vraiment complexe - Du sur mesure !!!

Une question supplémentaire:
Comment faire si la TetxBox a une scrollbar verticale pour faire défiler la scrollbar plutôt que de faire descendre le curseur ?
Merci de votre aide :-)