excel VBA中向上舍入到最接近的大整数

flvtvl50  于 2023-02-25  发布在  其他
关注(0)|答案(5)|浏览(202)

我试图计算一件商品要堆放多少层。我有一个变量(iQty)、一个给定的货床宽度(dRTW)、一个商品单位宽度(dWidth)和一个每层数量(iLayerQty)。
每层工程量按iLayerQty = Int(dRTW/dWidth)计算
现在,我需要将总数量除以每层的数量,然后取整。在Excel公式中,这很容易,但我试图避免调用WorksheetFunction,以最大限度地减少A1/R1 C1混淆。目前,我用以下公式近似计算:

(Number of layers) = ((Int(iQty / iLayerQty) + 1)

大多数情况下,这种方法都很有效--除非数字给予整数(例如,货物宽度为0.5米,适合2.5米的拖车)。当然,在这种情况下,加上整数会破坏结果。
有没有什么简便的方法来调整这个公式,以获得一个更好的向上舍入?

piok6c0g

piok6c0g1#

我看不出有什么理由要避免WorksheetFunction;我看不出有什么误会。

Number_of_layers = WorksheetFunction.RoundUp(iQty / iLayerQty, 0)

您也可以滚动自己的函数:

Function RoundUp(ByVal Value As Double)
    If Int(Value) = Value Then
        RoundUp = Value
    Else
        RoundUp = Int(Value) + 1
    End If
End Function

这样称呼它:

Number_of_layers = RoundUp(iQty / iLayerQty)
du7egjpx

du7egjpx2#

如果使用WorksheetFunction object访问ROUNDUPCEILING函数是不可行的,那么通过一些数学运算也可以实现同样的目的。

Number of layers = Int(iQty / iLayerQty) - CBool(Int(iQty / iLayerQty) <> Round(iQty / iLayerQty, 14))

VBATrue在数学上相当于(-1)。VBA Round用于避免15位浮点错误。

dnph8jn4

dnph8jn43#

我使用-int(-x)来得到天花板。

?-int(-1.1)  ' get ceil(1.1)
2

?-int(1.1)   ' get ceil(-1.1)
-1

?-int(-5)    ' get ceil(5)
5
6g8kf2rb

6g8kf2rb4#

这些是我为此目的而组合在一起的函数。

Function RoundUp(ByVal value As Double) as Integer
    
    Dim intVal As Integer
    Dim delta As Double
       
    intVal = CInt(value)
    delta = intVal - value

    If delta < 0 Then
        RoundUp = intVal + 1
    Else
        RoundUp = intVal
    End If

End Function

Function RoundDown(ByVal value As Double) as Integer

    Dim intVal As Integer
    Dim delta As Double

    intVal = CInt(value) 
    delta = intVal - value

    If delta <= 0 Then
        RoundDown = intVal
    ElseIf delta > 0 Then
        RoundDown = intVal - 1   
    End If

End Function
mwkjh3gx

mwkjh3gx5#

这是我在VBA中的上限。
函数上限(ByVal数值为双精度,ByVal显著性为双精度)为双精度

Dim intVal As Long
Dim delta As Double
Dim RoundValue As Double
Dim PreReturn As Double
If Significance = 0 Then
    RoundValue = 1
Else
    RoundValue = 1 / Significance
End If
Number = Number * RoundValue

intVal = CLng(Number)
delta = intVal - Number

If delta < 0 Then
    PreReturn = intVal + 1
Else
    PreReturn = intVal
End If
Ceiling = PreReturn / RoundValue

结束功能

相关问题