TL;DR —
Modvous donne le reste après division entière :7 Mod 3vaut1. C'est un opérateur, pas une fonction, alors vous écriveza Mod bsans parenthèses. Deux choses surprennent : VBA arrondit d'abord ses deux opérandes à des entiers (6.7 Mod 3se comporte comme7 Mod 3), et le résultat prend le signe du dividende — le nombre de gauche — si bien que-7 Mod 3vaut-1, et non le2de la feuille.
Sub RemaindersAndTheSignTrap()
Debug.Print 7 Mod 3 ' 1 - reste de 7 / 3
Debug.Print 10 Mod 2 ' 0 - divise juste, donc "10 est-il pair ?" -> True
Debug.Print -7 Mod 3 ' -1 - le signe suit le DIVIDENDE (-7), pas le diviseur
Debug.Print 6.7 Mod 3 ' 1 - 6.7 arrondi a 7 d'abord, puis 7 Mod 3
End Sub
Mod, Round et Rnd sont trois outils mathématiques qui
ressemblent à leurs cousins de la feuille de calcul mais se comportent discrètement autrement. Mod est
celui que les gens portent tel quel d'une formule de cellule dans une macro, avant de ne plus comprendre
pourquoi les négatifs sont sortis faux.
Ce que vous allez apprendre
- Le modèle mental —
Mod, c'est le reste après division entière, et c'est un opérateur - Pourquoi VBA arrondit les opérandes à des entiers avant de diviser
- Le bug numéro un —
-7 Mod 3vaut-1en VBA mais2sur la feuille, parce que la règle de signe diffère - Les idiomes du quotidien — le test de parité, une ligne sur N, le parcours cyclique d'une liste
- Comment forcer un résultat toujours positif, et pourquoi
x Mod 0lève une erreur d'exécution
Le modèle mental : le reste après division entière
La division vous donne deux choses — combien de fois un nombre entre dans un autre, et ce qu'il reste. Mod
vous tend ce reste. 17 Mod 5 vaut 2, parce que 5 entre trois fois dans 17 en laissant 2. C'est toute
l'idée, et c'est pourquoi Mod est partout où un motif se répète : un reste de 0 signifie « division
juste », ce qui vous sert à tester est-ce pair, est-ce la Nième ligne, avons-nous rempli un groupe
entier.
Deux propriétés font du Mod de VBA une bête à part. D'abord, c'est un opérateur, comme + ou *, pas
une fonction — vous écrivez a Mod b, jamais Mod(a, b). Ensuite, il travaille sur des nombres entiers
: si vous lui donnez des décimales, VBA arrondit chaque opérande à un entier avant de prendre le reste.
Debug.Print 6.7 Mod 3 ' 1 - 6.7 arrondi a 7, puis 7 Mod 3 = 1 (pas 0.7)
Debug.Print 5.4 Mod 2 ' 1 - 5.4 arrondi a 5, puis 5 Mod 2 = 1
Si vous avez réellement besoin d'un reste fractionnaire, Mod ne vous le donnera pas — calculez-le
vous-même avec a - Int(a / b) * b. Mais neuf fois sur dix, Mod est exactement ce que vous voulez,
précisément parce qu'il raisonne en comptes entiers.
Le bug numéro un : les négatifs changent de signe
C'est celui qui remplit les forums. Vous avez une formule qui marche sur la feuille, vous collez la même arithmétique dans VBA, et les négatifs ressortent avec le mauvais signe :
Debug.Print -7 Mod 3 ' VBA: -1
' =MOD(-7, 3) sur la feuille donne: 2
Les deux sont « corrects » — ils suivent des règles différentes et documentées. Le Mod de VBA prend le
signe du dividende (l'opérande de gauche) : -7 Mod 3 vaut -1, 7 Mod -3 vaut 1. Le MOD de la
feuille prend le signe du diviseur : MOD(-7, 3) vaut 2. Ainsi, une formule à laquelle vous faisiez
confiance dans une cellule peut produire en silence un nombre différent dès que vous la déplacez dans une
macro, sans le moindre avertissement.
Si ce que vous voulez vraiment, c'est un résultat jamais négatif — le cas habituel quand vous faites boucler un indice autour d'une liste — ne combattez pas la règle de signe, neutralisez-la :
' Tombe toujours dans 0 .. b-1, quel que soit le signe de a
result = ((a Mod b) + b) Mod b
Debug.Print ((-7 Mod 3) + 3) Mod 3 ' 2 - la reponse de la feuille, a dessein
La leçon n'est pas « VBA a tort ». Elle est : quand des négatifs peuvent apparaître, décidez du signe que
vous voulez et construisez-le — ne présumez pas que le Mod de VBA correspond à la cellule d'où vous avez
copié.
Les idiomes à mémoriser
La plupart des usages réels de Mod relèvent d'une poignée de motifs. Apprenez ceux-ci et vous les
reconnaîtrez partout :
If n Mod 2 = 0 Then ... ' n est-il pair ? (impair = 1)
If i Mod 3 = 0 Then ... ' un element sur 3 (lignes en bandes, lots)
colour = palette(i Mod paletteCount) ' parcourt une liste fixe en bouclant
Le cas des lignes en bandes est là où Mod justifie sa place à l'intérieur d'une
boucle : ombrer une ligne sur trois, insérer un séparateur tous les dix
enregistrements, alterner une couleur avec i Mod 2. Chacun n'est que « le reste est-il nul ? » — le même
test dans des habits différents.
Le cas limite qui plante : la division par zéro
Un cas n'échoue pas en silence — il arrête la macro. x Mod 0 lève l'erreur d'exécution 11, « Division by
zero », exactement comme le ferait x / 0, parce que le reste est indéfini quand il n'y a rien par quoi
diviser. Si le diviseur peut valoir zéro (un décompte qui pourrait être vide, un pas fourni par
l'utilisateur), protégez-le d'abord :
If groupSize > 0 Then
If i Mod groupSize = 0 Then InsertSeparator i
End If
Un cas limite voisin est la taille : Mod travaille dans les types entiers de VBA, si bien que des opérandes
extrêmement grandes typées en Integer ou Long peuvent déborder. Si vous manipulez des valeurs au-delà
d'environ deux milliards, typez-les en LongLong (VBA 64 bits) ou en Double et laissez VBA arrondir à un
entier.
Comment ExcelMaster vous aide
Mod a l'air de l'opérateur le plus simple de VBA, et il cache trois pièges qui échouent tous sans
avertissement : un dividende négatif renverse le signe par rapport à la feuille d'où vous avez copié la
formule, une opérande décimale est arrondie en silence avant la division, et un diviseur qui glisse à zéro
arrête toute la macro avec l'erreur 11.
ExcelMaster vous laisse décrire le motif —
« insère un sous-total toutes les 12 lignes » ou « signale les factures aux numéros impairs » — et il écrit
le test de reste de la bonne façon : il enveloppe avec ((a Mod b) + b) Mod b quand vous avez besoin d'un
résultat non négatif, garde les opérandes entières à dessein, et protège le diviseur pour qu'un groupe vide
ne fasse jamais planter l'exécution. Vous gardez le classeur et le code.
Questions fréquentes
Pourquoi -7 Mod 3 donne-t-il -1 en VBA mais 2 sur la feuille ?
Parce que les deux utilisent des règles de signe différentes. L'opérateur Mod de VBA prend le signe du
dividende (l'opérande de gauche), donc -7 Mod 3 vaut -1. La fonction MOD de la feuille prend le
signe du diviseur, donc MOD(-7, 3) vaut 2. Pour obtenir en VBA la réponse toujours positive de la
feuille, écrivez ((a Mod b) + b) Mod b.
Mod est-il une fonction ou un opérateur en VBA ?
C'est un opérateur, comme + ou *. Vous écrivez a Mod b, pas Mod(a, b) — il n'y a ni parenthèses ni
virgule. Il s'insère dans une expression et renvoie le reste de la division entière de a par b.
Le Mod de VBA fonctionne-t-il avec des décimales ?
Pas directement — VBA arrondit ses deux opérandes à des entiers avant de prendre le reste, si bien que
6.7 Mod 3 se comporte comme 7 Mod 3 et renvoie 1. Si vous avez besoin d'un vrai reste fractionnaire,
calculez-le vous-même avec a - Int(a / b) * b.
Comment vérifier si un nombre est pair ou impair en VBA ?
Utilisez le reste modulo 2 : If n Mod 2 = 0 est vrai pour les nombres pairs et faux (reste 1) pour les
impairs. Le même motif, i Mod k = 0, teste « un sur k » pour n'importe quel k — une ligne sur trois, un
enregistrement sur dix, et ainsi de suite.
Que se passe-t-il si j'utilise Mod avec zéro ?
x Mod 0 lève l'erreur d'exécution 11, « Division by zero », parce que le reste est indéfini sans diviseur.
Si le diviseur peut valoir zéro — un décompte vide ou un pas fourni par l'utilisateur — vérifiez-le avec
If divisor > 0 Then avant d'utiliser Mod.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 18/09/2026.
Guides associés : VBA Round · VBA Rnd · VBA For Loop · VBA If Then Else · VBA WorksheetFunction
