【VBAの割り算】商と余りの求め方は?3つの演算子の違いを解説

【VBAの割り算】商と余りの求め方は?3つの演算子の違いを解説

VBAで割り算をしたら、思っていたのと違う数字が返ってきた…
商だけ・余りだけを取り出したいときって、どう書けばいいんだろう?

VBAの割り算でつまずく人、けっこう多いんですよね。

原因はシンプルで、VBAには割り算の演算子が3つあるからです。
/ しか知らないと「小数を出したくないのに出る」「余りが取れない」で手が止まります。

この記事では、/ ・ \ ・ Mod の3つを、結果がどう変わるかという視点で整理します。
負の数や小数を渡したときのクセ、0で割ったときのエラー対策までまとめました。

この記事でわかること
  • VBAの割り算に使う3つの演算子の違い
  • 商だけ・余りだけを取り出す書き方
  • 負の数・小数を渡すと結果がズレる理由
  • 0除算エラーの避け方と、IntとFixの使い分け

割り算にかぎらず、VBAの演算子を一覧で押さえておきたい方は、先にこちらをどうぞ。

VBAの割り算は3つの演算子で結果が変わる

まずは結論から。同じ「7を2で割る」でも、使う演算子で答えが変わります。

Sub test()
    '//小数まで求める
    Debug.Print 7 / 2       '//→ 3.5

    '//商だけ求める
    Debug.Print 7 \ 2       '//→ 3

    '//余りだけ求める
    Debug.Print 7 Mod 2     '//→ 1
End Sub

3.5・3・1。全部「7÷2」なのに答えが違いますね。

つまり、先に「何が欲しいのか」を決めてから演算子を選ぶのがコツです。

バックスラッシュの表示について

\ はバックスラッシュです。日本語環境のフォントでは「¥(円マーク)」に見えることがありますが、同じ文字なのでそのまま入力してOKです。

3つの演算子の使い方と書き方

ここからは1つずつ見ていきます。

1. スラッシュ|小数まで含めた割り算

いわゆる普通の割り算です。割り切れなければ小数で返ってきます。

Sub test()
    Debug.Print 10 / 4      '//→ 2.5
    Debug.Print 1 / 3       '//→ 0.333333333333333
End Sub

注意したいのは、/ の結果は小数を扱える型で返るという点。
これを Long 型の変数に入れると、切り捨てではなく整数へ丸められます(3.5 は 4 になります)。この落とし穴は後半でくわしく取り上げます。

2. バックスラッシュ|商だけを取り出す整数除算

\ は整数除算と呼ばれ、割り算の商だけを返します。

Sub test()
    Debug.Print 10 \ 4      '//→ 2
    Debug.Print 17 \ 5      '//→ 3
End Sub

「10個のリンゴを4人で分けたら1人何個?」のような、あまりを切り捨てて考えたい場面で使います。

Int(10 / 4) と書いても同じ結果になりますが、同じになるのは0以上の整数を渡したときだけです。
負の数や小数が混ざると両者の結果はズレるので、そこは次の章で整理します。

3. Mod|余りだけを取り出す

Mod は演算子ですが、書き方は英単語です。割り算の余りを返します。

Sub test()
    Debug.Print 10 Mod 4    '//→ 2
    Debug.Print 17 Mod 5    '//→ 2
End Sub

Mod の定番の使い道は、「割り切れるかどうか」の判定です。

Sub test()
    Dim i As Long

    For i = 1 To 10
        '//2で割った余りが0=偶数
        If i Mod 2 = 0 Then
            Debug.Print i & "は偶数"
        End If
    Next i
End Sub

「3行ごとに色を変える」「5件ごとに区切りを入れる」といった処理も、Mod があれば1行で書けます。

らるじゅらるじゅ

Modは地味ですが、一覧表を扱うVBAだと出番がかなり多い演算子です。
偶数判定と「n件ごと」の2パターンだけでも覚えておくと便利ですよ。

負の数・小数を渡したときの挙動に注意

\ と Mod は整数向けの演算子なので、負の数や小数を渡すとクセが出ます。
ここを知らないと「バグっているのでは?」と悩むことになるので、先に押さえておきましょう。

小数は計算前に整数へ丸められる

\ と Mod は、計算する前に左右の値が整数へ丸められます。
「割ってから切り捨て」ではないので、直感とズレることがあります。

これは仕様として明記されていて、Microsoft のリファレンスでは \ について「除算が実行される前に、数値式は Byte、Integer、または Long 式に丸められます」、Mod について「浮動小数点数は整数に四捨五入されます」と説明されています。

