如何在 excel/vba 中进行特殊类型的舍入

How to do a special type of rounding in excel/vba

我必须在 excel 中为我的学校项目进行特殊类型的舍入。

如果数字大于#.5,我必须将其四舍五入。 如果数字等于#.5,我必须将它四舍五入到最接近的偶数。 如果数字小于 #.5,我必须将其四舍五入。

我希望有人能帮助我。

Dim getal As Decimal = Nothing
    Console.WriteLine("voer een nummer in")
    getal = Console.ReadLine()

    Dim dec As Integer = Nothing
    Console.WriteLine("voer het aantal deciale in")
    dec = Console.ReadLine()

    Dim factor As Integer = 0
    Dim floor As Decimal = 0
    Dim decimaal As Decimal = 0
    Dim antwoord As Decimal = 0
    Dim percentage As Decimal = 0
    Dim GetalTimesFactor As Decimal = 0
    Dim OnNoukeurigheid As Decimal = 0
    Dim VerFactor As Integer = 0
    Dim HasFactor As Boolean = False
    Dim notation As String = Nothing
    Dim RoundUp As Decimal = 0

    If getal > 1000 Then
        While getal > 10
            getal = getal / 10
            VerFactor = VerFactor + 1
            HasFactor = True
        End While
        Console.WriteLine("getal: " & getal)


    End If

    If getal < 0.0001 Then
        While getal < 1
            getal = getal * 10
            VerFactor = VerFactor - 1
            HasFactor = True
        End While
    End If

    Select Case dec
        Case 0
            factor = 1
            OnNoukeurigheid = 0.5
            RoundUp = 1
        Case 1
            factor = 10
            OnNoukeurigheid = 0.05
            RoundUp = 0.1
        Case 2
            factor = 100
            OnNoukeurigheid = 0.005
            RoundUp = 0.01
        Case 3
            factor = 1000
            OnNoukeurigheid = 0.0005
            RoundUp = 0.001
    End Select

    GetalTimesFactor = getal * factor
    floor = Decimal.Floor(GetalTimesFactor)
    floor = floor / factor
    decimaal = getal - floor
    Console.WriteLine("floor: " & floor)

    If decimaal > OnNoukeurigheid Then
        floor = floor * factor
        antwoord = floor + 1
        antwoord = antwoord / factor
    ElseIf decimaal = OnNoukeurigheid Then
        antwoord = Decimal.Round(getal, dec, MidpointRounding.ToEven)
    Else
        Console.WriteLine("decimaal: " & decimaal)
        Console.WriteLine("getal: " & getal)
        percentage = (decimaal / getal) * 100
        If percentage < 5 Then
            Console.WriteLine("percentage is: " & Decimal.Round(percentage, 1) & "%")
            antwoord = floor
        Else
            Console.WriteLine("percentage is: " & Decimal.Round(percentage, 1) & "%")
            antwoord = floor + RoundUp
        End If
    End If

    If HasFactor Then
        notation = "E" & Format(VerFactor, "00")
    End If

    Console.WriteLine(antwoord & notation)
    Console.ReadLine()

这是我在 express 中所做的,它确实有效,但在宏中无效

注意:对荷兰语变量感到抱歉

在 VBA 中非常简单,因为 VBA Round 函数执行那种舍入:

Function VBARound(N As Double, Optional NumPlaces As Long = 0) As Double
    VBARound = Round(N, NumPlaces)
End Function

NUMPLACES 允许您有选择地四舍五入为非整数。

我有点不确定这是否是您要查找的内容,因为在您的描述中您似乎暗示仅查找整数作为结果,因此我为包含附加小数的函数省略了第二个变量保持简单的要点。我想我对您的舍入的解释与之前的答案略有不同,因此在 .5 的情况下,您会选择舍入到任何整数 # 是偶数(不知道为什么会这样,但如果它在这里你去! ).

我为我草率的格式道歉...我是一个自学成才的 VBA 用户所以可能有更有效的方法:

Function CustomRound(N As Double)
    If N - Application.WorksheetFunction.RoundDown(N, 0) = 0.5 Then
        If Application.WorksheetFunction.RoundDown(N, 0) Mod 2 = 0 Then
         CustomRound = Application.WorksheetFunction.RoundDown(N, 0)
        Else
         CustomRound = Application.WorksheetFunction.RoundUp(N, 0)
        End If    
    Else
         CustomRound = Round(N, 0)
    End If   
End Function