XL 2016 Cherche possesseur de MAC connaissant VBA

Dudu2

XLDnaute Barbatruc
Bonjour,

Pour un XLDNaute du Canada j'ai développé un code sous Windows.
Je vire tout ce qui est API Windows. Et tous les caractères accentués.

1 - Cependant comment fait-on en MAC pour trouver le ratio Point / Pixel ?
2 - Y a-t-il une fonction Sleep(milliseconds) ?

Merci par avance
 

RyuAutodidacte

XLDnaute Impliqué
D'ailleurs j'aimerais bien voir ce que ça donne sur MAC (fichier du Post #103).
1695900167705.png
1695900225109.png
1695900260131.png
1695900338245.png
 

RyuAutodidacte

XLDnaute Impliqué
Voilà ce que donne ma version MAC :

UFMac.gif


VB:
Sub TestUserform() ' Auteur RyuAutodidacte | 26-27/09/2023
Dim UfC, Cel As String
    Cel = "F4" ' Mettre l'adresse de la cellule voulue
    UfC = UserformOnCell(Cel)
     With UserForm1
    .Show 0 ' Show tjs à mettre avant le Left et Top
        .Left = UfC(0)
        .Top = UfC(1)
    End With
End Sub

Function UserformOnCell(Cel As String) As Variant ' Auteur RyuAutodidacte | 26-27/09/2023
Dim Adr, CheckCol As Integer, PtToPx, PtSpxY, CmdBRib, Z, L, T

    Adr = Split(ActiveWindow.VisibleRange.Address, ":")
    If (Range(Cel).Column >= Range(Adr(0)).Column And Range(Cel).Column <= Range(Adr(1)).Column And Range(Adr(0)).Row <= Range(Cel).Row) = False Then
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
    End If
    CheckCol = Range(Adr(0)).Column
    If CheckCol <= Range(Cel).Column Then
        ActiveWindow.ScrollColumn = CheckCol
        CheckCol = Range(Cel).Column - CheckCol + 1
    Else
        CheckCol = Range(Cel).Column
    End If
    
    PtToPx = 0.75
    PtSpxY = ActiveWindow.Panes(1).PointsToScreenPixelsY(0) * PtToPx
    CmdBRib = CommandBars("ribbon").Height
    
    With ActiveWindow
        Z = .Zoom / 100
        L = (.Left + Cells(Range(Cel).Row, CheckCol).Left + 21) * Z - ((.Left - 1) * (Z - 1))
        T = PtSpxY + (Range(Cel).Top * Z) + CmdBRib / 4
    End With
    
    UserformOnCell = Array(L, T)
End Function
 

RyuAutodidacte

XLDnaute Impliqué
OK, merci @RyuAutodidacte pour ce test.
Alors le Top de mon code ne fonctionne pas sur MAC. Je vais donc le laisser tel quel et en rester là.

Nos calculs sont totalement différents, et le tien semble plus précis sur MAC.
Je continuerai un peu à chercher pour la version PC de mon coté, voir si je trouve une solution différente.
si tu peux tester à l'occase qd j'aurais fait un nouvel algo, … ca serait cool ;)
 

patricktoulon

XLDnaute Barbatruc
pour Windows il n'y a pas plus simple que la méthode que j'utilise dans toutes mes fonctions de positionnement
et je gère la bonne pane
je vous laisse decider votre méthode pour obtenir le coeff pt/px
VB:
Const addr = "F4"
Sub test()
    Dim PaN, cel As Range, ptopx#
    Set cel = Range(addr)
    ptopx = 0.75
     ' au cas ou la cellule  ne serait pas dans la active pane
    With ActiveWindow
    '***********************************************************
      Set PaN = .ActivePane
        If Intersect(PaN.VisibleRange, cel) Is Nothing Then
            Set PaN = Nothing
            For i = 1 To .Panes.Count
                If Not Intersect(.Panes(i).VisibleRange, cel) Is Nothing Then Set PaN = .Panes(i)
            Next
        End If
   '*********************************************************************
     If PaN Is Nothing Then MsgBox "la cellule n'est pas visible  à  l'ecran ": Exit Sub
       l = PaN.PointsToScreenPixelsX(cel.Left) * ptopx
        t = PaN.PointsToScreenPixelsY(cel.Top) * ptopx
    End With
     With UserForm1
        .Show 0
        .Left = l
        .Top = t
    End With
