Чезареттин отметил, что функция рабочего листа MOD не может дать результат, если вычисляемое число 268 435 456 или больше, а делитель равен 2. Если число меньше этого, проблем нет. Например, если функция MOD (268435455, 2), проблем нет. Он интересуется, есть ли способ использовать функцию МОД с большими числами и делителем 2?

Проблема на самом деле больше, чем предлагает Цезареттин. Microsoft знает об этой проблеме; похоже, это связано с проблемами с внутренними формулами, используемыми MOD. Вы можете найти более подробную информацию об ошибке здесь:

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

Обычно функция MOD возвращает ошибку, если делитель (второй аргумент в функции MOD), умноженный на 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,728divisor. Для большинства применений этот предел достаточно велик, и он никогда не будет достигнут.

Если вам нужно найти только модуль числа, разделенного на 2, вы можете вставить проверку в формулу следующим образом:

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

Это проверяет, превышает ли оцениваемое число (в данном случае в ячейке A1) предел, и, если это так, вычитает предел из числа перед вычислением модуля. Вы также можете эффективно удалить ограничение MOD, используя эту формулу:

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

Это переводит большое число по модулю 2 в 16-ю степень, а затем принимает результирующее значение по модулю 2. Если числа рассматривать как двоичные, легко увидеть, что происходит. MOD (largenum, 2 ^ 16) просто отбрасывает все биты слева от 16-й двоичной цифры. Для модуля 2 в любом случае требуется только самая правая цифра для определения результата, поэтому отброшенные биты никогда не влияют на результат, независимо от значения.

Конечно, вы можете просто создать свою собственную функцию MOD в VBA и использовать ее в своих формулах вместо встроенной функции 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. Затем он полагается на функцию VBA Mod, которая не имеет таких же ограничений, как функция рабочего листа MOD.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (3302) применим к Microsoft Excel 97, 2000, 2002 и 2003.