Statistiques VARCENT

Etoto

XLDnaute Barbatruc
Bonjour,

Voici une fonction qui calcule la variation en pourcentage

Voici son fonctionnement en PJ

Et voilà son code


VB:
Function VARCENT(number1#, number2#, Optional n As Byte) As Double
  If number1 = 0 Then Exit Function
  Dim vx#: vx = (number2 - number1) / number1
  If n > 0 Then vx = Round(vx, n)
  VARCENT = vx
End Function

Si vous avez une amélioration a ajouter, dites-le moi.
Crée par @Etoto
Améliorée par @soan
 

Pièces jointes

  • VARCENT.xlsm
    13.9 KB · Affichages: 5
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour Etoto,

je te propose cette petite amélioration :

VB:
Function VARCENT(number1#, number2#, Optional n As Byte) As Double
  If number1 = 0 Then Exit Function
  Dim vx#: vx = (number2 - number1) / number1
  If n > 0 Then vx = Round(vx, n)
  VARCENT = vx
End Function

soan
 

Etoto

XLDnaute Barbatruc
Bonjour Etoto,

je te propose cette petite amélioration :

VB:
Function VARCENT(number1#, number2#, Optional n As Byte) As Double
  Dim vx#: If number1 = 0 Then Exit Function
  vx = (number2 - number1) / number1
  If n > 0 Then vx = Round(vx, n)
  VARCENT = vx
End Function

soan
Ok merci de ce pas je vais la mettre comme code de base, merci de ton aide. J'ai donc rajouté ton nom à la fonction. Par contre c'est pas censé être divisé par number2 ?
 

soan

XLDnaute Barbatruc
Inactif
@Etoto

on s'est croisés ; relis mon post #2 précédent ; j'ai déplacé Dim vx# sur la ligne du dessous, car c'est inutile de déclarer vx si number1 = 0 ; en effet, dans ce cas, y'a pas d'solution car c'est impossible de faire une division par 0 : c'est mathématiquement impossible et mon test pour quitter la fonction évite la valeur d'erreur #DIV/0! ; le n optionnel permet de faire éventuellement un arrondi ; par exemple, si on envoie 2 pour n, ça fera un arrondi à 2 chiffres après la virgule.​

soan
 

Etoto

XLDnaute Barbatruc
@Etoto

on s'est croisés ; relis mon post #2 précédent ; j'ai déplacé Dim vx# sur la ligne du dessous, car c'est inutile de déclarer vx si number1 = 0 ; en effet, dans ce cas, y'a pas d'solution car c'est impossible de faire une division par 0 : c'est mathématiquement impossible et mon test pour quitter la fonction évite la valeur d'erreur #DIV/0! ; le n optionnel permet de faire éventuellement un arrondi ; par exemple, si on envoie 2 pour n, ça fera un arrondi à 2 chiffres après la virgule.​

soan
Waw bravo, mais tu vois tout cela je savais pas, le VBA c'est vraiment pas mon fort 🤔 o_O, alors tu as tout juste, j'ai rien dit. Je vais aussi mettre à jour le fichier joint que j'ai fait avec ton code.
 

Etoto

XLDnaute Barbatruc
@Etoto

on s'est croisés ; relis mon post #2 précédent ; j'ai déplacé Dim vx# sur la ligne du dessous, car c'est inutile de déclarer vx si number1 = 0 ; en effet, dans ce cas, y'a pas d'solution car c'est impossible de faire une division par 0 : c'est mathématiquement impossible et mon test pour quitter la fonction évite la valeur d'erreur #DIV/0! ; le n optionnel permet de faire éventuellement un arrondi ; par exemple, si on envoie 2 pour n, ça fera un arrondi à 2 chiffres après la virgule.​

soan
Par contre pour arrondir 2 chiffres après la virgule c'est pas 2 qu'il faut mettre mais 4.

Il faudrait peut-être avant le If de faire n = n + 2 dans ce cas si tu veux que cela soit parfait (a moins que je suis un parfait idiot 😂 😂😅)
 

soan

XLDnaute Barbatruc
Inactif
@Etoto

tu as écrit : « Par contre c'est pas censé être divisé par number2 ? »

number1 : 500
number2 : 600

différence : number2 - number1 = 600 - 500 = 100

si on divise par number2, ça fait : 100 / 600 = 0,166666666666667

si on divise par number1, ça fait : 100 / 500 = 0,2



500 × 16,67 % = 500 × 0,1667 = 83,35 ; ce n'est pas 100 !

500 × 20 % = 500 × 0,2 = 100

donc 100 est bien 20 % de 500. :)



on peut faire cette présentation :

VB:
       nombre1 : 500
variation 20 % : 100
-----------------------
       nombre2 : 600

soan
 

Etoto

XLDnaute Barbatruc
@Etoto

tu as écrit : « Par contre c'est pas censé être divisé par number2 ? »

number1 : 500
number2 : 600

différence : number2 - number1 = 600 - 500 = 100

si on divise par number2, ça fait : 100 / 600 = 0,166666666666667

si on divise par number1, ça fait : 100 / 500 = 0,2



500 × 16,67 % = 500 × 0,1667 = 83,35 ; ce n'est pas 100 !

500 × 20 % = 500 × 0,2 = 100

donc 100 est bien 20 % de 500. :)



on peut faire cette présentation :

VB:
       nombre1 : 500
variation 20 % : 100
-----------------------
       nombre2 : 600

soan
Jolie démonstration, mais dans le tuto que j'ai vu il disait l'inverse, mais bon tu viens de me prouver que sur internet pas tout est véridique 😅
 

soan

XLDnaute Barbatruc
Inactif
@Etoto

tu as écrit : « Par contre pour arrondir 2 chiffres après la virgule c'est pas 2 qu'il faut mettre mais 4. »

a) pourquoi 4 ? 4 est pour arrondir avec 4 chiffres après la virgule, donc si on veut 4 décimales

