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

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
 

patricktoulon

XLDnaute Barbatruc
bon à cette heure on peu bien rigoler un coup non ?
VB:
Sub test()
    Dim surface As Object, X&, Y&, ptopx#
    ptopx = 0.75    '0.6 pour dudu

    #If Mac Then
        Set surface = ActiveWindow
    #Else
        Set surface = Application
    #End If

    X = surface.Top / ptopx
    Y = surface.Left / ptopx

    Do Until TypeName(ActiveWindow.RangeFromPoint(Y, X + 300)) = "Range"
        Y = Y + 1:
    Loop
    Do Until TypeName(ActiveWindow.RangeFromPoint(Y + 300, X)) = "Range"
        X = X + 1
    Loop

    With UserForm1
        .Show 0
        .Left = ((Y - 2) * ptopx) + ActiveCell.Left * (ActiveWindow.Zoom / 100)
        .Top = ((X) * ptopx) + ActiveCell.Top * (ActiveWindow.Zoom / 100)
    End With
End Sub
c'est les cheveux qui fument
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
ben n'empeche que je n'ai pas beaucoup à parcourir
le left j'ai 30 pixel à parcourir environ
et le top j'ai les 147 du ruban +les displaybars
et si l'on veut réduire
on passe tout par activewindow et on jump de 2
VB:
Sub test()
    Dim X&, Y&, ptopx#
    ptopx = 0.75    '0.6 pour dudu
 
   X = ActiveWindow.Top / ptopx
    Y = ActiveWindow.Left / ptopx

    Do Until TypeName(ActiveWindow.RangeFromPoint(Y, X + 300)) = "Range"
        Y = Y + 2:
    Loop
    Do Until TypeName(ActiveWindow.RangeFromPoint(Y + 300, X)) = "Range"
        X = X + 2
    Loop

    With UserForm1
        .Show 0
        .Left = ((Y - 2) * ptopx) + ActiveCell.Left * (ActiveWindow.Zoom / 100)
        .Top = ((X - 2) * ptopx) + ActiveCell.Top * (ActiveWindow.Zoom / 100)
    End With
End Sub
ça reste au pixel près mine de rien
 

Dudu2

XLDnaute Barbatruc
Mais c'est très créatif !
Si tu dis qu'il n'y a pas de solution, on va s'arrêter là et vivre avec pour le SANS API.
Dans mon code j'ai mis un paramètre pour les marges... Un utilisateur voulant en inhiber le traitement pourra toujours l'utiliser si le positionnement dérive un peu sur la gauche.
 

patricktoulon

XLDnaute Barbatruc
re
Dans mon code j'ai mis un paramètre pour les marges... Un utilisateur voulant en inhiber le traitement pourra toujours l'utiliser si le positionnement dérive un peu sur la gauche.
c'est ce que je t'ai dis plus tôt
ça reste à appréciation humaine
et perso moi les 1 ou 2 pixels ne me gênent pas
ben non depuis plus de 10 ans je n'ai jamais trouvé autre chose de vraiment solide pour ce petit marginleft
et c'est pas peine d'avoir fait le tour de la question ici et dans l'autre monde
au pire perso ,je mettrais une constante en haut de module libre de modif par les utilisateurs
mais sincèrement 1/2 pixels pfffffffff si mes lunettes sont un peu sales je les vois même pas
 

RyuAutodidacte

XLDnaute Impliqué
Re @patricktoulon , @Dudu2 ,

Bon j'ai révisé ma version Mac pour faire une version 2, et sur Mac c'est même pas la peine de se prendre la tête, ma function suffit … et le Userform sera toujours dans la range visible

PS : @Dudu2 , tu dis que libre à l'utilisateur de se mettre dans la range visible, mais si c'était moi l'utilisateur, ca me ferait grave chi… ( ) d'appeler mon Userform et de pas le voir car il pourrait être en dehors du champ de vision de l'écran … [mon avis personnel]

