Autres ceci surtout à PatrickToulon et certains utilisateurs !?

Roland_M

XLDnaute Barbatruc
Bonjour à tous,

Bien le bonjour à toi Patrick, il s'agit d'une fonction venant de toi,
je m'en sert beaucoup, car c'est efficace, sans API, hyper simple, encore bravo !

je voulais juste faire une petite remarque à propos de cette formule, ce qui ne met pas en cause son efficacité !
au cas ou certaines personnes s'en serviraient, encore faut t'il qu'ils s'en servent sur Excel 2007 !?
car c'est de ça qu'il s'agit ! encore que sur d'autres versions à venir . . . !?!

j'ai remarqué qu'avec Excel 2007, si Application.ScreenUpdating=False, PtoPx=0
alors que j'ai aussi Excel 2016 et ça ne le fait pas !?

ceci pour essai:
Private Function PtoPx()
'Application.ScreenUpdating = False
Z# = 100 / ActiveWindow.Zoom
PtoPx = (ActiveWindow.ActivePane.PointsToScreenPixelsX(3) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / 3 * Z
MsgBox PtoPx
End Function

bien entendu j'ai solutionné ça.
 

patricktoulon

XLDnaute Barbatruc
Bonsoir a tous
meilleurs veux a toi aussi @Rolland_M
destiné nous étions tous les deux destiné
diabolo.gif

et oui en effet le screenupdating=false dans ce contexte n'a rien a faire là

mais depuis en raison de plusieurs divergence de résultat selon les versionsexcel et le zoom d'excel j'ai généralisé avec les deux DPI les plus utilisés

VB:
Function PtoPX()
    Dim Z#
    With ActiveWindow.Panes(1)
        Z = .Parent.Zoom / 100
        PtoPX = ((.PointsToScreenPixelsX(72) - .PointsToScreenPixelsX(0)) / 72) / Z
        If PtoPX < 1.4 Then PtoPX = (4 / 3) Else PtoPX = (4 / 3) * 1.25
    End With
End Function

Sub test()
    MsgBox PtoPX
End Sub
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
re, bonjour à tous,
le screenupdating=false n'était pas dans le code de l'userform mais juste avant l'appel !?
et ça planté parceque PtoPx était égale à 0 !
j'ai cherché longtemps et j'avais fini par laissé tomber

jusqu'à il y a peu, par un pur hasard , j'ai supprimé ce screenupdating=false
et là ça a fonctionné !

alors maintenant pour cette nouvelle fonction j'obtient 1.666666667
mais en remettant le screenupdating=false j'obtient 1.33333333
parce que tu as mis ceci,
If PtoPX < 1.4 Then PtoPX = (4 / 3) Else PtoPX = (4 / 3) * 1.25
comme j'ai 0 forcément If PtoPX < 1.4 Then PtoPX = (4 / 3) < 1.33333333
mais ça ne change rien, ça fait toujours 0 ou alors 1.3333333 qui est faux puisque c'est 1.66666667

comme je t'ai dis j'ai solutionné en enlevant le screenupdating=false
c'était juste pour signaler un cas qui pourrait subvenir afin de ne pas chercher !

merci encore.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
@rolland_M
mais qui a inséré ce screenupdating dans ma fonction ?
il est évident que si l'affichage est modifié la fonction ne peut pas faire son job
a tu essayé par hasard de mettre un doevents avant calcul et garder ton screenupdating
je dis ça je n'ai pas testé
mais je viens de tester avec 2007 et 2013 en mettant le screenupdating=false
et je n'ai aucun soucis

d'autre part tu n'a pas suivi une autre discussion qui a eu lieu 1 an et demie plus tard avec un autre membre
et comme une évidence qui ne m'avais pas frappé au premier à bord
mais comme tu a pu le voir (dans mon message précedent ) en fait il ne faut pas utiliser .activepane mais !! .panes(1)
 

Roland_M

XLDnaute Barbatruc
re, bonjour tout le monde,

tout d'abord merci Patrick de me répondre !

comme je t'ai dis dans mon dernier message, tu n'as pas bien lu,
ce n'est pas dans ta fonction que j'avais ce screenupdating
en gros voilà comment ça se passe, c'est très simple:
un Userf pour la boite de dialogue et une macro pour appeler cette boite.

un Userf MsgBoxPerso(), qui fonctionne parfaitement avec les API depuis longtemps
mais je voulais m'en passer et j'ai vu ta fonction qui va bien !

et j'appel MsgBoxPerso par cette macro ou j'avais ScreenUpDating que j'ai maintenant supprimé:

Public Sub MsgBoxPerso(. . . .)
'Application.ScreenUpDating = False ' <<<<<<<<<
With fm_MsgboxPerso: .LbMessage = M$: .Caption = T$: .Tag = Tg$: .Show: End With
End Sub

et c'est dans l'userform fm_MsgBoxPerso qu'il y a ta fonction j'ai simplement rajouté Z# = 100 / Zoom
car à l'époque ou j'ai trouvé ta fonction il n'y avait pas. j'ai après que tu l'avais ajouté.

Z# = ActiveWindow.Zoom / 100
PtoPx = (ActiveWindow.ActivePane.PointsToScreenPixelsX(3) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / 3 / Z


Maintenant je vais corrigé comme m'a dit ActiveWindow.ActivePane en ActiveWindow.Panes(1)

encore merci
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour Rolland

ok
mais je t'avoue, je ne comprends toujours pas pourquoi ça fait cela chez toi
a moins que tu ai l'application réduite
mais normalement screenupdating (false ou true) ne devrait pas empêcher le calcul
c'est étonnant, j'ai pourtant bien essayé de provoquer cette erreur sur 2007 et 2013

encore une énigme ;)
 

Roland_M

XLDnaute Barbatruc
re,

j'ai déjà ,car j'essaie de te suivre, comme certain, dranreg ... entre autre
mais c'est facile de savoir ou trouver tes dernières versions !?
si tu pouvais m'indiquer l'endroit ou tu les regroupe ce serait sympa !?

mais tu peux toujours envoyer ta version 2022 ça m'intéresse !
 

patricktoulon

XLDnaute Barbatruc
re
avant la version 2022
je voudrais que tu teste cela
en changeant la ligne chiffre
tu va comprendre que 3 que j'utilisais n'est pas bon 72 c'est mieux et le MUST c'est cells.width
VB:
Private Function PtoPx(Optional correction As Boolean = False)
Dim Z#
    
    chiffre = 3
   'chiffre = 72
   'chiffre = Cells.Width
    
    With ActiveWindow.Panes(1)
        Z# = .Parent.Zoom / 100
        PtoPx = ((.PointsToScreenPixelsX(chiffre) - .PointsToScreenPixelsX(0)) / chiffre) / Z
        If correction Then PtoPx = Array((4 / 3), (4 / 3) * 1.25)(Abs(PtoPx > 1.4))
    End With
End Function

Sub test()
   Dim Texte$, I&
   Application.ScreenUpdating = False
    With ActiveWindow

        .Zoom = 100
        Texte = "mesure sans correction" & vbCrLf
        For I = 100 To 50 Step -10
            .Zoom = I
            Texte = Texte & "zoom à " & I & " --> point to pixel =" & PtoPx & vbCrLf
        Next

        .Zoom = 100
        Texte = Texte & vbCrLf & "mesure avec correction" & vbCrLf
        For I = 100 To 50 Step -10
            .Zoom = I
            Texte = Texte & "zoom à " & I & " --> point to pixel =" & PtoPx(True) & vbCrLf
        Next

        .Zoom = 100
    End With

    MsgBox Texte
End Sub
 

patricktoulon

XLDnaute Barbatruc
à oui c'est étonnant le screenupdating false chez toi
il y a sans doute un autre paramètre à prendre en compte visiblement
essaie en bloquant la ligne screenupdating=false
je veux juste te montrer que les calculs sont différent avec les 3 chiffres différents
et c'est donc là que l'on voit bien que le ZOOM d'Excel est bien particulier
 

Discussions similaires