Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Window.PointsToScreenPixelsX vs Pane.PointsToScreenPixelsX

Lu76Fer

XLDnaute Occasionnel
Sujet : éclaircir la différence existant entre ces deux fonctions appartenant à 2 objets différents
Bien-sûr il y a aussi la fonction PointsToScreenPixelsY et c'est le pendant pour calculer l'ordonnée d'un point sur la grille, sur l'écran.
En faite, la fonction Pane.PointsToScreenPixelsXouY est apparue dans la version d'Excel 2007, sous 2003 il n'y avait que Window.PointsToScreenPixelsX ouY et il est resté par soucis de compatibilité ascendante.

Window.PointsToScreenPixelsX : cette fonction permet de calculer la position sur l'écran d'une grandeur sur la grille Range.Top ou Range.Left, sur l'écran en travaillant sur l'ActivePane. Il s'agit du volet actif et il peut y en avoir 4,2 ou 1 selon le nombre de séparateur ... Cette fonction ne tient pas compte du Zoom sur la grille et même avec un zoom à 100% donne une position approximative ?!? En faite la seule information utile que peut donner cette fonction c'est pour la position du Volet Actif :

VB:
x = ActiveWindow.PointsToScreenPixelsX(0)
y = ActiveWindow.PointsToScreenPixelsY(0)
Cela peut vous permettre de connaitre la position de la grille mais de façon très indirecte ... Il faut être sur le volet 1 et avoir la cellule A1 visible dans celui-ci.

Pane.PointsToScreenPixelsX : cette fonction fait la même chose sur le volet Pane, tient compte du zoom et donne la position exacte !


Conclusion : n'utilisez pas ActiveWindow.PointsToScreenPixelsXouY mais ActiveWindow.Panes(i).PointsToScreenPixelsXouY si vous ne souhaitez pas vous prendre inutilement le choux !
 

Dudu2

XLDnaute Barbatruc
ta fonction getpane pourrait se résumer à ça
L'objet peut très bien ne pas être dans le VisibleRange du Pane et être dans la partie du Pane qui n'est pas Scrollée. Donc ça reste potentiellement utilisable pour positionner quelque chose (un UserForm par exemple) de manière absolue ou relative (avec un décalage en largeur ou en hauteur). selon les besoins.
C'est pour ça que j'ai prévu 2 paramètres: Hidden et Visible.
 

patricktoulon

XLDnaute Barbatruc
ok
la base
panes(1).pointstoscreenpixelx(0) donne la distance en pixel du bord gauche de l’écran au left de la colonne(A)

normalement quand je zoom 100, 110 , 120 , etc. l'augmentation est DEVRAIT relativement régulière

MA FORMULE prends
le panes(1).poinntstoscreenpixelx(72 multiplié par( le zoom/100)) moins le panes(1).pointstoscreenpixelx(0)
et je redivise le tout par 72
jusque là rien de bien compliqué
sauf quand on zoom le panes(1).pointstoscreenpixelx(0) est faux en fait c'est que le zoom ne zoom pas proportionnellement la grille de la même manière que le bandeau des numeros de lignes
démonstration
VB:
Sub testbandeauerreurmesure()
   a = 1
  ActiveSheet.UsedRange.ClearContents
  Cells(1, 1).Resize(, 3) = Array("ZOOM", "EN PIXEL", "EN POINTS")
  With ActiveWindow
        For I = 100 To 400 Step 10
         .Zoom = I
         a = a + 1
            Cells(a, 1) = .Zoom
            Cells(a, 2) = .Panes(1).PointsToScreenPixelsX(0)
             Cells(a, 3) = .Panes(1).PointsToScreenPixelsX(0) / (4 / 3)
        Next
        .Zoom = 100
    End With
End Sub
pour le coups j'ai mis une MFC pour mettre en évidence les incohérences
là on vois bien que le zoom ne grossi pas le bandeau proportionnellement a sa valeur
pourtant dans la colonne "point" j'utilise le coeff px classique pour tout les zoom



donc quand dans ma formule je fait
Enrichi (BBcode):
Function PtsToPx()
    With ActiveWindow.Panes(1)
        Z = (.Parent.Zoom / 100)    ' c'est le zoom excel
        PtsToPx = CDec((CDec(.PointsToScreenPixelsX(72 / Z)) - CDec(.PointsToScreenPixelsX(0))) / 72)
    End With
