[VBA] Mod による剰余演算

 VBA では割り算の剰余を求めるために、関数ではなく Mod 演算子が用意されています。エクセルの MOD関数とは少し使い勝手が異なりますが、基本的な考え方は同じです。
 

Mod演算子

 Modモジュロ演算 (剰余) を実行します。
 a を b で割ったときの余りを求めて変数 i に代入するときは

i = a Mod b

のように記述します。たとえば 11 を 4 で割ったときの余りを求めるには次のようなコードを書きます。

'Mod演算子のサンプルコード[1]
Sub Mod1()
  Dim i As Integer
  i = 11 Mod 4
  MsgBox i
End Sub

 このマクロを実行すると「 3 」という値が表示されます。
 

MODの演算結果① a, b が非整数の場合

 Mod演算子のステートメント

i = a Mod b

において b が 0 の場合は( 0 で割ることになるので)エラーになるのは言うまでもありません。また a や b が整数でない場合はエラーにはなりませんが、「銀行丸め」によって強制的に整数に変えて計算を続行します。

「銀行丸め」は四捨五入とよく似ています。 10.3 であれば 10 に丸め、10.7 であれば 11 に丸めます。ただし 10.5 のときは「偶数である」10 のほうへ丸められます。 11.5 であれば「偶数である」12 のほうへ丸められます。たとえば 11 ÷ 2.5 という計算を考えたときに、

i = 11 Mod 2.5

と書くと、得られる値は 11 ÷ 2 を計算して余り「 1 」を得ます(四捨五入であれば 11 ÷ 3 の余りは 2 となるはずです)。実際に計算させるマクロを載せておくので試してみてください。

'Mod演算子のサンプルコード[2]
Sub Mod2()
  Dim i As Integer
  i = 11 Mod 2.5
  Debug.Print i
End Sub
1

 結果はイミディエイトウィンドウに表示されます。
 

MODの演算結果② a, b が負の場合

 整数論の話になりますが、11 を -2 で割ったときの商は -5 ですから、

11 = (-5) × (-2) + 1

のように書くことができます。この + 1 という部分が余りですから、VBA で

i = 11 Mod -2

とすれば「 1 」を得ることになります。同じように -11 を 3 で割ったときの商は -3 なので、

-11 = (-3) × 3 - 2

と書けて、余りが -2 であることがわかります。 VBA で

i = -11 Mod 3

と記述すると「 -2 」が返ります。実際のコードは次のようになります。

'Mod演算子のサンプルコード[3]
Sub Mod3()
  Dim i As Integer
  i = -11 Mod 3
  Debug.Print i
End Sub
-2

 計算結果はイミディエイトウィンドウに表示されます。
 

Modの使い方

 Mod演算子は主に数論分野を数値計算で扱うときに活躍します。ある数の約数を列挙したり、完全数や素数を見つけるためのマクロを書くときには、この Mod演算子が欠かせません。そうした「数論的な」マクロも折々に紹介していく予定なので、興味のある方は是非またこのサイトにお立ち寄りください。

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください