Autres calcul de position d’écart left top qui déraille

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
pour calendar je suis en train de faire un patch qui me permettra de respecter les positions en forcant une marge left et top

sauf que dans l'exemple qui suit ( 2 userforms simple) le calcul ne fait pas la différence en - ou +

le calcul additionne tout le temps ??????????????????:oops:🤔🤔🤔🤔🤔🤔

  1. ouvrez l'userform ,cliquez sur le bouton rouge
  2. le userform2 s'affiche replacez le en coin haut et gauche de B3
  3. et recliquez sur le bouton rouge du uf1

j'ai tout essayé même avec sgn rien y fait c'est un truc de fou
 

Pièces jointes

  • test calcul position.xlsm
    22.4 KB · Affichages: 15
Solution
allez on garde comme ça
merci a tous
VB:
Private Sub showW_Click()
    With uf2
        Dim L1#, T1#, OperX&, OperY&
        If Not .Visible Then
            ddecx = 0: ddecy = 0    '1er lancement
            .StartUpPosition = 0
            With ActiveWindow
                PtoPx = (.ActivePane.PointsToScreenPixelsY(72) - .ActivePane.PointsToScreenPixelsY(0)) / 72    'coeff point to pixel
                Z = .Zoom / 100
                L1 = (.ActivePane.PointsToScreenPixelsX(Int([b3].Left)) / PtoPx) * Z    'placement partie mobile
                T1 = .ActivePane.PointsToScreenPixelsY(Int([b3].Top)) / PtoPx * Z
            End With
            .Left = L1
            .Top = T1
            .Show 0
            ddecx = L1
            ddecy...

patricktoulon

XLDnaute Barbatruc
re
oui @Dranreb forcement (-- ou ++ ça fait +)mais ça n'est pas ce que j'ai demandé
ce que je voulais c'est avoir la différence avec son signe si négatif
je montre en post #43 pourquoi je n'utilise pas expression tout court
c'est bien pour ça que j'utilise sgn pour obtenir le 1 ou le -1 que je multiplie a l'ABS de l'operation

j'obtiens ainsi valeur ajouté avec son signe - x ou x
 

patricktoulon

XLDnaute Barbatruc
peut être que ce qui arrive dans le debug sera plus intelligible
VB:
Sub test()

ancien = 128
nouveau = 131
Debug.Print "128-131 =" & ancien - nouveau
Debug.Print "en fait les résultat sont inversé car 131 est > 128 de 3 et pas -3" & vbCrLf & "nouveau(" & nouveau & ") est bien à 3 de plus que l'ancien(" & ancien & ")"

Debug.Print "***********************"
Debug.Print " à l inverse "

'inverse
ancien = 131
nouveau = 128
Debug.Print " 131-128 =" & ancien - nouveau
Debug.Print "en fait les résultat sont inversé car 128 est < 131 de -3 et pas 3" & vbCrLf & "nouveau(" & nouveau & ") est bien à (-)3 de moins que l'ancien(" & ancien & ")"
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Il est normal que Sgn(expression) * expression retourne forcément toujours une valeur positive.

NON NON NON NON !!!!!!
Ben bien sûr que SI !!!!!😁


T'inquiètes, on va reprendre du début, tu vas voir c'est tout simple et ça va même te paraître évident après ça :

Si expression est une valeur négative alors, "moins par moins donnant plus", Sgn(expression) * expression donne un résultat positif.
Et du coup c'est la même chose que ABS(expression). ;)

Si expression est une valeur positive alors, "plus par plus donnant plus", Sgn(expression) * expression donne un résultat positif.
Et au passage, c'est la même chose que expression tout seul, qui dans ce cas est aussi la même chose que ABS(expression). ;)

Tu vois que dans les deux cas, comme l'a dit Bernard, on peut remplacer Sgn(expression) * expression par ABS(expression) et le résultat est donc toujours positif. CQFD ;)


Alors, il l'avait pas dit papy Marcel que c'était bête comme chou ?
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
peut être que ce qui arrive dans le debug sera plus intelligible
VB:
Sub test()

ancien = 128
nouveau = 131
Debug.Print "128-131 =" & ancien - nouveau
Debug.Print "en fait les résultat sont inversé car 131 est > 128 de 3 et pas -3" & vbCrLf & "nouveau(" & nouveau & ") est bien à 3 de plus que l'ancien(" & ancien & ")"

Debug.Print "***********************"
Debug.Print " à l inverse "