End Function
la partie en rouge n'est pas valable pour certains zoom
voila l'erreur et sachant que le zero il y a déjà de 5 à 10 pixel d'erreur le pointstoscreenpixelx(72) en contient aussi une erreur forcement puisque le point(0) de la grille en contient
démonstration en zoom 140 et 150 qui sont les deux premières erreurs de zoom excel
comme on peut le voir en zoom 150 c'est nickel mais en zoom 140 walhou!!!!
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

S'il y a d'autres neuneus que moi qui lisent ce fil et essaient de le comprendre, je crois qu'il serait bien de systématiquement préciser, soit ZoomE pour le zoom Excel, soit ZoomW pour le zoom Windows, ou un truc dans le genre.
 

patricktoulon

XLDnaute Barbatruc
tiens @Dudu2 c'est kado
depuis le temps que je devais la faire celle là en macro4+api
VB:
Sub test2()
MsgBox PtsToPx
End Sub

Function PtsToPx()
Dim Dc&
Dc = ExecuteExcel4Macro("CALL(""user32"",""GetDC"",""JJJ"",0)")
PtsToPx = ExecuteExcel4Macro("CALL(""gdi32"",""GetDeviceCaps"",""JJJ""," & Dc & ", " & 88 & ")") / 72
End Function
 

Dudu2

XLDnaute Barbatruc
là on vois bien que le zoom ne grossi pas le bandeau proportionnellement a sa valeur
Oui ça je l'avais remarqué car des écarts apparaissent dans le positionnement par mes différents codes en fonction du zoom Excel. Écarts qui ne sont pas constants mais qui restent minimes et qui m'ont fait cogiter sur le pourquoi de leur existence jusqu'à ce que j'abandonne la recherche ne trouvant pas d'explication à part une cause native Excel.
depuis le temps que je devais la faire celle là en macro4+api
Ah oui, merci pour ça. Ça évite l'API. J'ai donc 2 versions de toi SANS API (voir fichier joint).
Cependant, il y a quelque chose qui ne va pas dans la version ExecuteExcel4Macro.

Essaie le fichier joint en cliquant sur le bouton Test de manière répétitive.
Plus on appelle l'ExecuteExcel4Macro, plus il prend de temps. Et je ne vois pas du tout pourquoi.
 

Pièces jointes

  • Module_PointsToPixelsSansAPI.xlsm
    26.6 KB · Affichages: 6

Dudu2

XLDnaute Barbatruc
Peut-être faudrait-il garder en Static la valeur à son 1er calcul (ce que j'ai fait dans la VERSION 1 qui va au Registre).

Par contre un truc que je ne sais pas c'est si en multi-moniteurs, tous les moniteurs sont calés sur le même ratio PointToPixel ou si chacun peut avoir son propre ratio.
 

TooFatBoy

XLDnaute Barbatruc
re
en effet le temps est anormal
et pour info c'est les api mais en macro 4

edit:
ca y est j'ai compris
quand tu passe par des if module tu relis le module complet
le #if
#else
#end if
faut pas en abuser
Et pourquoi le temps n'augmente pas avec les autres valeurs (0 ou 1) ?


[edit]
Je viens de tester en supprimant les #IF et chez moi ça ne change rien en fait : le temps augmente quand même.
[/edit]
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Mets sa macro dans ton classeur, renomme-la, puis lance-la plusieurs fois et regarde l'évolution de la valeur qui s'affiche dans la MsgBox : le problème reste entier chez moi.

La seule façon que j'ai trouvée pour l'instant de repartir de zéro est de fermer puis rouvrir le classeur.
 

Dudu2

XLDnaute Barbatruc
Bonsoir les chercheurs,
Je vois pas en quoi des instructions préprocesseur qui conditionnent la compilation seraient génératrice de CPU à l'exécution.

M'enfin, par acquis de conscience j'ai supprimé toutes les instructions préprocesseur, ne laissant que la fonction suspecte et le résultat reste le même comme chez @TooFatBoy.

Il y a peut-être un truc a faire pour "nettoyer" après l'ExecuteExcel4Macro. Mais quoi ?
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…