2008-11-28 10 views
54

Podane liczby jak 499, 73433, 2348 jakie VBA mogę użyć do zaokrąglenia do najbliższych 5 lub 10? lub numer abonamentowy?Jak zaokrąglić liczbę w VBA do najbliższych 5? (lub 10 lub X)

o 5:

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

Przez 10:

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

itp

+0

Dziękuję wszystkim za wszystkie odpowiedzi. Jestem mądrzejszy. Przepraszam, że mogę oznaczyć pojedynczą odpowiedź ressponse jako poprawną, ponieważ prawdziwa "odpowiedź" została rozproszona w kilku wiadomościach. –

+0

To działa dla mnie http://www.tek-tips.com/faqs.cfm?fid=5031 – Ferroao

Odpowiedz

29

Zintegrowany Odpowiedź

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

Dla zmiennoprzecinkowych do liczby całkowitej, 1234.564 do 1235 (to jest VB specyficzne, większość innych języków prostu obciąć) zrobić:

int(1234.564) 'result is 1235 

Uwaga: VB używa Bankers Rounding, z dokładnością nawet numer, który może być zaskakujące, jeśli nie jesteś świadomy to:

Dziękuję wszystkim.

83

To prosta matematyka. Biorąc pod uwagę liczbę X i czynnika zaokrąglenia N wzór będzie:

okrągły (x /) * N

10

W uzupełnieniu do najbliższego X (bez VBA specyficzne)

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

Gdzie int (...) zwraca następną najniższą liczbę całkowitą.

Jeśli dostępna funkcja zaokrąglania już zaokrągla do najbliższej liczby całkowitej wtedy pominąć dodanie 0,5

+0

Tylko dla wyjaśnienia: 'int (N + 0.5)' jest takie samo jak 'round (N)' –

+0

yes - Dodałem to w tym samym czasie, co skomentowałeś :) – Alnitak

+0

+1: Dzięki za to. –

0

coś takiego?

'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 
0

Po prostu ROUND (x/5) * 5 powinien wykonać zadanie.

0

nie mogę dodać komentarza więc będę korzystać z tej

w ciągu VBS uruchomić to i baw się dowiedzieć, dlaczego 2 dać wynik 2

nie można zaufać runda

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

Powiedziałbym, że ma to jakiś związek ze sposobem przechowywania liczb zmiennoprzecinkowych lub prawidłową implementacją algorytmu zaokrąglania w skali międzynarodowej. Nie wiem, jak się nazywa, ale było tak, że każdy inny .5 został zaokrąglony, a reszta w górę. –

+0

Zaokrągla rundy [sic] do najbliższej liczby parzystej. Istnieje nawet wyjaśnienie w SO. –

+0

Vilx, Twoja sugestia jest dobra, ale nie dla rundy VBA (465/10) * 10 zwróci 460 – Fredou

1

Dla ścisłego podejścia Visual Basic można przekonwertować wartość zmiennoprzecinkową na liczbę całkowitą, aby zaokrąglić do wspomnianej liczby całkowitej. VB jest jednym z rzadkich języków, które zaokrąglają konwersję typu (większość innych po prostu obcina.)

Wielokrotność 5 lub x można zrobić po prostu dzieląc przed i pomnażając po rundzie.

Jeśli chcesz zaokrąglić i zachować miejsca dziesiętne, Math.round (n, d) zadziała.

9

W języku VB element math.round ma dodatkowe argumenty określające liczbę miejsc dziesiętnych i metodę zaokrąglania. Math.Round (10.665, 2, MidpointRounding.AwayFromZero) zwróci 10.67. Jeśli liczba jest liczbą dziesiętną lub pojedynczym typem danych, funkcja math.round zwraca dziesiętny typ danych. Jeśli jest podwójne, zwraca podwójny typ danych. To może być ważne, jeśli włączona jest opcja strict.

Wynik (10.665) .ToString ("n2") zaokrągla od zera do "10.67". bez dodatkowych argumentów math.round zwraca wartość 10.66, co może prowadzić do niechcianych rozbieżności.

0

Spróbuj funkcję

-------------- rozpocząć ----------------

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 

------------- koniec ------------

2

'Przykład: Runda 499 do najbliższej 5. Można użyć funkcji ROUND().

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) 
-1

Aby naśladować w języku Visual Basic sposób działa funkcja runda w programie Excel, po prostu trzeba użyć: WorksheetFunction.Round (numer, po przecinku)

ten sposób bankowych lub rachunkowości zaokrąglenie nie wykonaj zaokrąglenie.

+0

Nie zajmie to 2348 do 2350, zgodnie z zapytaniem w pytaniu (drugi przykład). – mins

1

Oto nasze rozwiązanie:

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 

Zastosowanie:

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

Myślę, że to jest VB.NET, a nie VBA? Logika jest jednak przydatna! – tomRedox

Powiązane problemy