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...
Pour AccessibleObjectFromPoint() je pense qu'il faut procéder comme pour WindowFromPoint().
Hypothèse que cet exemple semble confirmer (?)

Code:
#If VBA7 Then
    #If Win64 Then
        Private Declare PtrSafe Function AccessibleObjectFromPoint Lib "Oleacc" (ByVal arg1 As LongPtr, ppacc As IAccessible, pvarChild As Variant) As Long
        Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
    #Else
        Private Declare PtrSafe Function AccessibleObjectFromPoint Lib "Oleacc" (ByVal lX As Long, ByVal lY As Long, ppacc As IAccessible, pvarChild As Variant) As Long
    #End If
#Else
    Private Declare Function AccessibleObjectFromPoint Lib "Oleacc" (ByVal lX As Long, ByVal lY As Long, ppacc As IAccessible, pvarChild As Variant) As Long
#End If

Private Type POINTAPI
    X As Long
    Y As Long
End Type

#If Win64 Then
    ' Copies a POINTAPI into a LongLong.  For an API requiring a ByVal POINTAPI parameter,
    ' this LongLong can be passed in instead.  Example API's include WindowFromPoint,
    ' ChildWindowFromPoint, ChildWindowFromPointEx, DragDetect, and MenuItemFromPoint.
    Function PointToLongLong(Point As POINTAPI) As LongLong
        Dim ll As LongLong
        Dim cbLongLong As LongPtr
     
        cbLongLong = LenB(ll)
     
        ' make sure the contents will fit
        If LenB(Point) = cbLongLong Then
            CopyMemory ll, Point, cbLongLong
        End If
     
        PointToLongLong = ll
    End Function
#End If

'----------------------------------------
'Utilisation de AccessibleObjectFromPoint
'----------------------------------------
Sub a()
    Dim Pt As POINTAPI
    Dim IA As IAccessible
    Dim V As Variant
 
    GetCursorPos Pt
 
    #If Win64 Then
        lResult = AccessibleObjectFromPoint(PointToLongLong(Pt), IA, V)
    #Else
        lResult = AccessibleObjectFromPoint(Pt.X, Pt.Y, IA, V)
    #End If
End Sub
 
@jurassic pork ,
La propriété SpécialEffect m'a l'air d'avoir pas mal d'influence sur la précision du HitTest. Quand je met cette propriété de ta ListBox2 de ton formulaire à fmSpecialEffectFlat dans le classeur de ton Post #87 cela fonctionne
Cela doit avoir un effet, mais je pense que ce n'est pas directement la cause.
Si tu agrandis la ListBox, ça va marcher aussi.

Dans le code du Post #87, ajoute juste un ListBox.SetFocus dans ton code et tu verras la différence.
Puis tu le retires pour vérifier qu'il est bien la cause de la différence.

Je crois que c'est un cas assez marginal pour des raisons inexplicables, mais le SetFocus / Activate le couvre.
 
J'ai fait la modification du SetFocus / Activate dans mon classeur voici ce que cela donne :

TestListBoxSB.gif
 

Pièces jointes

Dernière édition:
Mon classeur ne fonctionne pas avec Excel 2013 sous windows 10 , mais après investigation c'est le fichier FM20.dll (le fichier des activeX MsForm) qui est en cause. Si je mets un FM20.DLL récent (et pas celui du Excel 2013) cela fonctionne . Et même chose pour Excel 2007 sous Windows 10. Donc en conclusion mon classeur fonctionne sur les versions Excel à partir de 2016 et avec Windows > 8

Dudu2 ne t'avance pas trop sur les versions d'Excel et les O.S sur lesquels marchent tes classeurs du post #38 sans que quelqu'un ne les ait testés.
Mon classeur fonctionne sous Excel 2016 Windows 11 , Excel 2019 Window 10 et sous Excel 2021 64 bits Windows 11
Ton autre classeur semble fonctionner partout ( tester avec Excel 2007 sous windows 7 , Excel 2013 sous Windows 10 avec FM20.dll Excel 2013)
Par contre avec Excel 2007 il y a une erreur sur ton Msg.Box S , je l'ai remplacé par un MsgBox S
 
Dernière édition:
Regarde la pièce jointe 1216809
pour le 1er fichier et ci-dessous pour le second fichier (il ne se passe rien)


Regarde la pièce jointe 1216810
Pour le premier fichier c'est bien le fichier du post #38 avec IAccessible dans le titre parce que moi je n'ai pas le code que l'on voit dans ton animation. Il faut faire la modification Msg.Box S --> MsgBox S
Pour le deuxième c'est normal les résultats sont mis dans les cellules C4,C5,C6 et E5,E6 . Il faut effacer le contenu de ces cellules avant de faire le test . Mais comme on le voit tous les résultats sont à vrai pour les ListBox de la feuille alors que celui de la ListBox3 devrait être à faux
[EDIT] j'ai bien le code --> Il faut virer le formulaire Msg qui ne fonctionne pas sous windows 7
 
Je serais bien intéressé à avoir de l'info sur cette erreur qui n'est pas supposée se produire.

Ben justement, @cathodique l'a probablement rencontrée:

Regarde la pièce jointe 1216811
Ce qui voudrait dire que sous Windows 7 ActiveWindow.hwnd n'existe pas !?
C'est excel 2010 qui ne connaît pas la propriéte hwnd pour Application.ActiveWindow je viens de vérifier
Ton formulaire n'est pas trop utile dans le test que l'on fait, un msgbox suffit
 
Ton formulaire n'est pas trop utile dans le test que l'on fait un msgbox suffit
Je l'ai utilisé d'une part parce que la police de MsgBox est trop petite pour moi et d'autre part pour ne pas avoir le message en plein sur les ListBox pour vérifier visuellement.

C'est excel 2010 qui ne connaît pas la propriéte hwnd pour Application.ActiveWindow je viens de vérifier
Merci pour cette vérif. Je vais utiliser une API.
 
- 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
950
Réponses
2
Affichages
247
  • Question Question
Microsoft 365 affichage userform
Réponses
4
Affichages
361
Retour