🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Round dans Excel — l'arrondi bancaire et pourquoi il diffère de la feuille de calcul

|

VBA Round dans Excel — l'arrondi bancaire et pourquoi il diffère de la feuille de calcul

TL;DR — Le Round de VBA n'est pas le ROUND que vous utilisez dans une cellule. Il arrondit une moitié au chiffre pair le plus proche (l'arrondi bancaire), si bien que Round(2.5) vaut 2 et Round(3.5) vaut 4 — les moitiés ne montent pas toujours. Le ROUND de la feuille arrondit les moitiés en s'éloignant de zéro (2.53). Quand le total d'une macro doit concorder avec la feuille, appelez Application.WorksheetFunction.Round plutôt que le Round natif.

Sub RoundingIsNotWhatYouThink()
    Debug.Print Round(2.5)                              ' 2  - moitie au PAIR, pas 3
    Debug.Print Round(3.5)                              ' 4  - moitie au PAIR
    Debug.Print Round(2.5, 0)                           ' 2  - meme regle avec un argument de decimales
    Debug.Print Application.WorksheetFunction.Round(2.5, 0)  ' 3  - identique a =ROUND(2.5,0)
End Sub

Round, Mod et Rnd sont trois outils mathématiques qui ressemblent à leurs cousins de la feuille de calcul mais se comportent discrètement autrement, parce que VBA est un langage de programmation généraliste, pas le tableur. L'arrondi est celui qui coûte de l'argent : trompez-vous de règle et les totaux d'une macro dérivent d'un centime par rapport aux cellules que tout le monde lit.

Ce que vous allez apprendre

  • Le modèle mental — les maths de VBA ne sont pas celles de la feuille, et Round le prouve
  • Ce qu'est l'arrondi bancaire, et pourquoi Round(2.5) vaut 2 alors que la cellule donne 3
  • Le bug numéro un — un total de macro décalé d'un centime par rapport au =ROUND() de la feuille
  • Comment coller exactement à la feuille avec Application.WorksheetFunction.Round
  • Pourquoi Int et Fix tronquent au lieu d'arrondir, et divergent sur les nombres négatifs

Le modèle mental : les maths de VBA ne sont pas celles de la feuille

