VBA では割り算の剰余を求めるために、関数ではなく Mod 演算子が用意されています。エクセルの MOD関数とは少し使い勝手が異なりますが、基本的な考え方は同じです。
Mod演算子
VBA の Mod は モジュロ演算 (剰余演算) を実行します。
a を b で割ったときの余りを求めるときは「a Mod b」のように記述します。たとえば 11 を 4 で割ったときの余りを求めるには「11 Mod 4」ます。
'[VBA] Mod演算子のサンプルコード[1] Sub Modulo_1() Dim i As Integer i = 11 Mod 4 Debug.Print i End Sub 'Modulo_1の実行結果: '3
Mod 演算子のステートメント「a Mod b」において b が 0 の場合は( 0 で割ることになるので)エラーになるのは言うまでもありません。
また、a や b が整数でない場合はエラーにはなりませんが、銀行丸め によって強制的に整数に変えて計算を続行します。銀行丸めは四捨五入とよく似ています。10.3 であれば 10 に丸め、10.7 であれば 11 に丸めます。ただし 10.5 のときは「偶数である」10 のほうへ丸められます。 11.5 であれば「偶数である」12 のほうへ丸められます。たとえば 「11 Mod 2.5」と書くと、得られる値は 11 ÷ 2 を計算して余り「 1 」を得ます(四捨五入であれば 11 ÷ 3 の余りは 2 となるはずです)。実際に「11 Mod 2.5」計算させるマクロを載せておくので試してみてください。
'[VBA] Mod演算子のサンプルコード[2] Sub Modulo_2() Dim i As Integer i = 11 Mod 2.5 Debug.Print i End Sub 'Modulo_2の実行結果: '1
整数論の話になりますが、
のように書くことができます。この
と書けて、余りが
'[VBA] Mod演算子のサンプルコード[3] Sub Modulo_3() Dim i As Integer i = -11 Mod 3 Debug.Print i End Sub 'Modulo_3の実行結果: '-2
ベキ乗の除算の余りを求める手順
たとえば VBA の Mod 演算子で
'[VBA] Mod演算子のサンプルコード[4]
'2^100を13で割ったときの剰余を計算するマクロ
Sub Modulo_4()
Dim x As Long
Debug.Print (2 ^ 100) Mod 13
End Sub
Modulo_4() を実行するとオーバーフローしてしまいます。巨大数
を用います。
はもちろん成り立ちます。両辺に
となります。以下同様に両辺に
よって余りは
'[VBA] Mod演算子のサンプルコード[5] 'a^kをmで割ったときの余りを計算する関数 Function MOD_P(a As Long, k As Long, m As Long) Dim i As Long, x As Long x = 1 For i = 1 To k 'xにaを掛けてmで割って余りを求める x = a * x Mod m Next i MOD_P = x End Function
MOD_P 関数をワークシートで使用するときは
=MOD_P(a,k,m)
と入力します。たとえば
=MOD_P(5,8,7)
と入力すると「4」が返ります。もっと大きな数で試してみましょう。
=MOD_P(2,100,13)
と入力すると「3」が返ります。
エクセルや数学に関するコメントをお寄せください