Icône de la ressource

VBA - Scroll en Controls ActiveX & UserForm (ListBox, ComboBox, TextBox, UserForm, Frame, MultiPage) 16C

Pour un Scroll des Controls de UserForm préférez la version indiquée dans le Post #97 de la discussion.


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

  • Dans le code de la feuille ou du UserForm, sur l'évènement <Control>_MouseMove() appeler la fonction ControlScroll() avec le nom du Control.
VB:
'-------------------------------------
'The Scroll is managed through:
'- 1 single Event <Control>_MouseMove()
'- 1 single Function ControlScroll(<Control>)
'-------------------------------------
'
'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
'
'Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'    Call ControlScroll(Me)
'End Sub
'
'Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'   Call ControlScroll(Me.Frame1)
'End Sub
'
'Private Sub MultiPage1_MouseMove(ByVal Index As Long, ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'    Call ControlScroll(Me.MultiPage1)
'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.

  • Attention ! Ce mécanisme de Scroll basé sur du "hooking" 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
  • V12 - Ajoute les déclarations pour Office 32 bits.
  • V13 - Retour sur les API classiques pour la conversion PointToPixel pour compatibilité Window 7 qui ne connait pas l'API GetDpiForWindow().
    Correction d'un bug sur les TextBox ActiveX lors d'un survol rapide pour inhiber le Scroll Down automatique d'Excel à la 1ère activation de la TextBox lorsque la valorisation du TextBox.CurLine = 0 n'a pas eu le temps de se faire lorsque la TextBox avait le Focus.
  • V14 - Tente de protéger la fonction LowLevelMouseProc() de la touche Escape d'interruption du code.
  • V13 - Fallback V14
  • V14 - Amélioration du code et ajout des Controls UserForm, Frame & MultiPage.
  • V14B - Correction d'une déclaration API pour Excel non VBA7 et mise sous #Win64 de la fonction CloseVBEWindow().
  • V15 - Modification du Scroll en TextBox avec Vertical Scroll Bar pour décaler la Scroll Bar en première et dernière page.
  • V15B - Amélioration de la V15 pour les retours en sens inverse.
  • V16 - Change une déclaration API pour Office 2013 32 bits.
  • V16B - Amélioration de la fermeture de la fenêtre VBE.
  • V16C - Amélioration de la fermeture de la fenêtre VBE.

Scroll.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 :-)
Retour