2010-12-07 2 views

ответ

30

Вы хотите mod operator.

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

a - (b * (a \ b)) 

Edited добавить:

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

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

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

+4

Вам лучше изменить `(a \ b)` for `Fix (a/b)`. В противном случае могут возникнуть проблемы с десятичными аргументами. Попробуйте свою формулу с `a = 1.75` и` b = 1`, и вы увидите мою мысль. – 2013-07-25 16:01:51

42

В vba функция MOD.

например
5 MOD 2 

Вот полезный link.

+4

+1 ссылка на VBA-страницу для `Mod` [здесь] (http://msdn.microsoft.com/en-us/library/office/gg264708%28v=office.14%29.aspx) – barrowc 2013-07-25 21:39:54

+0

mod не эквивалентен, потому что он не может вернуть плавающую точность, в отличие от функции excel. – johnzilla 2016-09-21 15:35:04

7

Мой путь к репликации в 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 модуль

4

Будьте очень осторожны с 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

1

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

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

будет решать: a - a

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

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

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

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

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

0

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

If i Mod 2 > 0 then 'this is an odd 
    'Do Something 
Else 'it is even 
    'Do Something Else 
End If 
Смежные вопросы