web-dev-qa-db-de.com

Wie kann man mit Excel VBA round () aufrunden?

Ich habe folgende Daten:

cell(1,1) = 2878.75
cell(1,2) = $31.10
cell(2,1) = $89,529.13

Wenn ich jedoch versuchte, round(cells(1,1).value*cells(1,2).value),2) zu verwenden, stimmt das Ergebnis nicht mit cell(2,1) überein. Ich dachte mir, es hat mit dem Rundungsproblem zu tun, aber ich frage mich nur, ob es möglich ist, round() normal zu handeln. Das heißt, für value > 0.5 aufrunden. Und für value < 0.5 abrunden?

9
Ting Ping

VBA verwendet Banker-Rundung in einem Versuch, die Tendenz zu kompensieren, immer auf- oder abgerundet zu werden .5; Sie können stattdessen;

WorksheetFunction.Round(cells(1,1).value * cells(1,2).value, 2)
14
Alex K.



Versuchen Sie es mit dieser Funktion, es ist in Ordnung, ein Doppel aufzurunden

'---------------Start -------------
Function Round_Up(ByVal d As Double) As Integer
    Dim result As Integer
    result = Math.Round(d)
    If result >= d Then
        Round_Up = result
    Else
        Round_Up = result + 1
    End If
End Function
'-----------------End----------------
8
ana

Wenn Sie aufrunden möchten, verwenden Sie die halbe Einstellung. Addieren Sie 0,5 zur Zahl, die aufgerundet werden soll, und verwenden Sie die Funktion INT ().

antwort = INT (x + 0,5)

5
Steven Alpha

Ich führe zwei benutzerdefinierte Bibliotheksfunktionen ein, die in vba verwendet werden sollen. Sie dienen dazu, den doppelten Wert zu runden, anstatt WorkSheetFunction.RoundDown und WorkSheetFunction.RoundUp zu verwenden

Function RDown(Amount As Double, digits As Integer) As Double
    RDown = Int((Amount + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits)
End Function

Function RUp(Amount As Double, digits As Integer) As Double
    RUp = RDown(Amount + (5 / (10 ^ (digits + 1))), digits)
End Function

Die Funktion Rdown (2878.75 * 31.1,2) gibt also 899529.12 zurück. Und die Funktion RUp (2878.75 * 31.1,2) gibt 899529.13 .__ zurück. Die Funktion Rdown (2878.75 * 31.1, -3) gibt 89000 zurück und Funktion RUp (2878.75 * 31.1, -3) geben 90000 zurück

2
ShamBhagwat

Ich hatte ein Problem, bei dem ich nur aufrunden musste und diese Antworten funktionierten nicht, da ich meinen Code ausführen musste, also verwendete ich eine andere Methode .. Die INT-Funktion rundet sich in Richtung negativ (4.2 geht auf 4, -4.2 geht) zu -5) Daher änderte ich meine Funktion in negativ, wendete die INT-Funktion an und gab sie dann einfach auf positiv zurück, indem ich sie vor und nachher mit -1 multiplizierte

Count = -1 * (int(-1 * x))
1
Granticus

Versuchen Sie die RoundUp-Funktion:

Dim i As Double

i = Application.WorksheetFunction.RoundUp(Cells(1, 1).Value * Cells(1, 2).Value, 2)
1
sous2817

Dies ist ein Beispiel. J ist der Wert, den Sie aufrunden möchten. 

Dim i As Integer
Dim ii, j As Double

j = 27.11
i = (j) ' i is an integer and truncates the decimal

ii = (j) ' ii retains the decimal

If ii - i > 0 Then i = i + 1 

Wenn der Rest größer als 0 ist, wird der Wert einfach aufgerundet. Bei 1,5 wird automatisch auf 2 gerundet, also weniger als 0.

0
tango_golfaus

Math.Round verwendet die Rundung von Bankern und wird auf die nächste gerade Zahl gerundet, wenn die zu gerundende Zahl genau in die Mitte fällt.

Einfache Lösung, verwenden Sie Worksheetfunction.Round (). Das wird abrunden, wenn es am Rande ist.

0
Greg

Das hat bei mir funktioniert 

Function round_Up_To_Int(n As Double)
    If Math.Round(n) = n Or Math.Round(n) = 0 Then
        round_Up_To_Int = Math.Round(n)
    Else: round_Up_To_Int = Math.Round(n + 0.5)
    End If
End Function
0
Stephen Walsh

Ich finde die folgende Funktion ausreichend:

'
' Round Up to the given number of digits
'
Function RoundUp(x As Double, digits As Integer) As Double

    If x = Round(x, digits) Then
        RoundUp = x
    Else
        RoundUp = Round(x + 0.5 / (10 ^ digits), digits)
    End If

End Function
0
DrMarbuse

Verwendete die Funktion "RDown" und "RUp" von ShamBhagwat und erstellte eine weitere Funktion, die den runden Teil zurückgibt (ohne "Ziffern" für die Eingabe angeben zu müssen) 

Function RoundDown(a As Double, digits As Integer) As Double
    RoundDown = Int((a + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits)
End Function

Function RoundUp(a As Double, digits As Integer) As Double
    RoundUp = RoundDown(a + (5 / (10 ^ (digits + 1))), digits)
End Function

Function RDownAuto(a As Double) As Double
    Dim i As Integer
    For i = 0 To 17
        If Abs(a * 10) > WorksheetFunction.Power(10, -(i - 1)) Then
            If a > 0 Then
                RDownAuto = RoundDown(a, i)
            Else
                RDownAuto = RoundUp(a, i)
            End If
        Exit Function
        End If
    Next
End Function

die Ausgabe wird sein:

RDownAuto(458.067)=458
RDownAuto(10.11)=10
RDownAuto(0.85)=0.8
RDownAuto(0.0052)=0.005
RDownAuto(-458.067)=-458
RDownAuto(-10.11)=-10
RDownAuto(-0.85)=-0.8
RDownAuto(-0.0052)=-0.005
0
baziili

Hier ist einer, den ich gemacht habe. Es verwendet keine zweite Variable, die mir gefällt.

        Points = Len(Cells(1, i)) * 1.2
        If Round(Points) >= Points Then
            Points = Round(Points)
        Else: Points = Round(Points) + 1
        End If
0
girhen