XL 2016 Quelle API pour savoir si une ListBox (UserForm ou ActiveX) a sa ScrollBar Verticale présente ?

Dudu2

XLDnaute Barbatruc
Bonjour les XLDNautes,

Si on peut, sans API, savoir si une ComboBox a son ascenseur affiché grâce à la différence (ComboBox.ListCount - ComboBox.ListRows) ce n'est pas possible avec les ListBoxes.
Certes on connaît son ListBox.TopIndex mais il n'existe pas de ListBox.BottomIndex.
Un approximation est possible avec la ListBox.Font.Size mais ça reste imprécis.

Reste l'API qui pourrait indiquer la présence d'une Vertical ScrollBar mais mes essais sont restés infructueux.
Merci pour toute suggestion.
 
Solution
pour ce qui est de cette discussion j'ai revue la chose pour les ListBox dans userform et feuille

Dudu2

XLDnaute Barbatruc
Quand je fais ça:
VB:
X = .PointsToScreenPixelsX(Range(TargetCell).Left + Range(TargetCell).Width / 2)
Et que le curseur va bien au centre, j'ai utilisé le Width sans lui appliquer un quelconque zoom, non ?

Si tu t'intéresses à la Width Pixel tenant compte du Zoom, tu as 2 manières de l'obtenir:

- Avec le PointsToScreenPixelsX sans utiliser le Zoom
Code:
.PointsToScreenPixelsX(Range(TargetCell).Left + Range(TargetCell).Width) - .PointsToScreenPixelsX(Range(TargetCell).Left)

- Avec la conversion traditionnelle API qui effectivement doit tenir compte du zoom
Code:
PointsToPixelsX(Range(TargetCell).Width) * (ActiveWindow.Zoom / 100)
 

Dudu2

XLDnaute Barbatruc
Mais je sais d'où viennent tes calculs...

Je me souviens que pour calculer le PixelToPoint tu utilisais une méthode avec ce PointsToScreenPixelsX(0) et on avait vu que si ça marchait chez toi, chez moi c'était le chaos des valeurs avec les variations du Zoom, d'où la conclusion que pour PixelToPoint l'API c'était beaucoup plus sûr.

Ensuite tu as construit sur cette mauvaise hypothèse les combinaisons auxquelles tu arrives maintenant.
 

patricktoulon

XLDnaute Barbatruc
tu a vu que ma methode fonctionne dans la capture non ?
si chez toi c'est le chaos c'est que tu n'a pas les bondriveres graphique chez moi en zdpi 100 ou 120 je n'ai que des résultat exacts et ce n'est pas une question de version d'excel
après tu fait comme tu veux mais j'ai cru comprendre que le projet etait le calcul du rect sans api
si tu reviens avec le devicecap alors tout ca ne te sert a rien puisque nous savons faire fonctionner le windowfrompoint en 64 avec le getwindow rect

sincèrement il faut se décider quelle méthode tu veux employer
api or not api???

moi j'ai fait une version hook full api(la 7) et une version aucune api (la 5 et la 6)mais je mélange pas les deux
après des fois quand je te lis
j'ai l impression que l'on parle pas du même zoom
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Pour moi la question ne se pose même plus -> PointsToPixels via l'API, comme ça pas de doute.
S'il faut se poser des questions sur les drivers de la carte graphique qui ne seraient pas bons (aucune notification de m.a.j. ne m'est parvenue et je n'ai aucun problème d'affichage), alors on n'a pas fini.

De plus pourquoi utiliser des manips qui ne fonctionnent pas partout plutôt qu'un truc béton comme l'API ?
Juste pour éviter les déclarations et faire la course à la ligne VBA comme si on était imposé sur la hauteur du code qu'il faudrait zipper au maximum pour éviter de payer ?
 

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
Oui, et encore merci pour ce truc sur les Pages et MultiPages, l'un qui n'accepte pas les .Left / .Top, l'autre qui n'accepte pas les .Width / .Height ou les .Inside, bref, une salade qu'il faut assaisonner.

En fait je l'avais déjà assaisonnée dans la ressource "position objet sur objet" mais la sauce n'était pas aussi équilibrée que par ton calcul. Maintenant c'est super précis en UserForm.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Dudu2