end Sub
perso je n'ai pas de décalage
mais je le redis une dernière fois (FAUT IL AVOIR LES BON DRIVERS GRAPHIQUES ET NON CEUX INTALLES PAR LES MISES A JOUR WINDOWS)
SI JE LAISSE WINDOWS REPRENDRE LA MAIN SUR LE GRAPHIQUE j ai les mêmes soucis que @Dudu2

demo.gif
 

Pièces jointes

  • exemple pour ryu pc windows Only.xlsm
    22 KB · Affichages: 0

RyuAutodidacte

XLDnaute Impliqué
pour Windows il n'y a pas plus simple que la méthode que j'utilise dans toutes mes fonctions de positionnement
et je gère la bonne pane
je vous laisse decider votre méthode pour obtenir le coeff pt/px
VB:
Const addr = "F4"
Sub test()
    Dim PaN, cel As Range, ptopx#
    Set cel = Range(addr)
    ptopx = 0.75
     ' au cas ou la cellule  ne serait pas dans la active pane
    With ActiveWindow
    '***********************************************************
      Set PaN = .ActivePane
        If Intersect(PaN.VisibleRange, cel) Is Nothing Then
            Set PaN = Nothing
            For i = 1 To .Panes.Count
                If Not Intersect(.Panes(i).VisibleRange, cel) Is Nothing Then Set PaN = .Panes(i)
            Next
        End If
   '*********************************************************************
     If PaN Is Nothing Then MsgBox "la cellule n'est pas visible  à  l'ecran ": Exit Sub
       l = PaN.PointsToScreenPixelsX(cel.Left) * ptopx
        t = PaN.PointsToScreenPixelsY(cel.Top) * ptopx
    End With
     With UserForm1
        .Show 0
        .Left = l
        .Top = t
    End With
end Sub
perso je n'ai pas de décalage
mais je le redis une dernière fois (FAUT IL AVOIR LES BON DRIVERS GRAPHIQUES ET NON CEUX INTALLES PAR LES MISES A JOUR WINDOWS)
SI JE LAISSE WINDOWS REPRENDRE LA MAIN SUR LE GRAPHIQUE j ai les mêmes soucis que @Dudu2

Regarde la pièce jointe 1179924
Hi Patrick ;),
Je testerai …
 

patricktoulon

