Icône de la ressource

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

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

En fait, je viens de publier la version 15B qui corrige des lacunes de la version 15. Et ça n'est pas simple !
Scroll Up & Down sont maintenant 100% gérés en décalage de ScrollBar.
Le mode mixte est conservé: si on clique au milieu de la TextBox on passe en mode décalage ligne.
Le retour sur la 1ère ou la dernière ligne de la TextBox annule le mode décalage ligne et réactive donc le décalage de ScrollBar.
 
c'est ça et la formule est simple
Essaie de le coder en partant de zéro et tu verras si c'est simple !

Je me suis brulé les neurones sur ce truc qui m'a pris plusieurs heures de mise au point.
Je suis d'abord parti sur des calculs génériques de lignes à décaler avec des Modulo et autres Int() de divisions.
Mais ce n'était pas la bonne approche.
Si tu regardes le code résultant, tu auras sans doute du mal à rentrer dedans.
Pour moi c'est progressivement que je suis arrivé à ce résultat.
 
le truc est simple
nbligne= le height / par le fontsize*1.2(c'est approximatif)
la current ligne visible =curline mod nbligne
parti de la puisque tu a nbligne de sais de combien il faut descendre ou monter selon le sens du scroll avant de scroller
dans mon calcul j'utilise le Int pour avoir que l'entier
 
Pour @abdououbale et toute personne intéressée,

ComboBoxes dynamiques et Scroll selon le Tag.
Le Tag est "SCROLL" pour les ComboBoxes créées avec un indice impair.
Une version un peu plus sophistiquée qui gère tous les Controls Scrollables (**) et, à titre de gadget, ajoute les titres des ComboBoxes dans les ComboBoxes en utilsant cette ressource.

(**) Et plus simple aussi puisque l'appelant (le UserForm) n'a pas à gérer un tableau des instances de classe mais une seule car c'est la classe qui gère la Collection de toutes les instances.
 

Pièces jointes

Cette version a été réalisée sur une idée de @patricktoulon affinée par @jurassic pork.
Le Scroll de cette version s'applique plus spécifiquement aux Controls de UserForm mais gère aussi les Controls ActiveX
(Elle est plus simple, plus légère et plus sécurisante car elle n'utilise pas de "Hooking" aux évènements système)

Le fichier joint contient:
  1. Le Module_ControlScroll à importer dans le projet VBA (pour compatibilité d'appel avec la ressource originale).
  2. La Class_ControlScroll à importer dans le projet VBA (pour la gestion du Scroll).
  3. Une feuille de test contenant des Controls ActiveX.
  4. 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 la plupart des Controls ActiveX et UserForm sans procédure de "hooking" aux évènements système. Cela garantit une meilleure stabilité des macros qui l'utilisent même si la fiabilité des composants de la ressource originale est largement éprouvée.

  • Controls gérés:
    - UserForm
    - Frame
    - MultiPage (sauf sous Windows 7 ?)
    - ListBox ActiveX & UserForm
    - ComboBox ActiveX & UserForm (sauf sous Windows 7 ?)
    - TextBox ActiveX & UserForm
Remarques:
  • La gestion des Controls ActiveX avec la méthode InkCollector est très délicate et nécessite un artifice pour palier le non fonctionnement de l'évènement InkCollector.CursorOutOfRange(). En effet, cet évènement qui devrait se déclencher lorsqu'on sort du Control, ne se déclenche que si le curseur est placé très précisément sur la limite haute ou gauche du Control. Il ne sert donc à rien en l'état.

  • Le Scroll des Controls ActiveX est délicat car des problèmes apparaissent dès lors qu'un Scroll est actif et qu'on interagit avec la feuille qui les héberge. Ces problèmes n'existent pas pour les Controls de UserForm.

  • L'artifice mis en place pour les Controls ActiveX consiste en un "monitoring" de la position du curseur par rapport au RECT du Control qui est fait chaque seconde grâce à un Application.OnTime d'une fonction du Module_ControlScroll.
Mise en œuvre très simple:
  • Placer le Module_ControlScroll et la Class_ControlScroll dans la projet VBA.

  • Ajouter la référence Microsoft Table PC Type Library, version 1.0 dans le 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.
    L'appel est totalement compatible avec la ressource originale.
VB:
'Examples:
'--------
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 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
'
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

Versions:
  • Fichier mis à jour le 08/04/2025 à 14h00
 

Pièces jointes

Dernière édition:
Hello,
OK avec Excel 2016 32 bits Windows 11
OK avec Excel 2021 64 bits Windows 11
Problèmes avec Excel 2007 (vb6) et Excel 2010 Windows 7 SP1 et FM20.dll dernière génération : Pas de scroll pour les ComboBox et le Multipage.
Ami calmant, J.P
 
Bonjour @jurassic pork,
Merci pour cette info. Je n'ai pas les moyens d'investiguer pour Windows 7 et vais faire l'impasse.
C'est toujours le couple ComboBox et MultiPage qui pose problème.
J'ai développé sous Windows 10 Excel 2021 64 bits
 
Dernière édition:
Bonjour @jurassic pork,
Merci pour cette info. Je n'ai pas les moyens d'investiguer pour Windows 7 et vais faire l'impasse.
C'est toujours le couple ComboBox et MultiPage qui pose problème.
Je viens d'essayer en Excel 2007 Windows 10 et cela fonctionne , c'est donc bien windows 7 qui pose problème .
Rappel sur l'utilisation des versions de Windows :
Selon les données les plus récentes disponibles, la part de marché des versions de Windows utilisées sur les ordinateurs est la suivante :
  • Windows 10 détient actuellement 70,03 % des parts de marché
  • Windows 11 continue de décliner et détient 25,65 % des parts de marché
  • Windows 7 représente encore 3,04 % des parts de marché
  • Windows 8.1 détient 0,44 % des parts de marché
 
Bonjour à tous,
Dans la lancée de @jurassic pork , voici mon retour.
  • OK Sous Windows 10 64bits et Office 365 32bits. I7 16Go RAM
    • Testé sous configuration double écran (1920 X 1080) Zoom 100%
  • OK Sous Windows 11 64bits et Office 365 64bits. I7 16Go de RAM
    • Testé sur PC portable Zoom 125%
  • Windows 10 détient actuellement 70,03 % des parts de marché
  • Windows 11 continue de décliner et détient 25,65 % des parts de marché
  • Windows 7 représente encore 3,04 % des parts de marché
  • Windows 8.1 détient 0,44 % des parts de marché
Tout cela devrait encore changer fin 2025 avec l'abandon des mises à jour de Windows 10. Affaire à suivre...
 
Et pourquoi se passer des ListBox et ComboBox ActiveX ?!
Pour la TextBox ActiveX c'est impossible car il n'y a pas de Handle récupérable.
Fichier mis à jour en Post #97.
Dudu2 je me demandais ce que tu entendais par ListBox et Combobox ActiveX -> précise que c'est dans feuille
[EDIT] je viens de vérifier pour le textbox il y a bien un handle mais il faut avoir cliquer dans la textbox avant le mousemove sinon pas de hwnd
 
Dernière édition:
je viens de vérifier pour le textbox il y a bien un handle mais il faut avoir cliquer dans la textbox avant le mousemove sinon pas de hwnd
Oui, il y a un Handle qu'on peut récupérer par WindowFromPoint mais ce n'est pas celui de la TextBox, c'est celui de la fenêtre.
Du moins sur mes tests.
Je vais essayer en cliquant.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour