TL;DR — Le
Roundde VBA n'est pas leROUNDque vous utilisez dans une cellule. Il arrondit une moitié au chiffre pair le plus proche (l'arrondi bancaire), si bien queRound(2.5)vaut2etRound(3.5)vaut4— les moitiés ne montent pas toujours. LeROUNDde la feuille arrondit les moitiés en s'éloignant de zéro (2.5→3). Quand le total d'une macro doit concorder avec la feuille, appelezApplication.WorksheetFunction.Roundplutôt que leRoundnatif.
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
Roundle prouve - Ce qu'est l'arrondi bancaire, et pourquoi
Round(2.5)vaut2alors que la cellule donne3 - 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
IntetFixtronquent 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