XLDnaute Barbatruc
re
0.6 c'est que tu est en dpi 120 soit 125%
1/0.6=1.66666666666667 (c'est le coeff diviseur)
1.66666666666667/1.25=1.333333333333333 (on retombe bien sur le coeff diviseur et immuable de Point to puxel
1/1.333333333333333 est bien égal aux coeff multiplicateur 0.75

par contre le 1 sur Mac c'est bizarre ça voudrais dire que pointstosscreenpixel donne les données en points
et j'en doute ou mac travail en pixel ce dont je doute aussi

comme je disais en utilisant des données tel que commandbars height etc
ça peut tomber juste mais c'est certainement pas cela le calcul
on pourrait faire un simple test pour voir si j'ai raison
ce simple test
VB:
Sub test()
    With Application
        .WindowState = xlNormal
        .Left = 100
        .Top = 100
        .Width = 800
        .Height = 600
        With ActiveWindow.ActivePane
            l = .PointsToScreenPixelsX(0)
            h = .PointsToScreenPixelsY(0)
        End With

        MsgBox "app.left :" & .Left +19 & vbCrLf & "app.top : " & .Top +19 & vbCrLf & _
               "app.left en pixel : " & l & vbCrLf & "app.top en pixel : " & h

    End With

End Sub
c'est simple si en pixel ne donne pas pareil qu'en pixel alors ca ne peut etre "1" le coeff
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
pour être précis
VB:
Sub test()
    With Application
        .WindowState = xlNormal
        .Left = 100
        .Top = 100
        .Width = 800
        .Height = 600
        With ActiveWindow.ActivePane
            l = .PointsToScreenPixelsX(0)
            h = .PointsToScreenPixelsY(0)
        End With

        MsgBox "app.left :" & .Left + 19 & vbCrLf & "app.top : " & .Top + 19 & vbCrLf & _
               "app.left en pixel : " & l & vbCrLf & "app.top en pixel : " & h

        MsgBox (.Left + 19.25) & "/0.75" & " = " & (.Left + 19.25) / 0.75

    End With

End Sub
chez moi c'est 19.25
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Je ne comprends pas ta constante à 0.75 et ton raisonnement pour en justifier l'universalité.
D'ailleurs ce n'est pas un ratio Point to Pixel mais Pixel to Point.

On utilise maintenant la même méthode de calcul de position.
Edit: La SEULE méthode simple qui est susceptible, au moins sur PC de toujours donner un résultat correct: Pan.PointsToScreenPixelsX/Y * ratio Pixel to Point

Le ratio Pixel to Point je l'obtiens par l'API.
Et chez moi c'est 0.6. Avec 0.75 ça ne marche pas.
1695965583452.png
1695965597121.png


Ce même ratio à 1 pour MAC c'est ce que @RyuAutodidacte a validé avec le fichier de test que je lui ai envoyé permettant de le saisir. Voir Post #91.

C'est ce qui est utilisé dans le fichier joint pour MAC (action du Zoom à vérifier) qui doit fonctionner aussi sur PC (le tien et le mien puisque le ratio Pixel to Point vient de l'API dans mon code).

Edit: j'y ai conservé la correction estimée de la marge sur le .Left mais pas sur le .Top que je n'ai pas réussi à déterminer sans API sur PC et encore moins sur MAC.
Voilà ce qu'il donne chez moi (Windows 10 64 / Office 2016 64).
1695968769791.png
 

Pièces jointes

  • Classeur1B.xlsm
    36.5 KB · Affichages: 3
Dernière édition:

Dudu2

XLDnaute Barbatruc
Une remarque sur la marge du .Top, chez moi en tous cas.
Je l'ai tracé avec l'API: UsfWindowRECT.Top - UsfExtendedFrameRECT.Top = 0
Elle est donc nulle sur mon PC.

Sur MAC ça semble différent: voir Post #91.
Il semble que la marge sur le .Top soit la même que sur le .Left, ce qui est d'ailleurs plus logique.
1695969911377.png


C'est la raison pour laquelle, dans le fichier précédent, j'ai appliqué la marge du .Left sur le .Top pour MAC.
A voir si ça tient la route.
 

patricktoulon

XLDnaute Barbatruc
re
bonjour @Dudu2
0.75 oui c'est universel
1 point est = à 1.333333333333333 pixel
1 pixel= est = à 0.75 points
ce qui change le coeef c'est le DPI (le zoom window )(PAS LE ZOOM EXCEL!!!)

ça c'est pas moi qui l'ai inventé c'est une règle immuable

si vous me dites que qu'en multipliant .pointstoscreenpixels(Xou Y) par 1 fonctionne sur Mac
c'est que soit Mac vous le donne en points soit Mac travaille en pixel

je ne sais combien de fois je l'ai expliqué ce truc
zoom Win 100% =coeef 0.75
zoom Win 125% =coeef 0.75 /1.25=0.6

fait moi plaisir @Dudu2
si tu obtiens ca sur W10 ou 11
1695970371829.png

contrôle tes drivers et regarde bien si ils sont WHQL
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
on va faire un test voir si j'ai vraiment raison
VB:
Const addr = "F4"
Sub test()
    Dim PaN, cel As Range, ptopx#
    Set cel = Range(addr)
    ptopx = 0.75
     ' au cas ou la cellule  ne serait pas dans la active pane
    With ActiveWindow
    '***********************************************************
      Set PaN = .ActivePane
        If Intersect(PaN.VisibleRange, cel) Is Nothing Then
            Set PaN = Nothing
            For i = 1 To .Panes.Count
                If Not Intersect(.Panes(i).VisibleRange, cel) Is Nothing Then Set PaN = .Panes(i)
            Next
        End If
   '*********************************************************************
     If PaN Is Nothing Then MsgBox "la cellule n'est pas visible  à  l’écran ": Exit Sub
       l = PaN.PointsToScreenPixelsX(cel.Left) * (ptopx / 1.022)
        t = PaN.PointsToScreenPixelsY(cel.Top) * ptopx
    End With
     With UserForm1
        .Show 0
        .Left = l
        .Top = t
    End With
End Sub
 

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
Ok, admettons qu'il y ait une constante de 0.75 entre Point et Pixel.
Mais tu le dis toi-même "ce qui change le coeef c'est le DPI".
Donc tu ne peux pas appliquer "brut de fonderie" ce coeff de 0.75 à ton calcul, il faut bien le pondérer selon la config.

Tu parles des Drivers. Ok, admettons que les drivers Windows soient inadaptés.
Mais tu ne peux pas non plus demander à tous les utilisateurs de ton code qu'ils changent leurs drivers juste pour pouvoir appliquer un coeff de 0.75 invariant.

Edit: En tous cas perso je ne vais pas modifier mes drivers avec le risque que cela comporte de tout déglinguer.
 
Dernière édition:

RyuAutodidacte

XLDnaute Impliqué
on va faire un test voir si j'ai vraiment raison
VB:
Const addr = "F4"
Sub test()
    Dim PaN, cel As Range, ptopx#
    Set cel = Range(addr)
    ptopx = 0.75
     ' au cas ou la cellule  ne serait pas dans la active pane
    With ActiveWindow
    '***********************************************************
      Set PaN = .ActivePane
        If Intersect(PaN.VisibleRange, cel) Is Nothing Then
            Set PaN = Nothing
            For i = 1 To .Panes.Count
                If Not Intersect(.Panes(i).VisibleRange, cel) Is Nothing Then Set PaN = .Panes(i)
            Next
        End If
   '*********************************************************************
     If PaN Is Nothing Then MsgBox "la cellule n'est pas visible  à  l’écran ": Exit Sub
       l = PaN.PointsToScreenPixelsX(cel.Left) * (ptopx / 1.022)
        t = PaN.PointsToScreenPixelsY(cel.Top) * ptopx
    End With
     With UserForm1
        .Show 0
        .Left = l
        .Top = t
    End With
End Sub
Hello ;)

@patricktoulon
l'ancien code du post# 110 n'est pas ok sur mon Mac (intel) booté en natif sur windows 10, office 365
Par contre ce dernier code (pas encore testé sur mon Mac en windows) marche sur le portable PC de mon taf
juste un mini mini décalage sur le left selon le zoom (si on chipote), mais validé ok pour moi, faut que je le valide sur mon Mac en windows …

@Dudu2
Je suis d'accord avec vous 2
• 0,75 est bien une constante
• le DPI selon les écrans peu être une variable
Avec mes test sur WIndows sans API le 0,75 me permet de me rapprocher du F4 (c'est surtout sur la hauteur que cela pose problème) mais il me manque la variable dont tu parles Dudu.
On le voit grandement lors de mes tests avec le zoom car c'est ces test là qui permettent de réellement valider (tests sur 50% , 150% , 200%, 400%)
 

Discussions similaires

Réponses
3
Affichages
1 K

Statistiques des forums

Discussions
315 109
Messages
2 116 320
Membres
112 717
dernier inscrit
doguet