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
 

Dudu2

XLDnaute Barbatruc
Bonjour à tous,
@RyuAutodidacte, la problématique des transcodages c'est toujours un truc absolument infernal.

Avant de faire une fonction de transcodage des caractères diacritiques, j'aimerais savoir comment arrivent ce code et les valeurs de cellules chez toi ? Sous-entendu, est-ce que l'import sous MAC agit déjà sur le jeu de caractères dans le code et dans l'écran ?

STP, tu prends ce classeur et sans rien exécuter tu screenshot la constante et la cellule, chez moi:

Constante:
1695811543603.png


Cellule:
1695811577179.png
 

Pièces jointes

  • Classeur2.xlsm
    20.7 KB · Affichages: 1

RyuAutodidacte

XLDnaute Impliqué
Hello @Dudu2 , @patricktoulon ,

dsl, trop occupé hier avec des urgences à traiter … pour vous répondre
je reprends le fil pendant pas pause dèj. :(

concernant le placement du Userform
sur la modification/test du code que j'ai fait hier … j'ai pu placer le Userfom en F4
en ayant la cellule A1en corner haut gauche
Voilà ce qu'à donner le mixte des codes et de ma compréhension sur Mac :
VB:
Sub MixteRyuPatTDudu()
 
    Application.Goto Cells(1), True
 
    PtoPx = 0.75
    Z = ActiveWindow.Zoom / 100
    T = ActiveWindow.Panes(1).PointsToScreenPixelsY(0) * PtoPx
 
    PosWin = CInt(Split(MacScript("set AppleScript's text item delimiters to ""|""" & vbNewLine & _
    "tell application ""Microsoft Excel"" to return (the position of the front window) as string"), "|")(0))

    With UserForm1
    .Show 0
    .Left = (Application.Left + [F4].Left + 19) * Z - (PosWin) * (Z - 1)
    .Top = T + ([F4].Top * Z) + CommandBars("ribbon").Height / 4
    End With
End Sub



Sachez j'aimerais faire des contributions concernant Excel Mac (il y en a très peu), et donc j'aimerais bien faire ma 1 ère contribution avec ce sujet déjà au moins, sur le placement du Userform par rapport à une cellule (j'utilise office 365)
Si vous avez des conseils afin que je puisses les mettre sur XLD … à quel endroit ? faire une section pour les réunir , …etc … ca serait top
PS : j'essaie de faire mes codes pour la plupart pour MAC et PC
=> Donc hier soir, super tard 😓, je me suis attelé à faire une fonction (pour ma1ère contribution) permettant de placer le Userform sur la cellule de son choix dans la range visible (Mac/PC - dernière modif il y a peu) … Zoom inclus dans la fonction.
  • si la cellule n'est pas visible sur la range visible, je déplace la range afin que le Userfom apparaissent sur la cellule choisie de la fenêtre Excel
Voici mon code avec qq recherche sur le net sur les fonctions dont j'étais pas habitué à utiliser :
(d'aiileurs bien expliqué sur la doc. MS)
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
VB:
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) = False Then
        ActiveWindow.ScrollColumn = Range(Cel).Column
    End If
    If (Range(Cel).Row >= Range(Adr(0)).Row And Range(Cel).Row <= Range(Adr(1)).Row) = False Then
        ActiveWindow.ScrollRow = Range(Cel).Row
    End If
 
    CheckCol = ActiveWindow.Panes(1).VisibleRange.Cells(1).Column
    If CheckCol <= Range(Cel).Column Then
        CheckCol = Range(Cel).Column - CheckCol + 1
    Else
        CheckCol = Range(Cel).Column
    End If
 
    PtToPx = 0.75
    PtSpxY = ActiveWindow.Panes(1).PointsToScreenPixelsY(0) * PtToPx
    #If Mac Then
        CmdBRib = CommandBars("ribbon").Height
    #Else
       CmdBRib = 0
    #End If
 
    With ActiveWindow
        Z = .Zoom / 100
        L = (.Left + Cells(Range(Cel).Row, CheckCol).Left + 19) * Z - ((.Left - 1) * (Z - 1))
        T = PtSpxY + (Range(Cel).Top * Z) + CmdBRib / 4
    End With
 
    UserformOnCell = Array(L, T)
End Function

Merci pour votre retour svp, concernant ma fonction afin de savoir si j'ai de petites rectifications à faire avant de la publier



• Concernant la problématique des transcodages :
1695814863326.png

1695814880439.png


PS : Si tu me disais ce que tu voudrais faire exactement, je pourrais voir ce qu'il en est de mon coté (c'est toi qui voit …)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour ryu
ca va être dur
tes calculs sont completement incohérents

que donne ceci chez toi
PtSpxY = ActiveWindow.Panes(1).PointsToScreenPixelsY(0) * PtToPx
normalement c'est senser te donner la position du top de la grille en en point ,pas besoins de rajouter quoi que se soit
si c'est pas le cas tu peux oublier ce procéder ou cette méthode comme tu veux

ps: tu t'éparpille un peu j’attends toujours le retour de ma classe avec tes corrections pour Mac
parenthèses et tout i cointi

du coup moi j'ai avancé et tu va avoir double travail
si tu terminais une seule chose que tu commence ce serait déjà bien ;)
 

Dudu2

