Excel VBA

This page gently shows beginners how to use the Mod operator in Excel VBA to get the remainder of a division and to build simple periodic logic, such as checking even or odd numbers or running code every few times.

Mod

Excel VBA の Mod 演算子を使って、割り算の余りを求めたり、偶数・奇数判定や「何回ごとに実行する」といった周期的な処理を組み立てるための考え方と書き方を、はじめての人にも伝わるようにやさしくまとめたページです。

Mod とは?

Modは、一言で言うと、「割り算をしたときの余りを求めるための計算記号(演算子)」です。例えば、あなたがクッキーを 7枚持っていて、それを 2枚ずつ友達に分けたいとき、全部で何回分けられるか考えて、最後に余るクッキーが何枚になるかを知りたいとします。この「最後に余るクッキー」を計算するのが Modの役割です。

シンプルな例で考えてみましょう。

VBA で Mod を使うときの基本形は、次のようになります。

VBA

結果 = 数値1 Mod 数値2

「右側の 数値1 Mod 数値2 を計算して、その答え(余り)を左側の 結果 に入れる」というイメージです。例えば 結果 = 7 Mod 2 と書けば、結果 には「1」が入ります。

Excel VBAでは、この Modを使ってプログラミングの中で計算ができます。たとえば、特定の行動を一定の周期で繰り返したい時や、何かを均等に分けられなかったときの処理を書くときに便利です。

ひとつだけ気をつけたいのは、「0 で割ってはいけない」という点です。例えば 10 Mod 0 のように 0 を使うと、VBA では「実行時エラー '11'(0 で除算しました)」というエラーになってしまいます。

また、負の数を使ったときの挙動も少しだけ独特です。ふつうに正の整数だけで使う分には気にしなくてかまいませんが、「マイナスの値を含む複雑な計算」に使う場合は、結果の符号(プラス/マイナス)が期待どおりかどうかをデバッグプリントなどで確認するのがおすすめです。

例えばこんなコード。

VBA

If i Mod 2 = 0 Then
		' iが2で割り切れる(偶数の)時の処理
	Else
		' iが2で割り切れない(奇数の)時の処理
	End If

このコードは、「もし i が 2 で割り切れるなら(つまり偶数なら)、ある処理をする。そうでない場合(奇数なら)、別の処理をする」という意味になります。

Modはとてもシンプルですが、プログラミングで様々な場面で役立ちます。例えば、周期的な処理の必要がある時や、何かを分配してその余りを知りたい時など、実生活の問題を解決するのに使える便利なツールです。この「余りを求める」概念は、日常生活で自然と使っているものですから、Excel VBAで Modを使うのも、それほど難しいことではありません。

Mod に関するよくある質問

Q. Mod は「関数」ですか?「演算子」ですか?
A. VBA では Mod は「演算子(計算記号)」です。結果 = 7 Mod 2 のように、式の中で使います。ワークシート関数の MOD とは見た目が似ていますが、VBA では関数ではなく演算子として扱われます。
Q. Mod で小数は扱えますか?
A. 小数を使っても動作しますが、内部では割り算の結果から「整数部分」を取り出して計算しているイメージになります。基本的には「整数同士の割り算の余り」を求める用途に絞って使うと、安全でわかりやすいです。
Q. 商(割り算の答え)も一緒に取りたいです。
A. 商だけが欲しい場合は、VBA の整数の割り算演算子 \ を使います。商と余りの両方が欲しい場合は、商 = a \ b余り = a Mod b の 2 行を書くのが簡単です。
Q. 偶数・奇数判定以外にはどんな使い道がありますか?
A. 「何件ごとに処理する」「何行ごとに色を変える」「カウンタが一定値に達したらリセットする」といった「一定周期で何かをしたい」場面でよく使われます。例えば If i Mod 10 = 0 Then と書けば、「10 回ごとに実行する」という条件になります。
Q. 0 を使うとどうなりますか?
A. a Mod 0 のように 0 を使うと、「実行時エラー '11'(0 で除算しました)」が発生します。割る数(右側)は必ず 0 以外の値を指定してください。

Mod でよくあるエラー早見表

実行時エラー '11'(0 で除算しました)
原因:a Mod 0 のように、割る数として 0 を指定している。
対処:割る数を 0 以外の値にする。ユーザー入力の場合は、0 のときは別のメッセージを出すように条件分岐する。
実行時エラー '6'(オーバーフロー)
原因:非常に大きな数や、想定外の値が入り、内部で扱える整数の範囲を超えた。
対処:扱う値の桁数を見直す、途中の値を Long 型にしておくなどして、範囲外の値にならないようにする。
実行時エラー '13'(型が一致しません)
原因:文字列や日付など、数値以外の型をそのまま Mod で計算しようとしている。
対処:Mod に渡す前に CLngCDbl などで数値に変換するか、入力チェックを行う。