Vous savez déjà comment =ROUND(2.5, 0) se comporte dans une cellule — il donne 3. Aussi, la première fois qu'une macro affiche 2, cela ressemble à un bug. Ce n'en est pas un. La fonction Round de VBA suit une règle différente et délibérée qu'on appelle l'arrondi bancaire (officiellement, l'arrondi au pair le plus proche) : quand un nombre tombe exactement sur la moitié, il s'arrondit au chiffre pair le plus proche plutôt que toujours vers le haut.

Debug.Print Round(0.5)    ' 0   (0 est pair)
Debug.Print Round(1.5)    ' 2   (2 est pair)
Debug.Print Round(2.5)    ' 2   (2 est pair)
Debug.Print Round(3.5)    ' 4   (4 est pair)

Remarquez que les moitiés alternent : bas, haut, bas, haut. C'est tout l'intérêt de la règle : sur un grand nombre de valeurs, arrondir systématiquement les moitiés vers le haut introduit un petit biais vers le haut, et l'arrondi au pair l'annule. C'est le choix statistiquement le plus équitable — ce qui explique précisément pourquoi un langage conçu pour le calcul généraliste l'a retenu, et pourquoi le tableur, bâti pour l'arithmétique de tous les jours, ne l'a pas fait.

Retenez une seule phrase et tout le reste de l'article en découle : le nom de la fonction est le même, la règle ne l'est pas. Tout ce qui suit est une conséquence du fait que Round arrondit au pair.

Le bug numéro un : un total décalé d'un centime

Voici la panne qui envoie les gens chercher de l'aide. Une macro additionne des lignes de facture et arrondit chacune à deux décimales ; le total général ressort un centime en dessous de la colonne =ROUND(...) que l'équipe finance tient à jour sur la feuille, et voilà que les deux nombres ne se réconcilient plus :

' Arrondit chaque demi-centime au pair - s'ecarte du =ROUND() de la feuille
lineTotal = lineTotal + Round(price * qty, 2)

Chaque Round individuel s'écarte d'un demi-centime au maximum, mais sur des centaines de valeurs à demi-centime, l'arrondi au pair et l'arrondi à l'écart de zéro de la feuille tirent dans des directions opposées, et les centimes s'accumulent. Rien ne plante ; les nombres divergent, tout simplement. Quand votre résultat doit coller à une cellule, n'utilisez pas le Round de VBA :

' Arrondit exactement comme =ROUND() sur la feuille - moitie a l'ecart de zero
lineTotal = lineTotal + Application.WorksheetFunction.Round(price * qty, 2)

Application.WorksheetFunction.Round (vous pouvez aussi écrire Application.Round) est le ROUND de la feuille, appelé depuis VBA : il arrondit donc les moitiés en s'éloignant de zéro et votre total se réconcilie au centime près. La règle empirique est sans détour : l'argent et tout chiffre qui doit concorder avec la feuille → WorksheetFunction.Round ; réservez le Round natif aux statistiques, là où l'arrondi au pair est justement le but.

Arrondir n'est pas tronquer : Int et Fix

Arrondir décide de quel côté part une fraction ; parfois vous ne voulez pas de fraction du tout, vous voulez la couper net. C'est la troncature, et VBA en a deux fonctions — qui, bien sûr, divergent l'une de l'autre sur les nombres négatifs :

Debug.Print Int(2.7)     ' 2    Fix(2.7)   ' 2    - identiques pour les positifs
Debug.Print Int(-2.7)    ' -3   Fix(-2.7)  ' -2   - ils divergent sur les negatifs

Int arrondit vers le bas, vers moins l'infini (un vrai plancher), donc Int(-2.7) vaut -3. Fix arrondit vers zéro (il se contente de retirer les décimales), donc Fix(-2.7) vaut -2. Pour les nombres positifs, ils sont identiques ; dès qu'un négatif apparaît, vous devez savoir lequel vous vouliez. Ni l'un ni l'autre n'est Round — ils ne regardent jamais la partie fractionnaire pour décider, ils la retirent, un point c'est tout.

Il n'existe pas non plus de RoundUp ni de RoundDown intégrés en VBA. Quand vous avez besoin d'un arrondi « toujours vers le haut » ou « toujours vers le bas » à un certain nombre de décimales, tournez-vous vers les versions de la feuille : Application.WorksheetFunction.RoundUp(x, 2) et RoundDown(x, 2).

La note de bas de page sur la virgule flottante

Une dernière surprise se cache sous tout arrondi : les valeurs Double sont stockées en binaire, et certaines décimales d'apparence bien nette ne peuvent pas être représentées exactement. L'exemple classique est Round(2.675, 2), qui renvoie 2.67, et non 2.68 — parce que 2.675 est en réalité retenu comme 2.67499999..., ce n'est donc pas vraiment une moitié. Ce n'est pas un bug de Round ; c'est la nature de la virgule flottante. Quand l'exactitude au centime compte, travaillez dans le type Currency ou Decimal, ou arrondissez via WorksheetFunction.Round, conçu pour lisser ces écarts de représentation.

Quand l'arrondi bancaire est le bon choix

Rien de tout cela ne signifie que le Round de VBA est cassé — cela signifie qu'il vise un autre travail. Si vous calculez une moyenne, un résumé statistique, ou quoi que ce soit où des milliers de moitiés biaiseraient autrement un résultat vers le haut, l'arrondi au pair est le bon choix, et c'est la règle à l'écart de zéro de la feuille qui est biaisée. Utilisez le Round natif à dessein dans ce cas. L'erreur n'est pas d'utiliser Round ; c'est de l'utiliser pour de l'argent qui doit se réconcilier avec un tableur, là où les deux règles divergent en silence.

Comment ExcelMaster vous aide

L'arrondi est une décision à trois bifurcations silencieuses — arrondi au pair contre arrondi à l'écart de zéro (Round natif contre WorksheetFunction.Round), arrondir contre tronquer (Round contre Int/Fix, qui divergent ensuite sur les négatifs), et la question de savoir si la virgule flottante détient vraiment une moitié — et chaque mauvais virage échoue en silence : un total décalé d'un centime, un négatif ramené au plancher dans le mauvais sens, un 2.675 qui refuse de s'arrondir vers le haut.

ExcelMaster vous laisse dire ce que vous voulez vraiment — « arrondis chaque ligne à deux décimales pour que le total corresponde à la colonne ROUND de la feuille » — et il choisit WorksheetFunction.Round parce que vous avez dit coller à la feuille, utilise Int ou Fix à dessein quand vous voulez tronquer, et signale le piège de l'argent dans un Double avant qu'il ne vous coûte un centime. Vous gardez le classeur et le code.

Questions fréquentes

Pourquoi VBA Round(2.5) renvoie-t-il 2 au lieu de 3 ?

Parce que le Round de VBA utilise l'arrondi bancaire — l'arrondi au pair le plus proche. Quand une valeur tombe exactement sur la moitié, elle va au chiffre pair le plus proche : Round(2.5) vaut 2 (2 est pair) et Round(3.5) vaut 4 (4 est pair). Le =ROUND(2.5,0) de la feuille utilise une autre règle, l'arrondi des moitiés à l'écart de zéro, qui donne 3. Même nom, règle différente.

Comment faire arrondir VBA de la même façon que le ROUND de la feuille ?

Appelez la fonction de la feuille depuis VBA : Application.WorksheetFunction.Round(x, 2) (ou Application.Round(x, 2)). Elle arrondit les moitiés en s'éloignant de zéro exactement comme =ROUND() dans une cellule, si bien que les totaux calculés dans une macro se réconcilient avec une colonne ROUND de la feuille. Réservez le Round natif aux cas où l'arrondi au pair est réellement ce que vous voulez.

Comment arrondir à 2 décimales en VBA ?

Passez le nombre de décimales en second argument : Round(value, 2) pour l'arrondi bancaire, ou Application.WorksheetFunction.Round(value, 2) pour coller à la feuille. Pour toujours arrondir vers le haut ou vers le bas à deux décimales, utilisez WorksheetFunction.RoundUp(value, 2) ou RoundDown(value, 2) — VBA n'a pas de RoundUp ni de RoundDown natifs.

Quelle est la différence entre Int et Fix en VBA ?

Les deux retirent la partie fractionnaire, mais ils divergent sur les négatifs. Int ramène au plancher vers moins l'infini, donc Int(-2.7) vaut -3. Fix tronque vers zéro, donc Fix(-2.7) vaut -2. Pour les nombres positifs, ils sont identiques. Ni l'un ni l'autre n'arrondit — ils rejettent les décimales au lieu de les regarder, contrairement à Round.

Pourquoi Round(2.675, 2) donne-t-il 2.67 et non 2.68 ?

Parce que 2.675 ne peut pas être stocké exactement en Double — il est en réalité retenu comme 2.67499999..., ce n'est donc pas une vraie moitié et il s'arrondit vers le bas. C'est la représentation en virgule flottante, pas un bug d'arrondi. Pour l'argent, utilisez le type Currency ou Decimal, ou arrondissez via Application.WorksheetFunction.Round.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 18/09/2026.

Guides associés : VBA Mod · VBA Rnd · VBA Format · VBA Number Format · VBA WorksheetFunction