有没有相当于excel的
mod
功能的vba?
您需要 mod 运算符。
The expression a Mod b is equivalent to the following formula:
a - (b * (a \ b))
编辑添加:
您可能需要考虑一些特殊情况,因为 Excel 使用浮点数学(并返回
float
),而 VBA 函数返回整数。因此,将 mod
与浮点数一起使用可能需要额外注意:
Excel 的结果可能与您的预测不完全一致; 这里简要介绍了这一点(参见最上面的答案),并详细介绍了这里。
正如@André 在评论中指出的那样,负数可能会与您期望的方向相反。他建议的
Fix()
功能在 这里 (MSDN) 进行了解释。我在 VBA 中复制 Excel 的
MOD(a,b)
的方法是在包含函数的 VBA 中使用 XLMod(a,b)
:
Function XLMod(a, b)
' This replicates the Excel MOD function
XLMod = a - b * Int(a / b)
End Function
在您的 VBA 模块中
使用 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
Function Remainder(Dividend As Variant, Divisor As Variant) As Variant
Remainder = Dividend - Divisor * Int(Dividend / Divisor)
End Function
此函数始终有效,并且是 Excel 函数的精确副本。
但是,如果您只想区分奇数迭代和偶数迭代之间的区别,那么这很好用:
If i Mod 2 > 0 then 'this is an odd
'Do Something
Else 'it is even
'Do Something Else
End If
原本均匀 XLMod = (a - (b * Int(a / b))) 给了我不正确的结果,所以..
Function XLMod(a, b As Long)
' This replicates the Excel MOD function - the VBA mod function returns an integer
Dim templong As Long
templong = (b * Int(a / b))
XLMod = (a - templong)
End Function
最上面的答案实际上是错误的。
建议的方程:
a - (b * (a \ b))
将解决:
a - a
当然在所有情况下都是 0。
正确的方程式是:
a - (b * INT(a \ b))
或者,如果数字 (a) 可以为负数,请使用:
a - (b * FIX(a \ b))