et aujourd'hui je découvre encore un bug mais cette fois ci c'est dans vba

et il est selon moi bien plus grave

je met dans un userform une listbox de 108 de large par 114 de haut

  1. je teste avec ma superfonction sans api le rectangle en pixel
  2. je teste aussi avec l'api getwindorect
resultat
1668346401911.png


je me dis super je suis bon

je regarde d'un peu plus près
je me dit bon sang!! je vais faire le calcule avec la calculette
809-665= 144 donc de large
et
352-205= 147 donc de haut

maintenant je fait (chez toi bien sur ce sera ((4/3)*1.25)

108*(4/3)=143,9999999999996
je me dis c'est une broutille a + de 10 chiffre après la virgule
et combien même vba arrondi de toute façon

et ensuite je fait

114*(4/3)= 152
donc là déjà on est plus bon, on a donc 5 pixel de plus que ce que donne mes deux fonctions

ca me titille et je me dis je vais faire un teste simple un msgbox avec le width et le height

MsgBox " en point : " & ListBox1.width & " X " & ListBox1.height

et bien surprise les dimensions ne sont pas les même que dans VBE
1668347135700.png


et si je fait les calculs a la calculette avec ces données je suis bon

mais la différence en elle même n'est pas le pire
152-147 font 5 pixels
si je fait 5/(4/3) j'obtiens 3.75
110.5+3.75=114.25 autrement je tombe légèrement plus grand

alors je me pose une question simple mais néanmoins majeure
si les dimensions ne sont pas les mêmes que dans VBE
le quelles je dois prendre dans mon calcul pour avoir le vrai rectangle ?
et puisque getwindowrect me donne le même résultat est il lui aussi faux


bref amis du jour bonjour
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ce que je ne vois pas dans tes screenshots, ce sont les valeurs de la fenêtre VBE.

J'ai vérifié chez moi et ça concorde. La Width et la Height en Pixels convertis en Points (x par 0.6 chez moi, x par 0.75 chez toi) donnent bien les dimensions des propriétés de la ListBox dans VBE.

1668349395093.png
 

Dudu2

XLDnaute Barbatruc
Ok, c'est curieux. Tu as 3,75 points qui sont manquants. Ça fait beaucoup quand même !
Pour tester, faudrait que je trouve le moyen d'installer Excel 2013 dans une sandbox sur mon PC , mais je sais pas trop si c'est possible. Je vais voir...
 

patricktoulon

XLDnaute Barbatruc
non cherche pas il me manque rien la fonction sans api donne la même chose que getwindowrect sur le handle de la listbox
ça vient tout simplement de la DWM c'est tout puisque je suis sous thème aéro W7

tu peux installer 2 version d'excel sans problème tu choisi un autre chemin que programe quand il te le demande
après installation de 2013 tu clique droite sur un fichier exel et tu choisi 2013 sans cocher "toujour utiliser ...."

comme ça ils continueront a s'ouvrir avec ta version actuelle mais au clic droit "ouvrir avec" tu aura les deux dans la fenêtre
pas besoins de part virtuel ;)
 

patricktoulon

XLDnaute Barbatruc
demo.gif
j'ai sorti l'artellerie lourde pour voir
a savoir mon userform mask transparent sans caption et je le place dans les coordonnées des fonctions rectangle
y a pas photo on est bon
c'est donc bien sur window7 que le control est réduit les coordonnées rectangle sont donc juste

autrement dit ma fonction sans api est nikel résultat parfaitement identique au api
 

Dudu2

XLDnaute Barbatruc
tu peux installer 2 version d'excel sans problème
Non, on ne peut le faire que si les 2 sont du même nombre de bits.
Vérifiez que toutes les versions de Office sont des versions 32 bits ou 64 bits. Vous ne pouvez pas mélanger les versions.

Sinon, j'ai Windows 10 Home donc pas de "Bac à sable" qui de toutes façons n'a qu'une durée limitée dans le temps à une session donc assez peu utile dans ce cas.
J'ai essayé Sandboxie, mais c'est un truc à la gitbub.com difficile à appréhender et je n'ai pas de temps à investir là-dedans.
 

Statistiques des forums

Discussions
312 221
Messages
2 086 382
Membres
103 199
dernier inscrit
ATS1