和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Mod演算子(VBA)とMOD関数(Excel)の違い

VBAで使用できる演算子「Mod演算子」と、
Excelで使用できるシート関数「MOD関数」の違いを解説します。

同じところ

どちらも剰余(○を△で割った余り)を計算します。

8を3で割った余りを求める場合は、
以下の二つは同じく「2」を返します。

剰余 = 8 Mod 3
[A1セル] =MOD(8,3)

違うところ

まずは「演算子」と「関数」という違いがありますので、

判定数 Mod 除数
MOD(判定数,除数)

という記述の違いがあります。


また、正の整数下では計算結果に違いはないのですが、
「小数と負の数での挙動が異なる」という性質もあります。

  • Mod演算子(VBA)は負の数を渡すと結果が負の数になる
  • MOD関数(Excel)は負の数を渡しても結果は正の数になる
  • Mod演算子(VBA)は小数を渡すと四捨五入(正確には銀行丸め)される
  • MOD関数(Excel)は小数を渡しても小数を含めた余りが計算される

使い分け

そもそもWorksheetFunction.Modがありませんので、
使い分けたくても使い分けることができません。

VBAならMod演算子、ExcelならMOD関数を使用して下さい。


その上で、Modの剰余計算は「周期的な処理」を実行する場合に使われます。

' 何らかの3パターンでループするコード
Select Case 判定数 Mod 3
Case 0
Case 1
Case 2
End Select

判定数が負の数になる可能性があるならこのSelect Caseは正しく機能しない
ことに注意して下さい。

対策する場合はExcelのMOD関数を用いることはできませんので、
絶対値を求めるABS関数をかませて使用してください。

おまけ:小数・負の数に対する挙動まとめ

Mod(剰余)計算は基本的に正の整数で行うべきものであり、
負の数や小数に対する計算はなるべく避けるべきです。

判定値に負の値が渡ってしまうことは上記の通り致し方ないこともありますが、
小数を渡したり、あろうことか除数に負の値を渡すことはなるべくしてはいけません。


ということで、以下の検証はおまけとして付録します。

特に解説もしませんので、何となく眺めてみてください。

判定値 除数 Mod(VBA) MOD(Excel)
-5 2 -1 1
-4 2 0 0
-3 2 -1 1
-2 2 0 0
-1 2 -1 1
0 2 0 0
1 2 1 1
2 2 0 0
3 2 1 1
4 2 0 0
5 2 1 1
判定値 除数 Mod(VBA) MOD(Excel)
-5 -2 -1 -1
-4 -2 0 0
-3 -2 -1 -1
-2 -2 0 0
-1 -2 -1 -1
0 -2 0 0
1 -2 1 -1
2 -2 0 0
3 -2 1 -1
4 -2 0 0
5 -2 1 -1
判定値 除数 Mod(VBA) MOD(Excel)
-2 2 0 0
-1.9 2 0 0.1
-1.8 2 0 0.2
-1.7 2 0 0.3
-1.6 2 0 0.4
-1.5 2 0 0.5
-1.4 2 -1 0.6
-1.3 2 -1 0.7
-1.2 2 -1 0.8
-1.1 2 -1 0.9
-1 2 -1 1
-0.9 2 -1 1.1
-0.8 2 -1 1.2
-0.7 2 -1 1.3
-0.6 2 -1 1.4
-0.5 2 0 1.5
-0.4 2 0 1.6
-0.3 2 0 1.7
-0.2 2 0 1.8
-0.1 2 0 1.9
0 2 0 0
0.1 2 0 0.1
0.2 2 0 0.2
0.3 2 0 0.3
0.4 2 0 0.4
0.5 2 0 0.5
0.6 2 1 0.6
0.7 2 1 0.7
0.8 2 1 0.8
0.9 2 1 0.9
1 2 1 1
1.1 2 1 1.1
1.2 2 1 1.2
1.3 2 1 1.3
1.4 2 1 1.4
1.5 2 0 1.5
1.6 2 0 1.6
1.7 2 0 1.7
1.8 2 0 1.8
1.9 2 0 1.9
2 2 0 0
判定値 除数 Mod(VBA) MOD(Excel)
-2 -2 0 0
-1.9 -2 0 -1.9
-1.8 -2 0 -1.8
-1.7 -2 0 -1.7
-1.6 -2 0 -1.6
-1.5 -2 0 -1.5
-1.4 -2 -1 -1.4
-1.3 -2 -1 -1.3
-1.2 -2 -1 -1.2
-1.1 -2 -1 -1.1
-1 -2 -1 -1
-0.9 -2 -1 -0.9
-0.8 -2 -1 -0.8
-0.7 -2 -1 -0.7
-0.6 -2 -1 -0.6
-0.5 -2 0 -0.5
-0.4 -2 0 -0.4
-0.3 -2 0 -0.3
-0.2 -2 0 -0.2
-0.1 -2 0 -0.1
0 -2 0 0
0.1 -2 0 -1.9
0.2 -2 0 -1.8
0.3 -2 0 -1.7
0.4 -2 0 -1.6
0.5 -2 0 -1.5
0.6 -2 1 -1.4
0.7 -2 1 -1.3
0.8 -2 1 -1.2
0.9 -2 1 -1.1
1 -2 1 -1
1.1 -2 1 -0.9
1.2 -2 1 -0.8
1.3 -2 1 -0.7
1.4 -2 1 -0.6
1.5 -2 0 -0.5
1.6 -2 0 -0.4
1.7 -2 0 -0.3
1.8 -2 0 -0.2
1.9 -2 0 -0.1
2 -2 0 0