VBA эквивалентна функции мод Excel - PullRequest
35 голосов
/ 07 декабря 2010

Есть ли vba, эквивалентная функции mod в excel?

Ответы [ 8 ]

56 голосов
/ 07 декабря 2010

В vba функция MOD. * 1001 например *

 5 MOD 2

Вот полезная ссылка .

34 голосов
/ 07 декабря 2010

Вы хотите мод оператора .

The expression a Mod b is equivalent to the following formula:

a - (b * (a \ b))

Отредактировано, чтобы добавить:

Есть некоторые особые случаи, которые вам, возможно, придется рассмотреть, потому что в Excel используется математика с плавающей запятой (и возвращает float), функция VBA которой возвращает целое число. Из-за этого использование mod с числами с плавающей запятой может потребовать дополнительного внимания:

  • Результаты Excel могут не соответствовать точно тому, что вы прогнозируете; здесь кратко об этом говорится (см. самый верхний ответ) и очень подробно здесь .

  • Как отмечает @ André в комментариях, отрицательные числа могут округляться в направлении, противоположном ожидаемому. Предложенная им функция Fix() объясняется здесь (MSDN) .

8 голосов
/ 01 марта 2012

Мой способ репликации Excel * MOD(a,b) в VBA - это использование XLMod(a,b) в VBA, где вы включаете функцию:

Function XLMod(a, b)
    ' This replicates the Excel MOD function
    XLMod = a - b * Int(a / b)
End Function

в вашем модуле VBA

7 голосов
/ 05 августа 2012

Будьте очень осторожны с функцией Excel MOD (a, b) и оператором VBA a Mod b.Excel возвращает результат с плавающей запятой, а VBA целое число.

В Excel = Mod (90.123,90) возвращает 0.123000000000005 вместо 0.123 В VBA 90.123 Mod 90 возвращает 0

Они, конечно, не эквивалентны!

Эквивалентными являются: В Excel: = Round (Mod (90.123,90), 3), возвращающие 0.123, и в VBA: ((90.123 * 1000) Mod 90000) / 1000, возвращающие также 0.123

3 голосов
/ 07 декабря 2010

Оператор Mod примерно соответствует функции MOD :

number Mod divisor примерно соответствует MOD(number, divisor).

0 голосов
/ 17 мая 2018
Function Remainder(Dividend As Variant, Divisor As Variant) As Variant
    Remainder = Dividend - Divisor * Int(Dividend / Divisor)
End Function

Эта функция всегда работает и является точной копией функции Excel.

0 голосов
/ 07 февраля 2017

Но если вы просто хотите определить разницу между нечетной итерацией и четной, это прекрасно работает:

If i Mod 2 > 0 then 'this is an odd 
   'Do Something
Else 'it is even
   'Do Something Else
End If
0 голосов
/ 30 июня 2016

Верхний ответ на самом деле неверен.

Предлагаемое уравнение: a - (b * (a \ b))

Решит до: a - a

Что, конечно, 0 во всех случаях.

Правильное уравнение:

a - (b * INT(a \ b))

Или, если число (a) может быть отрицательным, используйте это:

a - (b * FIX(a \ b))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...