数値が偶数/奇数か判定する方法を解説します。
シート関数の「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を返します。
リファレンスもたまに嘘をつきますので、
疑わしいときはしっかり検証していきましょう。