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 maisActiveWindow.Panes(i).PointsToScreenPixelsXouY si vous ne souhaitez pas vous prendre inutilement le choux !
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.
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!!!!
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.
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
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.
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.
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 ration PointToPixel ou si chacun peut avoir son propre ratio.
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.
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 ?