和風スパゲティのレシピ

日本語でコーディングするExcelVBA

値が偶数/奇数か調べる - IsEven/IsOdd/Mod

数値が偶数/奇数か判定する方法を解説します。

シート関数の「ISEVEN関数」「ISODD関数」を使用する方法と、
Mod演算子を使用する方法の2つの方法があります。

WorksheetFunction.IsEven/IsOdd を使用する

シート関数の「ISEVEN」「ISODD」をWorksheetFunctionから呼び出せば、
ストレートに偶奇判定を行うことができます。

' 値が偶数なら処理を実行
If WorksheetFunction.IsEven(数値) Then

' 値が奇数なら処理を実行
If WorksheetFunction.IsOdd(数値) Then

一応IsEven = Falseで奇数の判定を行うこともできますが、
どう考えても紛らわしいだけですのでその記載は避けましょう。

Mod演算子を使用する

ある数を割ったときの余りをもとめる「Mod演算子」を使用し、
「2で割ったときの余りが0か1か」で偶奇判定を行うこともできます。

' 値が偶数なら処理を実行
If 数値 Mod 2 = 0 Then

' 値が奇数なら処理を実行
If 数値 Mod 2 <> 0 Then

IsEven/IsOddの方が簡潔に読めるコードのためそちらでよさそうですが、
Mod演算子は当然ながら「3の倍数か」も判定ができます。

こちらの方が汎用性がありますのでこちらも覚えておきましょう。


ただし注意しなければいけないのが、数値が負の値の時で、
負の値を受け取ったMod演算子は負の値を返します。

よって、

' 値が奇数なら処理を実行
If 数値 Mod 2 = 1 Then

このコードでは「-1」が奇数判定されませんので、
負の数を扱う場合は注意して下さい。

正の整数以外に実行した場合

先ほどのサンプルは「数値」に対して実行していましたが、
これが「正の整数」ではなかったときの結果も記載しておきます。

まずは「IsEven/IsOdd」ですが、こちらは負の数でも動き、
小数の場合は「小数点以下を切り捨てた値」を判定します。

Debug.Print WorksheetFunction.IsEven(-1) ' False
Debug.Print WorksheetFunction.IsEven(-2) ' True
Debug.Print WorksheetFunction.IsEven(1.1) ' False
Debug.Print WorksheetFunction.IsEven(1.2) ' False
Debug.Print WorksheetFunction.IsEven(1.8) ' False
Debug.Print WorksheetFunction.IsEven(2.2) ' True
Debug.Print WorksheetFunction.IsEven(2.8) ' True
Debug.Print WorksheetFunction.IsEven(-1.1) ' False
Debug.Print WorksheetFunction.IsEven(-1.2) ' False
Debug.Print WorksheetFunction.IsEven(-1.8) ' False
Debug.Print WorksheetFunction.IsEven(-2.2) ' True
Debug.Print WorksheetFunction.IsEven(-2.8) ' True

Debug.Print WorksheetFunction.IsOdd(-1) ' True
Debug.Print WorksheetFunction.IsOdd(-2) ' False
Debug.Print WorksheetFunction.IsOdd(1.1) ' True
Debug.Print WorksheetFunction.IsOdd(1.2) ' True
Debug.Print WorksheetFunction.IsOdd(1.8) ' True
Debug.Print WorksheetFunction.IsOdd(2.2) ' False
Debug.Print WorksheetFunction.IsOdd(2.8) ' False
Debug.Print WorksheetFunction.IsOdd(-1.1) ' True
Debug.Print WorksheetFunction.IsOdd(-1.2) ' True
Debug.Print WorksheetFunction.IsOdd(-1.8) ' True
Debug.Print WorksheetFunction.IsOdd(-2.2) ' False
Debug.Print WorksheetFunction.IsOdd(-2.8) ' False

 
続いてMod演算子ですが、先ほどの通り「負の数には負の数を」返し、
小数については「銀行丸め」が行われます。

Debug.Print -1 Mod 2 ' -1
Debug.Print -2 Mod 2 ' 0
Debug.Print -3 Mod 2 ' -1
Debug.Print -4 Mod 2 ' 0
Debug.Print 2.2 Mod 2 ' 0
Debug.Print 2.4 Mod 2 ' 0
Debug.Print 2.6 Mod 2 ' 1
Debug.Print 2.8 Mod 2 ' 1
Debug.Print 1.5 Mod 2 ' 0
Debug.Print 2.5 Mod 2 ' 0
Debug.Print 3.5 Mod 2 ' 0
Debug.Print 4.5 Mod 2 ' 0
Debug.Print -2.2 Mod 2 ' 0
Debug.Print -2.4 Mod 2 ' 0
Debug.Print -2.6 Mod 2 ' -1
Debug.Print -2.8 Mod 2 ' -1
Debug.Print -1.5 Mod 2 ' 0
Debug.Print -2.5 Mod 2 ' 0
Debug.Print -3.5 Mod 2 ' 0
Debug.Print -4.5 Mod 2 ' 0

「IsEven/IsOdd」が切り捨てなのに対し、
Mod演算子は銀行丸めなので注意してください。


といっても、そもそも偶奇判定は整数に対して行うべきものです。

どちらかと言えば、
「誤ってDouble型が渡ってしまわないよう注意して運用してください」
というのが正しい注意書きと思います。


あとおまけになりますが、Mod演算子のMicrosoftリファレンスには、

いずれかの数が浮動小数点数の場合は、まず整数に四捨五入されます。

と記載されていました。
learn.microsoft.com


上記検証の通り正しくは「銀行丸め」であり、
近い偶数によせるため「X.5」は必ず0を返します。


リファレンスもたまに嘘をつきますので、
疑わしいときはしっかり検証していきましょう。