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
En post #42, tu as un code qui fonctionne en utilisant les .Left et .Top de l'Object.
Moi je l'ai codé simple (les commentaires sont explicites).
On doit pouvoir coder différemment un peu plus concentré mais moins compréhensible.
Mais toujours par rapport au point de Split.
 

patricktoulon

XLDnaute Barbatruc
même raisonnement avec les split
VB:
Sub testxw1()
    MsgBox GetPaneOfObject2(ActiveSheet.Shapes(1)).Index
End Sub
Function GetPaneOfObject2(obj As Object) As Pane
    Dim X&
    With ActiveWindow
        X = 1
        If .SplitColumn >0 Then If obj.Left > Cells(1, .SplitColumn).Offset(, 1).Left Then X = X + 1
        If .SplitRow >0 Then If obj.Top > Cells(1, .SplitRow).Offset(1).Top Then X = X + 1
        If .Panes.Count = 4 Then
            If obj.Top > Cells(1, .SplitRow).Offset(1).Top Then X = X + 1
        End If
          Set GetPaneOfObject2 = .Panes(X)
    End With
End Function
 

Dudu2

XLDnaute Barbatruc
Pas mal mais peut mieux faire:
1692619854521.png
 

patricktoulon

XLDnaute Barbatruc
re et oui j'ai fait une erreur 🤣
c'est cells(splitrow,1) et non cells(1,splitrow)
j’étais en train de me dire c'est pas possible il me prend pour un c.. ce excel 🤣
Code:
Option Explicit

Sub testxw1()
    MsgBox GetPaneOfObject2(ActiveSheet.Shapes(1)).Index
End Sub
Function GetPaneOfObject2(obj As Object) As Pane
    Dim X&
    With ActiveWindow
        X = 0
        If .SplitColumn > 0 Then If obj.Left > Cells(1, .SplitColumn).Offset(, 1).Left Then X = X + 1
        If .SplitRow > 0 Then If obj.Top > Cells(.SplitRow, 1).Offset(1).Top Then X = X + 1
        If .Panes.Count = 4 Then
            If obj.Top > Cells(Splitrow,1).Offset(1).Top Then X = X + 1
        End If
        Set GetPaneOfObject2 = .Panes(X)
    End With
End Function
 

patricktoulon

XLDnaute Barbatruc
re
et oui en recopiant j'ai laissé le zero de départ alors que c'est 1
la version définitive
VB:
Option Explicit

Sub testxw1()
    MsgBox GetPaneOfObject2(ActiveSheet.Shapes(1)).Index
End Sub
Function GetPaneOfObject2(obj As Object) As Pane
    Dim X&
    With ActiveWindow
        X = 1
        If .SplitColumn > 0 Then If obj.Left > Cells(1, .SplitColumn).Offset(, 1).Left Then X = X + 1
        If .SplitRow > 0 Then If obj.Top > Cells(.SplitRow, 1).Offset(1).Top Then X = X + 1
        If .Panes.Count = 4 Then
            If obj.Top > Cells(.SplitRow, 1).Offset(1).Top Then X = X + 1
        End If
        Set GetPaneOfObject2 = .Panes(X)
    End With
End Function
 

patricktoulon

XLDnaute Barbatruc
et oui je travaille avec 36 classeur ouvert et je copie pas le bon
test avec un positionnement userform
VB:
Option Explicit

Sub testUF()
    Dim PaN As Pane, PtsToPx#, shap As Shape
    PtsToPx = (4 / 3) 'utilisez la méthode que vous voulez
    Set shap = ActiveSheet.Shapes(1)
    Set PaN = GetPaneOfObject2(shap)
    With UserForm1
        .Show 0
        .Move PaN.PointsToScreenPixelsX(shap.Left) / PtsToPx, _
              PaN.PointsToScreenPixelsY(shap.Top) / PtsToPx
    End With
End Sub

Function GetPaneOfObject2(obj As Object) As Pane
    Dim X&
    With ActiveWindow
        X = 1
        If .SplitColumn > 0 Then If obj.Left > Cells(1, .SplitColumn).Offset(, 1).Left Then X = X + 1
        If .SplitRow > 0 Then If obj.Top > Cells(.SplitRow, 1).Offset(1).Top Then X = X + 1
        If .Panes.Count = 4 Then
            If obj.Top > Cells(.SplitRow, 1).Offset(1).Top Then X = X + 1
        End If
        Set GetPaneOfObject2 = .Panes(X)
    End With
End Function

testé sur les 4 panes ;)
 

Dudu2

XLDnaute Barbatruc
VB:
Function PtsToPx() As Double
    Static SavePtsToPx As Double
  
    If SavePtsToPx= 0 Then
        SavePtsToPx= CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / Application.InchesToPoints(1)
    End If
    PtsToPx= SavePtsToPx
End Function
 

patricktoulon

XLDnaute Barbatruc
re
je ne sais pas si c'est intéréssant sant que c'est un createobject anonyme donc detruit en sortie de fonction tandis qu'un static( en double qui puis est) lui reste en memoire
a voir ?
après comme je l'ai dit c'est pas le genre de fonction qu'on lance 36000 fois en 2 secondes
perso quand j'utilise plusieurs fois une fonction je variabilise une variable dans la sub qui appelle la fonction

sub test
x=mafonction(blablabla)
'je fait ce que je veux de x ici
end sub

function mafonction(blablabla)
mafonction =blablabla
end function

autrement je la lance qu'une fois
 

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 104
dernier inscrit
JEMADA