on sait très bien qu'il y a des différences sur Excel Mac / PC :
Du coup sur cette version y a pas plus simple :
VB:
Sub TestUserform() ' Auteur RyuAutodidacte - Version 2 | 26-27/09/2023-V1 | 30/09/2023-V2
Dim UfC, Cel As String
    Cel = "F4" ' Mettre l'adresse de la cellule voulue
    UfC = UserformOnCell(Cel)
     With UserForm1
        .StartUpPosition = 0
        .Left = UfC(0)
        .Top = UfC(1)
        .Show 0
    End With
End Sub

Function UserformOnCell(Cel As String) As Variant ' Auteur RyuAutodidacte - Version 2 | 26-27/09/2023 | 30/09/2023-V2
Dim Adr, Z, L, T, MargeLeft As Byte, MargeTop As Byte

    MargeLeft = 2:              MargeTop = 3

    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 = Range(Cel).Row
        ActiveWindow.ScrollColumn = Range(Cel).Column
    End If
   
    With ActiveWindow
        Z = .Zoom / 100
        L = .Panes(1).PointsToScreenPixelsX(0) - MargeLeft + (Range(Cel).Left * Z)
        T = .Panes(1).PointsToScreenPixelsY(0) - MargeTop + (Range(Cel).Top * Z)
    End With
   
    UserformOnCell = Array(L, T)
End Function
PS : MargeLeft et MargeTop ok chez moi sur 2 ordi Mac différents (processeurs ≠, système ≠, Office 365 idem dont un plus a jour) => réglables si nécessaire

du coup j'ai une idée trop rigolote pour ryu
@patrick que m'as tu imaginé
 

Dudu2

XLDnaute Barbatruc
En fait il y a 3 options différentes si la cellule n'est pas dans le Range visible:
@RyuAutodidacte : Scroll pour ramener la cellule dans l'affichage
@patricktoulon : Message d'erreur
@Dudu2: Demerden Sie sich


Une remarque sur ton code...
Tu positionnes par rapport à Panes(1). Alors je ne sais pas sur Mac mais si la cellule est dans un autre Pane faudrait voir si ça fonctionne, j'ai un petit doute.

Edit: Tu pourrais placer directement les Left et Top de la cellule dans les PointsToScreenPixelsX/Y. Ça t'éviterait d'invoquer le Zoom dans le calcul.
 

patricktoulon

XLDnaute Barbatruc
je plussoie Dudu sur ses dernières remarques au sujet de la panes que tu a carrément exclu de ta méthode

je sais pas pour vous mais perso j'ai l'impression que plus on avance dans la discussion plus on régresse dans les méthodes

et en plus dans ton code ne voyant aucune conversion points/pixel
je suppute alors que Mac travaille soit tout en pixels soit tout en points
et cela je le redis ca m’étonnerait

@Dudu2
il n’inclue pas le zoom dans pointstoscreenpixel mais dans la valeur du left top de la cell qui est une valeur ajoutée donc c'est bon

pour ce soucis de conversion pixel un simple test
pour mac et W 10 et supperieur (2007 exclu)
activewindow.left=100
msgbox 100 & vbcrlf & activewindow.panes(1).pointstoscreenpixelsx(0)

si tout est = 100 alors Mac travaille en pixel
si c'est pas le cas alors ta fonction ne peut qu’être hasardeuse et tu a beaucoup de chance que ça fonctionne
c'est d'une logique implacable et enfantine

d'autre part
si tu me dis que ceci te donne bien le point left 0 de la grille

L = .Panes(1).PointsToScreenPixelsX(0)
donc acivewindow et panes et pointstoscreenpixels fonctionnent sur mac


dans ce cas là il n'y a aucune raison que
L = .Panes(1).PointsToScreenPixelsX(une cellule.left)+(éventuellement ton leftmargin)
et ça aussi c'est d'une logique implaquable
et si j'ai raison je t'ai déjà donné une fonction fonctionnelle en page 1 ou 2 de ce topic
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
ben deja moi w10 office 2013 c'est une chose
toi w11 office 365 ça en est une autre
w7 2007 c'est une autre
w10 office 2010 64 ou 32 deux variantes
etc etc
et je te parle même pas de W8 qui a été une cata (j'espère que tout le monde s'en est débarrassé )
bref on s'en sort plus
je cherche la discussion ou j'avais invité tout le monde a faire les tests tu verra les retours sont carrément
loufoques
 

Discussions similaires

Réponses
3
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…