Cesarettinは、評価対象の数値が268,435,456以上で、除数が2の場合、MODワークシート関数は結果を生成できないと述べました。数値がこれより少ない場合は問題ありません。たとえば、関数がMOD(268435455、2)の場合、問題はありません。彼は、より大きな数と2の約数でMOD関数を使用する方法があるかどうか疑問に思います。

問題は実際にはCesarettinが提案するものよりも大きいです。 Microsoftはこの問題について知っています。これは、MODで使用される内部式の問題に起因しているようです。エラーの詳細については、

を参照してください。

http://support.microsoft.com/kb/119083

基本的に、MOD関数は、除数(MOD関数の2番目の引数)に134,217,728を掛けた値が、評価される数(MOD関数の最初の引数)以下の場合にエラーを返します。

したがって、この問題は、評価される数が268,435,456で除数が2の場合に発生します。評価される数は402,653,184であり、除数は3であり、評価される数は536,870,912であり、除数は4です。

Microsoftが提案する解決策は、MOD関数を使用せず、代わりに次の式に依存することです。

=number-(INT(number/divisor)*divisor)

ただし、これが唯一の解決策ではありません。使用できる他の定型的なアプローチもあります。例:

=MOD(MOD(number,134217728*divisor),divisor)

これにより、MODの制限よりもはるかに大きい数が解決されますが、理論的には、評価される数が134,217,728134,217,728除数に達すると同じ問題が発生します。ほとんどの用途では、この制限は十分に大きいため、到達することはありません。

数値を2で割った値のモジュラスを見つけるだけでよい場合は、次の方法で数式にチェックを挿入できます。

=MOD(IF(A1>=268435456,A1-268435456,A1),2)

これにより、評価される数値(この場合はセルA1)が制限よりも大きいかどうかがチェックされ、大きい場合は、係数を計算する前に数値から制限が差し引かれます。次の式を使用して、MOD制限を効果的に削除することもできます。

=MOD(MOD(number,2^16),2))

これは、2を法とする大きな数の16乗を取り、次に2を法とする結果の値を取ります。数を2進数として表示すると、何が起こっているかを簡単に確認できます。 MOD(largenum、2 ^ 16)は、16番目の2進数の左側にあるすべてのビットをドロップするだけです。モジュロ2の場合、結果を決定するために必要なのは右端の桁のみであるため、値に関係なく、ドロップされたビットが結果に影響を与えることはありません。

もちろん、VBAで独自のMOD関数を作成し、組み込みのMOD関数の代わりに数式で使用することもできます。

Function DblMod(Dividend, Divisor)

' Declare two double precision variables     Dim D1 As Double     Dim D2 As Double

' Copy function arguments to local variables     D1 = Dividend     D2 = Divisor

DblMod = D1 Mod D2 End Function

この関数を使用すると、VBA関数に2つの引数を渡すことができます。次に、VBA Mod関数に依存します。これには、MODワークシート関数と同じ制限はありません。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(3302)は、Microsoft Excel 97、2000、2002、および2003に適用されます。