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...
je vais faire des tests complémentaires cela doit dépendre de l'O.S et de la version d'Excel.
En tout cas quelque chose qui fonctionne sur mon Excel 2021 Windows 11 :
VB:
Function HasSb(ByVal ListBox) As Boolean
    Dim IAListBox As IAccessible
    Dim c As New CUIAutomation, UIA_elem As IUIAutomationElement, rectLB As tagRECT
    If ListBox.ListCount = 0 Then Exit Function
    Set IAListBox = ListBox
    Set UIA_elem = c.ElementFromIAccessible(IAListBox, 0)
    rectLB = UIA_elem.CurrentBoundingRectangle
    HasSb = IAListBox.accHitTest(rectLB.Right - 5, rectLB.Top + 5)
    HasSb = Not HasSb
End Function
ben chez moi non
demo1.gif

ca dit toujours oui
 
@Dudu2
VB:
 Set IAcObj = Lb
     AccessibleObjectFromPoint pz.Dt, cc, v
    HasScrollbarVX = v = 0
Code:
     Set IAListBox = ListBox
    Ret = IAListBox.accHitTest(Pt.X, Pt.Y)
c'est la même chose les deux testent si présence child aux points X et Y
c'est peut être plus simple et plus comprehensible avec acchitest et les points x et y sans conversion (currency) en effet
 
@jurassic pork, tu utilises UIAutomation alors que tu as dis toi-même en Post #40:
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.
Dans le Post #75, je n'utilise pas UIAutomation pour trouver les coordonnées de la ListBox.
C'est ce fichier que @patricktoulon devrait tester.
 
@jurassic pork, tu utilises UIAutomation alors que tu as dis toi-même en Post #40:

Dans le Post #75, je n'utilise pas UIAutomation pour trouver les coordonnées de la ListBox.
C'est ce fichier que @patricktoulon devrait tester.
Effectivement c'est le retour des dimensions du UIAElement qui ne fonctionne pas avec Windows 7 mais normalement cela devrait fonctionner pour les windows > 8 pour avoir du 100% UIAutomation
 
Ok, mais dans certaines situations, INEXPLICABLES (selon la taille de la ListBox), ça ne fonctionne pas.
- Ni ma solution:-> le WindowFromAccessibleObject() rend le Handle du Parent (donc les X, Y sont faux)
- Ni la solution de @jurassic pork -> le HitTest ne rend pas la bonne valeur (alors que les X, Y sont corrects selon la position curseur)

La UserForm1.ListBox2 n'a pas de ScrollBar et pourtant les 2 méthodes disent qu'elle en a une !
Cliquer sur le bouton pour le tester directement.

Edit: le pire c'est qu'il suffit d'enregistrer à nouveau le classeur pour que ça fonctionne.
Ou d'entrer en édition sur le UserForm pour que ça ne fonctionne plus à nouveau.


1745235730693.png
 

Pièces jointes

Dernière édition:
Ok, mais dans certaines situations, INEXPLICABLES (selon la taille de la ListBox), ça ne fonctionne pas.
- Ni ma solution:-> le WindowFromAccessibleObject() rend le Handle du Parent (donc les X, Y sont faux)
- Ni la solution de @jurassic pork -> le HitTest ne rend pas la bonne valeur (alors que les X, Y sont corrects selon la position curseur)

La UserForm1.ListBox2 n'a pas de ScrollBar et pourtant les 2 méthodes disent qu'elle en a une !
Cliquer sur le bouton pour le tester directement.
déjà répondu post #77 (même constat )
 
Trouvé la solution...Enfin je pense !
Dans TOUS les cas, quelle que soit la méthode, il faut faire un .SetFocus préalable sur la ListBox pour les USerForms.
Et probablement un .Activate pour les ActiveX.
VB:
    'Mandatory to avoid a potential wrong result
    If TypeOf ListBox.Parent Is Worksheet Then
        ListBox.Activate
    Else
        ListBox.SetFocus
    End If
 
Dernière édition:
En conséquence j'ai modifié le fichier du Post #75 qui fait un HitTest mais sans UIAutomation en incluant cette fois le petit code ci-dessus.

Edit:
@Dudu2 je l'ai testé ton fichier déjà
ca fonctionne et je t'ai dis en post #78 que les deux méthodes faisaient le même chose
Oui mais avec le HitTest on se débarrasse de cette fonction AccessibleObjectFromPoint() dont je ne maîtrise pas bien les déclarations en VBA7 et non-VBA7 et peut-être en Win64 et non-Win64 (le Currency ne me plait guère) ni même l'utilisation. On ne trouve pas d'exemple de déclaration complète de cette fonction sur Internet.
 
Dernière édition:
En conséquence j'ai modifié le fichier du Post #75 qui fait un HitTest mais sans UIAutomation en incluant cette fois le petit code ci-dessus.
La propriété SpécialEffect a l'air aussi davoir de l'influence sur la précision du HitTest. Mettre cette propriété à fmSpecialEffectFlat pour le maximum de précision. Avec ta modif du post #89 c'est OK pour le classeur du post #87
 
Dernière édition:
- 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