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é
Re @patricktoulon , @Dudu2
je fait le test aussi sur Mac …
Quelle que soit la résolution écran j'ai toujours le même résultat : 122

1695989227948.png


PS : j'ai du remplacer Application par ActiveWindow sur Mac sinon ca plante
 

Dudu2

XLDnaute Barbatruc
sincèrement est ce que ça vaut le coup?
Ben non, évidemment ça vaut pas le coup !
Mais nous ne pouvons pas être satisfaits s'il y a une erreur de seulement 1 pixel dont on sait qu'elle est présente et pourrait peut-être être évitée.

Avec l'API c'est trop lourd car il faut choper le Handle du UserForm et donc faire des manips.
Ça marche mais c'est un peu usine à gaz.

T'es sûr que t'as pas une idée pour éviter le décalage à gauche ? T'es en Win7 ?
 

patricktoulon

XLDnaute Barbatruc
re
ryu
et oui mais ActiveWindow en vba ne veut pas dire la même chose
et si application plante alors là on s'en sort plus c'est la base 🤣

@Dudu2
non je suis en windows 10 mais ce soir je peux tester sur le w 7 si tu veux
mais en gros ça correspond a ce que tu fait pour MAC (grosso modo)
sauf que si je ne suis pas en arero glass(theme de w 7 premium de base) ben il faut rien soustraire

pour info le truc a trouver c'est

zoom=activewindow.zoom/100 qui nous donne le centième du zoom
sauf que c'est pas bon car en réalité le zoom réellement appliqué n'est pas le multiple de 100
grosso modo pour vous dire :
pour 100 le coeff n'est pas 1
pour 120 le coeff n'est pas 1.2
etc....
et ca rejoins ce que j'avais déjà démontré
la header des numéros de ligne n'est pas zoomée comme les cellules
le voilà ton décalage

VB:
Sub testz()
    With ActiveWindow.ActivePane
        Z = .Parent.Zoom
       Cells(1, 1).Resize(, 3) = Array("zoom", "ptscpxleft", "ptscpxtop")
        a = 1
        For i = 80 To 400 Step 10
         a = a + 1
         .Parent.Zoom = i
          l = .PointsToScreenPixelsX(0)
            h = .PointsToScreenPixelsY(0)
            Cells(a, 1) = i
            Cells(a, 2) = l
            Cells(a, 3) = h
        Next
.Parent.Zoom = 100
    End With
Application.Goto [A1]
End Sub
entre deux zoom de 10% d’écart le pointtoscreenpixelsX me renvoie la même chose
 
Dernière édition:

RyuAutodidacte

XLDnaute Impliqué
re
et oui mais ActiveWindow en vba ne veut pas dire la même chose
et si application plante alors là on s'en sort plus c'est la base 🤣
Sur le left sur Mac j'ai tjs eu le même résultat et comme on vérifie sur left, ca ne changera rien au test :
1695991423120.png


EDIT :

En précision le :
VB:
Application.Left = 100
ne passe pas, je suppose que ce qui suis aussi …
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Alors voilà l'équivalent avec l'API tel qu'élaborée autrefois pour éliminer les marges.

C'est sûr que c'est plus complexe vu qu'il faut récupérer le Handle du UserForm pour utiliser l'API, et que quand le UserForm n'a pas encore été affiché, il n'y a pas de Handle !
 

Pièces jointes

  • VBA Positionner un UserForm sur un Objet d'une feuille (Correction des marges APÏ).xlsm
    44.6 KB · Affichages: 1

Dudu2

XLDnaute Barbatruc
Ça donne bien la version de Windows ce code (hors Windows NT) ?

VB:
Private Declare PtrSafe Function GetWinVersion Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long

'Structure pour les versions WinDOS
Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128 'sous type de certaines versions
End Type

Public Sub GetWindowsDOSVersion()
    Dim oviWin32 As OSVERSIONINFO
    
    oviWin32.dwOSVersionInfoSize = Len(oviWin32)
    GetWinVersion oviWin32
    MsgBox oviWin32.dwMajorVersion
End Sub
 

patricktoulon

XLDnaute Barbatruc
@Dudu2 tu n'es pas obligé d'utiliser tout l'usine
VB:
Private Declare PtrSafe Function GetActiveWindow Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function DwmGetWindowAttribute Lib "dwmapi.dll" (ByVal hwnd As LongPtr, ByVal dwAttribute As Long, ByRef pvAttribute As Any, ByVal cbAttribute As Long) As Long

Private Enum DWMWINDOWATTRIBUTE
    DWMWA_NCRENDERING_ENABLED = 1
    DWMWA_NCRENDERING_POLICY
    DWMWA_TRANSITIONS_FORCEDISABLED
    DWMWA_ALLOW_NCPAINT
    DWMWA_CAPTION_BUTTON_BOUNDS
    DWMWA_NONCLIENT_RTL_LAYOUT
    DWMWA_FORCE_ICONIC_REPRESENTATION
    DWMWA_FLIP3D_POLICY
    DWMWA_EXTENDED_FRAME_BOUNDS
    DWMWA_LAST
End Enum

Private Type RECT: Left As Long: Top As Long: Right As Long: Bottom As Long: End Type

Function GetUserFormExtendedFrameRECT() As RECT
    Dim R As RECT, handle As LongPtr
    handle = GetActiveWindow
    DwmGetWindowAttribute handle, DWMWA_EXTENDED_FRAME_BOUNDS, R, LenB(R)
    GetUserFormExtendedFrameRECT = R
End Function

Function PtoPx()
    PtoPx = 0.75
    'libre  à vous d'utiliser la méthode que vous voulez
End Function


Sub test()
    Dim PaN, cel As Range, R As RECT
    Set cel = ActiveCell
    ' 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
        'on recadre
        R = GetUserFormExtendedFrameRECT
        .Left = .Left - (R.Left - .Left / PtoPx)
        .Top = .Top - (R.Top - .Top / PtoPx)
    End With
End Sub
 

Dudu2

XLDnaute Barbatruc
Par contre j'aimerais bien trouver un code pour la version SANS API qui fonctionne chez toi et chez moi.
Ces trucs d'Aero je ne connais pas bien, mais je pourrais simplement différencier sur la version de Windows si tu me confirmes que ton test avec décalage à gauche en correction de marge est fait sur Windows 7.
 

patricktoulon

XLDnaute Barbatruc
ben sur mes ancienne version
je testais application .version et windows version mais comme je te l'ai dis tout à l'heure c'est pas concluant
deux pc ayant le même office et le même windows , peuvent se comporter différemment
j'ai donc abandonné cette piste
c'est pas là qu'il faut chercher
 

patricktoulon

XLDnaute Barbatruc
attend je vais le repecher sur mes ancienne version du calendar

re:
VB:
OpWin = Int(Val(Mid(Application.OperatingSystem, InStrRev(Application.OperatingSystem, " ") + 1)))    'number version system
        If OpWin = 6 Or Int(Val(Application.Version)) < 15 Then EcX = 2: Ombre = 2 Else EcX = 0: Ombre = 0     'ecart cadre

et je viens d'essayer ; opwin me donne 6 aussi en 32 bits donc c'est pas une bonne piste
les office version
12 c'est 2007
14 c'est 2010
15 c'est 2013
16 c'est 2016
apres je sais pas mais je suppose que ca continu de suivre
 

Discussions similaires

Réponses
3
Affichages
1 K

Statistiques des forums

Discussions
315 109
Messages
2 116 297
Membres
112 715
dernier inscrit
Senoussi72