VBA:四舍五入到数字的最近倍数

VBA:四舍五入到数字的最近倍数,vba,ms-access,Vba,Ms Access,但我需要一个VBA函数。我试着把C++函数转换成VBA,但是它没有返回正确的值。 我需要一个执行以下操作的函数: 综述(23.90,5) “返回25 综述(23.90,10) “返回30 综述(23.90,20) “返回40 综述(23.90,50) “返回50 综述(102.50,5) '返回105 综述(102.50,20) 返回120 这是我到目前为止所拥有的。它在大多数情况下都有效,但对于小于倍数0.5的数字,它返回的值不正确。因此,问题似乎是如何计算余数值的舍入问题 Public F

但我需要一个VBA函数。我试着把C++函数转换成VBA,但是它没有返回正确的值。 我需要一个执行以下操作的函数:

综述(23.90,5)
“返回25
综述(23.90,10)
“返回30
综述(23.90,20)
“返回40
综述(23.90,50)
“返回50
综述(102.50,5)
'返回105
综述(102.50,20)
返回120
这是我到目前为止所拥有的。它在大多数情况下都有效,但对于小于倍数0.5的数字,它返回的值不正确。因此,问题似乎是如何计算余数值的舍入问题

Public Function RoundUp(dblNumToRound为Double,lMultiple为Long)为Double
变暗rmndr为长
rmndr=dblNumToRound Mod lMultiple
如果rmndr=0,则
RoundUp=dblNumToRound
其他的
向上取整=向上取整(dblNumToRound)+lMultiple-rmndr
如果结束
端函数
例如:

综述(49.50,50)
'返回49.50,因为rmndr=0

我只需除以
l倍数
,四舍五入再相乘

假设您确实总是想进行四舍五入(也适用于负数):

Public Function RoundUp(dblNumToRound为Double,lMultiple为Long)为Double
Dim asDec作为变体
变圆
asDec=CDec(dblNumToRound)/L倍数
四舍五入=整数(asDec)
如果四舍五入为12,则
四舍五入=四舍五入+1
如果结束
四舍五入=四舍五入*L倍数
端函数
我实际上不是VBA程序员,所以这可能需要一个或两个经过调整的逗号。然而,重要的是:

  • 使用十进制(变量子类型)表示精度
  • 让VB帮你算算

我只需除以
l倍数
,四舍五入再相乘

假设您确实总是想进行四舍五入(也适用于负数):

Public Function RoundUp(dblNumToRound为Double,lMultiple为Long)为Double
Dim asDec作为变体
变圆
asDec=CDec(dblNumToRound)/L倍数
四舍五入=整数(asDec)
如果四舍五入为12,则
四舍五入=四舍五入+1
如果结束
四舍五入=四舍五入*L倍数
端函数
我实际上不是VBA程序员,所以这可能需要一个或两个经过调整的逗号。然而,重要的是:

  • 使用十进制(变量子类型)表示精度
  • 让VB帮你算算

一个简单得多的解决方案是在四舍五入之前将数字加上.5:

1.1 -> Round(1.1+.5, 0) -> 2

一个简单得多的解决方案是在四舍五入之前将数字加上.5:

1.1 -> Round(1.1+.5, 0) -> 2

VBA代码的宿主是什么?Excel?还有,什么是“向上”?
RoundUp(-2.4,1)
将是
-3
还是
-2
?在我的情况下,函数不会用于负值,但您的问题在其他上下文中可能非常重要。VBA主机是MS Access。我将相应地重新标记。VBA代码的宿主是什么?Excel?还有,什么是“向上”?
RoundUp(-2.4,1)
将是
-3
还是
-2
?在我的情况下,函数不会用于负值,但您的问题在其他上下文中可能非常重要。VBA主机是MS Access。我会相应地重新标记。是的,你的确实需要相当多的修改才能工作。CDec不是有效的函数,不能将值分配给与其维度声明位于同一行的变量。除此之外,我仍然从函数中得到不正确的值。我怀疑这可能与VBA中的银行家舍入有关,但我不确定。我没有使用舍入函数。。。还有,但它可能是特定于主机(Excel)的哦,不要使用
CInt
,因为它确实会进行舍入。我写
Int
是有原因的。如果您能找到它,您可能会幸运地使用
Fix
(参见示例)或类似
Floor
的东西是的,好的。我看到CDec是一个有效的函数,与我写的相反。顺便说一句,我使用的是MS Access 2010,我不确定我以前做错了什么,但现在它工作得很好。我确实修改了你的答案,使之成为有效的VBA。let语句无效,If语句中需要“Then”。是的,您的语句确实需要进行大量修改才能工作。CDec不是有效的函数,不能将值分配给与其维度声明位于同一行的变量。除此之外,我仍然从函数中得到不正确的值。我怀疑这可能与VBA中的银行家舍入有关,但我不确定。我没有使用舍入函数。。。还有,但它可能是特定于主机(Excel)的哦,不要使用
CInt
,因为它确实会进行舍入。我写
Int
是有原因的。如果您能找到它,您可能会幸运地使用
Fix
(参见示例)或类似
Floor
的东西是的,好的。我看到CDec是一个有效的函数,与我写的相反。顺便说一句,我使用的是MS Access 2010,我不确定我以前做错了什么,但现在它工作得很好。我确实修改了你的答案,使之成为有效的VBA。let语句无效,If语句中需要“Then”。