'inverse
ancien = 131
nouveau = 128
Debug.Print " 131-128 =" & ancien - nouveau
Debug.Print "en fait les résultat sont inversé car 128 est < 131 de -3 et pas 3" & vbCrLf & "nouveau(" & nouveau & ") est bien à (-)3 de moins que l'ancien(" & ancien & ")"
End Sub

Sur l'Excel que j'ai trouvé, ça donne les bons résultats dans la fenêtre d'exécution, c'est-à-dire -3 pour le premier résultat et 3 pour le second.

Voici un copier/coller du contenu de la fenêtre d'exécution :

Code:
128-131 =-3
en fait les résultat sont inversé car 131 est > 128 de 3 et pas -3
nouveau(131) est bien à 3 de plus que l'ancien(128)
***********************
 à l inverse
 131-128 =3
en fait les résultat sont inversé car 128 est < 131 de -3 et pas 3
nouveau(128) est bien à (-)3 de moins que l'ancien(131)

Pour info, l'Excel en question est une version 2016 Pro 32 bits tournant sous Windows 10 Pro 64 bits 2H1.
 

TooFatBoy

XLDnaute Barbatruc
je sais très bien pour le positif mais ce n'est pas le résultat recherché
Ce que je démontre est aussi bien pour une valeur positive que négative.

Dans tous les cas Sgn(expression) * expression renvoie une valeur positive.

Ce n'est pas un "résultat recherché", c'est un fait. La démonstration en #51 (👽) le prouve.


Et on pourrait faire la même démonstration pour prouver que l'utilisation de SGN n'est pas obligatoire puisqu'on peut remplacer SGN(expression) * ABS(expression) par expression tout seul qui est bien évidemment la même chose. 😉
 

patricktoulon

XLDnaute Barbatruc
re
puisqu'on peut remplacer SGN(expression) * ABS(expression) par expression tout seul qui est bien évidemment la même chose.

pas tout a fait
ça dépend la quelle des valeurs 1 ou 2 est soustrait a l'autre @Dranreb me la fait remarqué
j'ai suffisamment exprimer le besoins moult fois je vais pas le ré expliquer

100-150 fera toujours -50 mais 150-100 fera 50
j'ai donc adopté le nouveau-l'ancien bien que ça m'ennuie l'ancien est constamment recalculé et tout les calculs partaient de lui mais j'ai pu remanier un peu ça et ça marche
en tout cas avec une contrainte d'ordre dans le nombre 1 - nombre2 ou nombre1 doit être le nombre(positif ou négatif) au quel on enlève nombre2 il sera forcement nécessaire d'utiliser cette formule
SGN(expression) * ABS(expression) sera obligatoire pour avoir le bon
 

TooFatBoy

XLDnaute Barbatruc
100-150 fera toujours -50 mais 150-100 fera 50
Oui, et heureusement ! 😁


une contrainte d'ordre dans le nombre 1 - nombre2 ou nombre1 doit être le nombre(positif ou négatif) au quel on enlève nombre2 il sera forcement nécessaire d'utiliser cette formule
SGN(expression) * ABS(expression) sera obligatoire pour avoir le bon
Je ne sais pas quelle opération te pose problème (quelle opération tu utilises, quels résultat tu penses obtenir, et quels résultats tu obtiens réellement), donc difficile pour moi t'aider, mais si tu as compris toutes les démonstrations que je t'ai faites ici (en particulier que SGN(expression) * ABS(expression) c'est pareil que expression), alors tu ne devrais plus avoir de problème.
 

patricktoulon

XLDnaute Barbatruc
bon les gars vous êtes gentils mais on se comprends pas
visiblement vous avez pas compris le besoins, vous vous êtes focalisé sur une formule qui titille votre science
moi c'est de me répéter qui me titille
alors on stop vous êtes sympa merci pour tout
j'ai trouvé ma solution tout seul elle fonctionne très bien
je clos le sujet
Merci a tous
Terminé
 

TooFatBoy

XLDnaute Barbatruc
Je reprends ce que tu écrivais en #3.

si j'ai mon uf2 a 123 de left et que le repositionne à 128 de left je devrait avoir dans ddecx 5
si j'ai mon uf2 a 128 de left et que le repositionne à 123 de left je devrait avoir dans ddecx -5
hors dans les deux sens il additionne j'obtiens 133
Sans voir l'opération et sans connaître la valeur de chacun des opérandes, pas simple de t'aider.
Mais il semble tout de même ici évident que tu t'es trompé dans ton opération : tu fais une addition au lieu de faire une soustraction (ou tu fais une soustraction au lieu de faire une addition). 😉
 

Membres actuellement en ligne

Statistiques des forums

Discussions
314 450
Messages
2 109 719
Membres
110 551
dernier inscrit
Khyolyanna