XLDnaute Barbatruc
Si tu me disais ce que tu voudrais faire exactement
Je veux voir si des lettres accentuées dans le code et en cellule saisies sur PC apparaissent à l'identique une fois le classeur importé sur MAC. Tel quel, sans exécuter quoi que ce soit, juste en regardant (screenshot) ce qui apparait dans le code et en cellule sur MAC.

2 cas pour chaque zone: cellule et code:
- OUI c'est identique => pas de transcodage nécessaire
- NON c'est différent => transcodage nécessaire
 

RyuAutodidacte

XLDnaute Impliqué
re
bonjour ryu
ca va être dur
tes calculs sont completement incohérents

que donne ceci chez toi
PtSpxY = ActiveWindow.Panes(1).PointsToScreenPixelsY(0) * PtToPx
normalement c'est senser te donner la position du top de la grille en en point ,pas besoins de rajouter quoi que se soit
si c'est pas le cas tu peux oublier ce procéder ou cette méthode comme tu veux

ps: tu t'éparpille un peu j’attends toujours le retour de ma classe avec tes corrections pour Mac
parenthèses et tout i cointi

du coup moi j'ai avancé et tu va avoir double travail
si tu terminais une seule chose que tu commence ce serait déjà bien ;)
J'ai tester sur Mac et sur PC (on m'en a passé un au taf) et les test sur les 2 machines sont OK
à moins que tu me prouves le contraire …
 

patricktoulon

XLDnaute Barbatruc
re
ici par exemple
tu utilise
Adr = Split(ActiveWindow.VisibleRange.Address, ":")

et plus bas tu utilise
CheckCol = ActiveWindow.Panes(1).VisibleRange.Cells(1).Column

tu peux pas utiliser les mêmes méthodes ?
Adr = ActiveWindow.VisibleRange.Cells(1).Address '(0,0)si tu veux pas les "$"

re
ben je ne peux pas tester moi je n'ai pas Mac
mais sur pc ceci suffit
ptpx=0.75
(blablabla. pointstoscreenpixelsx(0)*ptpx)+tacellule.left fois le zoom suffit
et pareil pour le top (sur pc W) le zoom est inclut dans le pointstoscreenpixel

ceci est trop hasardeux
+ CmdBRib / 4
connais tu la raison du "/4" non?
si oui explique le ( ce dont je doute que tu puisse le faire)
si non
c'est pas bon
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
donc si ceci
(blablabla. pointstoscreenpixelsx(0)*ptpx)+tacellule.left * le zoom
ou
(blablabla. pointstoscreenpixelsx(tacellule.left)*ptpx

ne convient pas a MAC je vois a quoi cela servirait autant trouver une autre méthode
tout du moins si ça te donne pas le point 0 de la grille tout le reste de ton code n'est que du patchage
certes ça fonctionne sur ton Mac mais pas forcement sur celui d'un autre
 

RyuAutodidacte

XLDnaute Impliqué
ps: tu t'éparpille un peu j’attends toujours le retour de ma classe avec tes corrections pour Mac
parenthèses et tout i cointi
Si j'y travaille et n'abandonne pas, mais je suis plus lent que toi pour coder ( en plus j'ai pas coder pendant 2- ans avant d'arriver sur XLD)
y a des choses que je revois pour une meilleurs fonctionnement en gardant ton principe …

Adr = Split(ActiveWindow.VisibleRange.Address, ":")

et plus bas tu utilise
CheckCol = ActiveWindow.Panes(1).VisibleRange.Cells(1).Column

tu peux pas utiliser les mêmes méthodes ?
Si car la 1ere je check si la cellule est visible dans la fenêtre Excel => Range visible (sinon ton userform et afficher en dehors)
Dans le cas ou elle n'est pas dans la range je check si c'est sur les colonnes ou sur les lignes ou les 2
et je scroll en conséquence, alors mon userform est affiché dans la fenêtre et pas à l'exterieur (sans compter l'histoire de décalage …
 

RyuAutodidacte

XLDnaute Impliqué
ne convient pas a MAC je vois a quoi cela servirait autant trouver une autre méthode
tout du moins si ça te donne pas le point 0 de la grille tout le reste de ton code n'est que du patchage
certes ça fonctionne sur ton Mac mais pas forcement sur celui d'un autre
j'ai testé sur Imac 27 pouces, sur Macbook pro 14 pouces seul et double écran
puis sur pc 14 pouces seul et double écran
avec les Zoom et les différents range visible et je n'ai pas eu de pbm

@Dudu2 @patricktoulon
le fichier :
 

Pièces jointes

  • Ryu US test pour Patrick.xlsm
    16.5 KB · Affichages: 3

RyuAutodidacte

XLDnaute Impliqué
En fait c'est pour le Ý (accent aigu) donc on s'en fiche si le reste est bon.
J'en conclue qu'il n'y a pas de problème de jeu de caractères quand on importe un Classeur Excel de PC vers MAC.
Cool 👍 c’est parfait
Ne sachant pas ce que tu voulais faire exactement dans ton code je me suis pas trop prononcé. Il se pourrait que selon la tache il peut y avoir des diff, mais au quotidien je n’ai rien remarqué de flagrant pour une utilisation normale …

As tu essayé ma fonction ??
 

Discussions similaires

Réponses
3
Affichages
1 K

Statistiques des forums

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