Sub test()
    '//7.5が8に丸められてから÷2される
    Debug.Print 7.5 \ 2     '//→ 4(3ではない)

    '//12.6が13に丸められてから計算される
    Debug.Print 12.6 Mod 5  '//→ 3(2.6でも2でもない)
End Sub

対策はシンプルで、小数のまま渡さないことに尽きます。
どちらに丸められるかを覚えるより、Int や Fix で先に整数化してから \ や Mod に渡すほうが事故りません。

仕様の原文を確認したい方は、こちらもあわせてどうぞ。

負の数の切り捨て方向と、余りの符号

負の数の場合、\ は0に近づく方向へ切り捨てます。
また Mod の余りの符号は、割られる数(左側)の符号に従います。

式結果ポイント
7 \ 23小数部を切り捨て
-7 \ 2-3-4ではなく0寄りの-3
7 Mod 21左が正なので余りも正
-7 Mod 2-1左が負なので余りも負
7 Mod -21右の符号は結果に影響しない

数学の剰余(つねに0以上)とは考え方が違うので、負の値が入りうる計算では符号のチェックが必要です。

用途別の使い分け早見表

3つの違いを1枚にまとめると、こうなります。

演算子書き方と結果主な使いどころ
/(小数を含む答え)7 / 2 → 3.5平均・比率・単価の計算
\(商だけ)7 \ 2 → 3個数の割り振り、ページ数の計算
Mod(余りだけ)7 Mod 2 → 1偶数判定、n件ごとの処理
どれを使えばいい?
  • 金額や比率など、小数が意味を持つ計算 → /
  • 「何人に配れるか」「何ページ必要か」など、個数を知りたい → \
  • 「割り切れるか」「あと何個あまるか」を知りたい → Mod
  • 商と余りを両方使いたいときは、\ と Mod をセットで使う

VBAの割り算でハマりやすい3つのポイント

最後に、初心者がつまずきやすいところを3つ挙げておきます。

1. 0で割ると実行時エラーになる

3つの演算子はいずれも、右側が0だと実行時エラー(実行時エラー11「0 で除算しました」)で止まります。

変数を使って割る場合は、割る前に0チェックを入れるのが基本です。

Sub test()
    Dim total As Long
    Dim count As Long

    total = 100
    count = 0

    If count = 0 Then
        Debug.Print "件数が0のため計算できません"
    Else
        Debug.Print total \ count
    End If
End Sub

条件分岐の書き方そのものが不安な方は、こちらもあわせてどうぞ。

2. 整数型の変数に入れると勝手に丸められる

/ の結果を Long 型の変数に入れると、代入の時点で丸められます。

Sub test()
    Dim answer As Long

    answer = 7 / 2
    Debug.Print answer      '//→ 4(3.5が丸められる)
End Sub

小数のまま扱いたいなら Double 型で受けましょう。
逆に、切り捨てた整数が欲しいだけなら \ を使うほうが意図が明確です。

型の考え方があいまいなときは、変数の記事もどうぞ。

3. IntとFixは切り捨ての方向が違う

小数を整数にする関数として Int と Fix がありますが、負の数での挙動が違います。

関数2.5 の結果-2.5 の結果切り捨ての方向
Int2-3小さいほう(マイナス方向)
Fix2-20に近いほう

正の数ではどちらも同じ結果になるため、負の数が入ってきたときに初めてバグとして表面化するのが厄介なところ。

「0方向に切り捨てたい」なら Fix、「必ず小さいほうへ」なら Int と覚えておくと迷いません。

まとめ|VBAの割り算は3つの演算子で覚える

VBAの割り算は、/ ・ \ ・ Mod の3本立てです。

「小数まで欲しいのか」「商だけなのか」「余りだけなのか」を先に決めれば、どれを使うかは自動的に決まります。
あとは、負の数と小数のクセ、そして0除算だけ気をつければ大きな事故は防げるはずです。

この記事のまとめ
  • VBAの割り算は /(小数まで)・\(商)・Mod(余り)の3つ
  • \ と Mod は計算前に値が整数へ丸められるため、小数は先に Int や Fix で整数化しておく
  • \ は0に近づく方向へ切り捨て、Mod の符号は左側の値に従う
  • 右側が0だと実行時エラーになるため、事前の0チェックが必要
  • 切り捨てには Int(マイナス方向)と Fix(0方向)の違いがある
らるじゅらるじゅ

割り算は「たかが四則演算」と思われがちですが、実務のVBAでは意外とバグの温床になります。
3つの演算子を使い分けられるようになると、コードがぐっと読みやすくなりますよ。一緒にがんばりましょう!