XL 2021 VBA - Est-ce que la ListBox a une Scroll Barre Verticale ?

  • 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 !

Dudu2

XLDnaute Barbatruc
Bonjour,

Comment déterminer, à part avec une approximation pas forcément juste sur la Font.Size comme dans l'exemple joint, si une ListBox as une Scroll Barre Verticale ?
 

Pièces jointes

Solution
Hello,
finalement il existe peut-être une solution simple qui fonctionne partout. Après différents essais de code dans un autre forum, le magicien Jafaar Tribak m'a montré que ma solution V4 ne fonctionnait pas dans tous les cas (à cause du focus qui en plus ralentit) et il m'a sorti un code qui utilise que du IAccessible. Ce genre de solution , je l'avais déjà envisagé suite à la contribution de Rheeem mais voilà cela ne fonctionnait pas sous Windows 7, accLocation retournait des coordonnées nulles. Mais Jafaar Tribak procède autrement : il fait accLocation sur le premier élément de la ListBox et là ça fonctionne accLocation récupère bien les coordonnées du premier élément de la listbox sous windows 7...
En effet mais pour généraliser ActiveX & UserForm le RECT est plus simple.
Après il faut ajuster les décalages qui d'ailleurs sont dépendants du Zoom (ActiveWindow et UserForm).
Les problèmes de récupération de couleur différente ne sont pas liés au RECT car les décalages sont constants.
Il me semble que le problème ne se pose pas si on fait un DoEvents après GetDC(0). En tous cas c'est le résultats de mes nombreux tests.

Edit: Ça reste quand même délicat car les décalages peuvent ne pas être généralisables.
 

Pièces jointes

Dernière édition:
La FontSize, j'ai essayé des dizaines de fois avec un facteur simple différent ou des facteurs composés genre
VB:
TotalHeight = .FontSize * .ListRows _
             + .FontSize * (.ListRows - 1) * 0.2 _
             + .FontSize * 2 * 0.16
mais si ça peut marcher pour 1 FontSize, ça n'est pas généralisable car des différences apparaissent.
 
Jusque là, les seules méthodes fiables sont celles qui challengent directement la ScrollBar:
- Méthode Couleur (cependant à vérifier que ça fonctionne sur toutes les configs à cause des décalages en dur dans le code, avec le risque minime que la couleur de fond de la ListBox soit la même que la couleur de la Scroll Bar)
- Méthode Sélection un plus "élaborée" mais sûre à 100% sur toutes les config.
 
Et la solution avec UIAutomation est pas fiable ?
Elle est fiable si on n'est pas dans cette situation si j'ai bien compris. Donc non, elle n'est pas fiable à 100%.
1745152595802.png
 
Quand tu fais:
VB:
 If rectC.Bottom = 0 Or (rectC.Bottom + 4 > rectL.Bottom) Then
Je suppose que le + 4 c'est pour inclure le cas de la ListBox2 ?
Pourquoi spécialement + 4 ? Quels risques sur des autres cas ?
oui c'est cela : aucun risque dans les autres cas car si il y a des éléments non visibles dans la liste rectC.Bottom est à 0
4 c'est après des essais mais je n'ai pas fait tous les cas (par exemple quand on change le facteur d'échelle). Il faudrait un programme qui
change la hauteur de la listebox autour du cas de la ListeBox2 ( 5 pixels en plus, 5 pixels en moins) et comparer à la méthode des couleurs.
 
re
donc en effet si la méthode UI auto.. n'est pas fiable dans le cas ou il y a scrollbar sans course
ma méthode topindex fait aussi bien alors sauf que c'est 3/4 lignes de code a la porté de n'importe qui à comprendre

le #31 fonctionne bien visiblement (pas testé scrollbar sans course )

pour info
la uiautomation ne renvoie pas le boudingrectangle pour les listboxs sur feuille
 
Dernière édition:
pour info
la uiautomation ne renvoie pas le boudingrectangle pour les listboxs sur feuille
Je confirme ce que dit patrick, uiautomation ne fonctionne pas partout. Tout à l'heure j'ai dit que cela fonctionnait avec Excel 2007 sous windows 7 mais je n'avais pas testé avec le bon classeur. Les boundings rectangles ne sont pas bons.
Finalement ce n'est pas la solution plus fiable suivant la version de l'O.S et d'Excel, se rabattre sur les autres solutions.
 
Merci, j'ai mis à jour le Post Solution.
Je n'ai pas mentionné la méthode par couleur car même si elle devrait bien fonctionner, elle est plus fragile avec ses décalages de curseurs et il faudrait pouvoir la vérifier sur différentes configs.
 
Je vous dit quand même d'où est né ce besoin de savoir s'il y a ou pas une Vertical Scroll Bar en ListBox.
En fait il s'agit de cette ressource: Ajouter des Titres à une ListBox ou ComboBox.

Avec les ListBox, la dernière colonne héberge à la fois les données et la Vertical Scroll Bar ce qui peut être gênant pour le dimensionnement des colonnes et pour des données numériques cadrées à droite avec un .TextAlign = fmTextAlignRight.
Avec les ComboBox, la dernière colonne héberge à la fois les données et le DropDow Button ce qui peut être gênant pour les mêmes raisons, notamment lorsqu'on gère avec cette ressource un Affichage de toutes les colonnes de la ComboBox.

Pour la gestion des titres, la ressource créé de manière transparente une colonne dédiée à la Vertical Scroll Bar d'une ListBox si elle est présente, d'où ce sujet.
 
Dernière édition:
"Les coordonnée de la ListBox peuvent être trouvées de différentes façons:"

C'est la fonction accLocation de l'IAccessible de la listbox placée dans un classeur qui renvoie rien donc impossible d'appeler accHitTest de IAccessible pour faire le test,, Pour contourner ce problème il est possible d'utiliser AccessibleObjectFromPoint ,avec un principe simple: récupérer IAccessible dans le point haut doit si le scrollbar est présent AccessibleObjectFromPoint renvoie le bouton Up sinon c'est l'élément TopIndex qui est renvoyé ,, j'avais déjà expliqué ca ...

Lb.png
 
@Rheeem,
Oui tu l'avais déjà expliqué. Et on avait compris le français de l'explication.
Mais si tu l'expliquais en VBA ce serait certainement plus productif.

Admettons que tu aies les X et Y de la position du bouton Up du Scroll.
C'est quoi le code qui suit ?
 
- 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

Réponses
16
Affichages
953
Réponses
2
Affichages
248
  • Question Question
Microsoft 365 affichage userform
Réponses
4
Affichages
361
Retour