「エクセルvba mod関数の使い方」
という検索で、このサイト・インストラクターのネタ帳へのアクセスが時折あることに気づきました。
Excelのワークシート関数には、割り算をしたときの余りを求めるMOD関数があります。
例えば下図のように、A1セルに「5」・B1セルに「2」が入力されているとき、C1セルに
「=MOD(A1, B1)」
という数式を入力すると、
5を2で割った余りの「1」がC1セルに計算されます。
「エクセルvba mod関数の使い方」
という検索をした方は、このワークシート関数のMODと同じ働きをするVBA(Visual Basic for Applications)の関数を探していたのでしょうか。
あるいは、
ret = MOD(Range("A1").Value, Range("B1").Value)
といったコードを入力したものの構文エラーとなるので、どうすればいいのかを探していたのかもしれません。
VBAにはMod関数はない
この検索キーワードに対して、まずは杓子定規にお答えすると、MODという名前の関数はVBAには存在しません。
VBE(Visual Basic Editor)に付属するオブジェクトブラウザーで、ライブラリーを「VBA」にして、
[クラス]ペインで「グローバル」を選択したときに、
[メンバー]ペインに表示されるのが、VBAの関数です。
ですが、ここで「mo」ではじまるメンバーを探しても、下図のとおりModという名前は見当たりません。
オブジェクトブラウザーで非表示のメンバーを表示しても同じです。VBAにはMod関数は存在しないということです。
WorksheetFunctionオブジェクトにもMod関数はない
Excelマクロの経験がある程度ある方だと、WorksheetFunctionプロパティでWorksheetFunctionオブジェクトを取得することで、VBAからワークシート関数を使えることをご存知でしょう。
このことをご存知の方だと、VBAにMod関数がないのならば、WorksheetFunction.Modと記述してワークシート関数のMODを使えばいいのではないか、と考えるかもしれません。
これもダメです。
下図のとおり、ExcelライブラリーのWorksheetFunctionオブジェクトにModメソッドはありません。
VBAで余りを求めるのはMod演算子
では、VBAでは、割り算の余りを求められないのかというと、勿論そんなことはありません。
VBAには、割り算の余りを求めるMod演算子が用意されています。関数ではなく演算子です。
Dim ret As Long
ret = Range("A1").Value Mod Range("B1").Value
MsgBox ret
一般的な割り算は、
Dim ret As Single
ret = Range("A1").Value / Range("B1").Value
のような使い方をします。この割り算をする演算子「/」を、割り算の余りだけを計算する演算子「Mod」にすればOKです。
ワークシート関数のMOD関数をご存知の方なら、書き方は違いますが、すぐに使えるのではないかと思います。
負の値・マイナスの数値の場合は要注意
正の値・プラスの数値を扱う場合は、ワークシート関数のMODとVBAのMod演算子で違いはありませんが、負の値・マイナスの数値が関係した場合、結果が異なりますから注意が必要です。
例えば、
A1セルに「-5」・B1セルに「2」が入力されているとき
MOD関数を使った「MOD(A1, B1)」は「1」を返すのに対し、
Mod演算子を使った「Range("A1").Value Mod Range("B1").Value」は「-1」
を返します。
逆に、
A1セルに「5」・B1セルに「-2」が入力されているとき
MOD関数を使った「MOD(A1, B1)」は「-1」を返すのに対し、
Mod演算子を使った「Range("A1").Value Mod Range("B1").Value」は「1」を返します。
Home » エクセルマクロ・Excel VBAの使い方 » VBAで割り算の余りを求めるMOD関数は?