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

VBA Mod dans Excel — l'opérateur de reste, les négatifs et le piège du signe

|

VBA Mod dans Excel — l'opérateur de reste, les négatifs et le piège du signe

TL;DRMod vous donne le reste après division entière : 7 Mod 3 vaut 1. C'est un opérateur, pas une fonction, alors vous écrivez a Mod b sans parenthèses. Deux choses surprennent : VBA arrondit d'abord ses deux opérandes à des entiers (6.7 Mod 3 se comporte comme 7 Mod 3), et le résultat prend le signe du dividende — le nombre de gauche — si bien que -7 Mod 3 vaut -1, et non le 2 de 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 3 vaut -1 en VBA mais 2 sur 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 0 lè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