Frage

Da Zahlen wie 499, 73433, 2348, welche VBA kann ich Runde verwenden, um die nächsten 5 oder 10? oder eine beliebige Zahl?

Mit dem 5:

 499 ->  500
2348 -> 2350
7343 -> 7345

Mit dem 10:

 499 ->  500
2348 -> 2350
7343 -> 7340

etc.

War es hilfreich?

Lösung 2

Integrierte Antwort

X = 1234 'number to round
N = 5    'rounding factor
round(X/N)*N   'result is 1235

Punkt für floating to integer, 1234.564 bis 1235, (dies ist VB spezifisch, die meisten anderen Sprachen einfach gestutzt) tun:

int(1234.564)   'result is 1235

Achtung: VB verwendet Bankers Rounding , auf die nächste gerade Zahl , die überraschend sein kann, wenn Sie nicht wissen, es sind:

msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too

Vielen Dank an alle.

Andere Tipps

Es ist einfache Mathematik. eine Zahl X und einen Rundungsfaktor N gegeben, würde die Formel sein:

Runde (X / N) * N

Um Runde zum nächsten X (ohne dass VBA-spezifisch)

N = X * int (N / X + 0,5)

Wo int (...) gibt die nächstniedrigere ganze Zahl.

Wenn Ihre verfügbare Rundungsfunktion rundet bereits auf die nächste ganze Zahl dann lassen Sie die Zugabe von 0,5

In VB Math.round hat zusätzliche Argumente Anzahl der Dezimalstellen und Rundungsmethode angeben. Math.Round (10,665, 2, MidpointRounding.AwayFromZero) 10,67 zurück. Wenn die Zahl eine Dezimalzahl oder einzelner Datentyp, gibt Math.round einen Dezimal-Datentyp. Wenn es doppelt so hoch ist, gibt es doppelten Datentyp. Das könnte wichtig sein, wenn die Option streng eingeschaltet ist.

Das Ergebnis (10,665) .ToString ( "n2") rundet von Null weg "10.67" zu geben. ohne zusätzliche Argumente Math.Round 10,66 zurückgibt, die zu unerwünschten Abweichungen führen könnten.

'. Beispiel: Runde 499 zum nächsten 5. Sie würden die Funktion ROUND () verwenden

a = inputbox("number to be rounded")
 b = inputbox("Round to nearest _______ ")


  strc = Round(A/B)
  strd = strc*B


 msgbox( a & ",  Rounded to the nearest " & b & ", is" & vbnewline & strd)

Für einen strengen Visual Basic Ansatz, können Sie den Gleitkommawert in einer ganzen Zahl konvertieren, um runden die ganze Zahl. VB ist eine der wenigen Sprachen, die auf Typ-Konvertierung rundet (die meisten anderen einfach gestutzt.)

Multiples von 5 oder x kann einfach durch Division vor und Multiplikation nach der Runde durchgeführt werden.

Wenn Sie runden möchten und Dezimalstellen zu halten, Math.round (n, d) funktionieren würde.

Hier ist unsere Lösung:

Public Enum RoundingDirection
    Nearest
    Up
    Down
End Enum

Public Shared Function GetRoundedNumber(ByVal number As Decimal, ByVal multiplier As Decimal, ByVal direction As RoundingDirection) As Decimal
    Dim nearestValue As Decimal = (CInt(number / multiplier) * multiplier)
    Select Case direction
        Case RoundingDirection.Nearest
            Return nearestValue
        Case RoundingDirection.Up
            If nearestValue >= number Then
                Return nearestValue
            Else
                Return nearestValue + multiplier
            End If
        Case RoundingDirection.Down
            If nearestValue <= number Then
                Return nearestValue
            Else
                Return nearestValue - multiplier
            End If
    End Select
End Function

Verbrauch:

dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up)

Simply ROUND (x / 5) * 5 sollte die Arbeit machen.

Ich kann Kommentar hinzufügen so dass ich dies verwenden

in einem vbs läuft, dass und Spaß hat, herauszufinden, warum die 2 ein Ergebnis von 2 geben

Sie können nicht rund vertrauen

 msgbox round(1.5) 'result to 2
 msgbox round(2.5) 'yes, result to 2 too

so etwas?

'nearest
 n = 5
 'n = 10

 'value
 v = 496
 'v = 499 
 'v = 2348 
 'v = 7343

 'mod
 m = (v \ n) * n

 'diff between mod and the val
 i = v-m


 if i >= (n/2) then     
      msgbox m+n
 else
      msgbox m
 end if

Versuchen Sie, diese Funktion

-------------- starten ----------------

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

------------- Ende ------------

ich die Funktion von der „Community Wiki“ (die beste Antwort), die leicht aktualisiert werden, nur auf den nächsten runden 5 (oder alles, was Sie mögen), mit dieser Ausnahme: die gerundete Zahl wird nie überlegen sein die ursprüngliche Zahl .

Dies ist in Fällen nützlich ist, wenn es erforderlich ist, zu sagen, dass „ein Unternehmen seit 47 Jahren noch am Leben ist“ : Ich die Web-Seite "angezeigt werden soll lebt seit mehr als 45 Jahren ", im liegen zu vermeiden in Angabe von " lebt seit mehr als 50 Jahren ".

Also, wenn Sie diese Funktion mit 47 füttern, wird es nicht 50 zurück, sondern wird stattdessen 45 zurück.

'Rounds a number to the nearest unit, never exceeding the actual value
function RoundToNearestOrBelow(num, r)

    '@param         num         Long/Integer/Double     The number to be rounded
    '@param         r           Long                    The rounding value
    '@return        OUT         Long                    The rounded value

    'Example usage :
    '   Round 47 to the nearest 5 : it will return 45
    '   Response.Write RoundToNearestBelow(47, 5)

    Dim OUT : OUT = num

    Dim rounded : rounded = Round((((num)) / r), 0) * r

    if (rounded =< num) then
        OUT = rounded
    else
        OUT = rounded - r
    end if

    'Return
    RoundToNearestOrBelow = OUT

end function 'RoundToNearestOrBelow

Um in Visual Basic imitiert die Art und Weise die Rundenfunktion in Excel funktioniert, müssen Sie nur verwenden: WorksheetFunction.Round (Zahl, Dezimalstellen)

Auf diese Weise der Bank- oder Buchhaltung Rundung die Rundung nicht tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top