b) c'est bien 2 pour arrondir avec 2 chiffres après la virgule, donc si on veut 2 décimales

relis l'Aide VBA sur la fonction Round() 😜

soan
 

Etoto

XLDnaute Barbatruc
@Etoto

tu as écrit : « Par contre pour arrondir 2 chiffres après la virgule c'est pas 2 qu'il faut mettre mais 4. »

a) pourquoi 4 ? 4 est pour arrondir avec 4 chiffres après la virgule, donc si on veut 4 décimales

b) c'est bien 2 pour arrondir avec 2 chiffres après la virgule, donc si on veut 2 décimales

relis l'Aide VBA sur la fonction Round() 😜

soan
Ha bon ?? J'ai fait une test avec ton VARCENT et si le dernier paramètre est 2 cela arrondi à 0 décimale, regarde toi même, c'est à 4 que c'est arrondi à 2 décimales.
 

Pièces jointes

  • Capture.PNG
    Capture.PNG
    12.8 KB · Affichages: 55

soan

XLDnaute Barbatruc
Inactif
@Etoto

number1 = 324
number2 = 339

différence : number2 - number1 = 339 - 324 = 15

on divise par number1, ça fait : 15 / 324 = 0,0462962962962963

arrondi à 2 chiffres après la virgule : 0,05

=VARCENT(324;339) ➯ 0,0462963

=VARCENT(324;339;2) ➯ 0,05

l'arrondi à 2 chiffres après la virgule est correct, car comme la 3ème décimale est 6, la 2ème décimale 4 passe au chiffre supérieur qui est 5.​

VB:
            nombre1 : 324
variation 4,62963 % :  15,0000012
---------------------------------
            nombre2 : 339

soan
 

Etoto

XLDnaute Barbatruc
Alors soit je suis débile, soit mon Excel bug, soit le VBA fonctionne différemment sur ma version, soit ce que tu me dit est bizarre, parce que regarde désormais si je place le paramètre 2 dans ma formule, c'est arrondi tout cour, y'a plus de décimale.

EDIT : On s'est croisé, je vais voir ça
 

Pièces jointes

  • Annotation 2021-05-20 135824.jpg
    Annotation 2021-05-20 135824.jpg
    39.2 KB · Affichages: 49
Dernière édition:

Etoto

XLDnaute Barbatruc
@Etoto

dans ton post #1, tu as oublié de faire le changement de mon post #2 :
Dim vx# est passé sur la ligne en dessous. ;)

soan
Ok c'est officiel je suis perdu o_O o_O o_O .

Cela donne quoi au final comme code ?

Si c'est exactement celui du post #2 ça m'arrondi toujours à 0 décimale si je mets 2, alors le problème persiste.
 

soan

XLDnaute Barbatruc
Inactif
@Etoto

regarde le fichier joint. :)

tu avais raison : c'est bien un arrondi avec 4 ; car y'a un format avec % (colonne F) ;
sinon, sans ce format avec %, c'est bien un arrondi avec 2 (colonne D).

Image.jpg


le code VBA est bien le même que celui du post #2, qui est maintenant aussi dans le post #1. 😊 (merci de m'avoir cité)

VB:
Option Explicit

Function VARCENT(number1#, number2#, Optional n As Byte) As Double
  If number1 = 0 Then Exit Function
  Dim vx#: vx = (number2 - number1) / number1
  If n > 0 Then vx = Round(vx, n)
  VARCENT = vx
End Function

soan
 

Pièces jointes

  • Exo VARCENT.xlsm
    15 KB · Affichages: 2
Dernière édition:

Etoto

XLDnaute Barbatruc
@Etoto

regarde le fichier joint. :)

tu avais raison : c'est bien un arrondi avec 4 ; car y'a un format avec % (colonne F) ;
sinon, sans ce format avec %, c'est bien un arrondi avec 2 (colonne D).

Regarde la pièce jointe 1106176

le code VBA est bien le même que celui du post #2, qui est maintenant aussi dans le post #1. 😊 (merci de m'avoir cité)

VB:
Option Explicit

Function VARCENT(number1#, number2#, Optional n As Byte) As Double
  If number1 = 0 Then Exit Function
  Dim vx#: vx = (number2 - number1) / number1
  If n > 0 Then vx = Round(vx, n)
  VARCENT = vx
End Function

soan
Bien vu c'est vrai que le pourcent est déjà un nombre décimal.
 

Discussions similaires

Réponses
7
Affichages
1 K

Statistiques des forums

Discussions
315 103
Messages
2 116 239
Membres
112 695
dernier inscrit
ben44115