Poradnik poniżej wyjaśnia, jak w VBA skutecznie korzystać z RoundDown (zaokrąglanie w dół) i innych funkcji zaokrąglania, oraz jak uniknąć typowych pułapek związanych z wbudowaną funkcją Round. Dzięki niemu zbudujesz w projektach Excel VBA przewidywalne, spójne zaokrąglanie liczb.
Zaokrąglanie w Excel vs VBA – dwa światy, które łatwo pomylić
W Excelu mamy zestaw funkcji arkuszowych, takich jak:
- ZAOKR / ROUND – klasyczne zaokrąglanie matematyczne (0–4 w dół, 5–9 w górę);
- ZAOKR.GÓRA / ROUNDUP – zawsze w górę, w stronę od zera;
- ZAOKR.DÓŁ / ROUNDDOWN – zawsze w dół, w stronę zera.
Ich składnia (w arkuszu) jest bardzo prosta, np.:
=ZAOKR(A1; 2) ' Round – zaokrąglenie do 2 miejsc
=ZAOKR.GÓRA(A1; 2) ' RoundUp – zawsze w górę
=ZAOKR.DÓŁ(A1; 2) ' RoundDown – zawsze w dół
Funkcja ZAOKR (ROUND) w Excelu działa jak „szkolne” zaokrąglanie: 0–4 w dół, 5–9 w górę.
Potwierdza to dokumentacja Microsoft oraz wiele polskich materiałów o funkcji ZAOKR.
W VBA istnieje wbudowana funkcja Round o składni:
Round(Expression [, NumDecimalPlaces])
Funkcja ta „zwraca liczbę zaokrągloną do określonej liczby miejsc dziesiętnych”.
W VBA nie ma natywnej funkcji RoundDown / RoundUp analogicznej do arkuszowych, dlatego w praktyce wykorzystuje się funkcje arkuszowe przez obiekt WorksheetFunction lub pisze własne funkcje (UDF).
Najważniejsze: VBA Round zaokrągla inaczej niż arkuszowy ROUND/ZAOKR – stosuje tzw. zaokrąglanie bankierskie (round half to even), co rodzi problemy w obliczeniach finansowych.
Funkcja Round w VBA – jak działa i na co uważać
Składnia funkcji Round w VBA
Zgodnie z dokumentacją:
Round(Expression [, NumDecimalPlaces])
Expression – liczba lub wyrażenie, które zaokrąglasz.
NumDecimalPlaces – (opcjonalnie) liczba miejsc po przecinku; domyślnie 0, czyli zaokrąglenie do całych.
Przykłady użycia funkcji Round:
Sub PrzykladRound()
Debug.Print Round(123.456, 2) ' 123,46
Debug.Print Round(123.454, 2) ' 123,45
End Sub
Zaokrąglanie bankierskie (gaussowskie) w VBA
Wbudowana funkcja Round w VBA stosuje round half to even: jeśli ostatnia cyfra jest dokładnie „pół”, wynik jest zaokrąglany do najbliższej liczby parzystej zamiast „zawsze w górę”.
Skutki w praktyce wyglądają tak:
Sub BankersRounding()
Debug.Print Round(2.5) ' 2, bo 2 jest parzyste
Debug.Print Round(3.5) ' 4, bo 4 jest parzyste
End Sub
Jeśli potrzebujesz „klasycznego” zaokrąglania (5 zawsze w górę), wbudowana Round nie wystarcza – użyj funkcji arkuszowych lub własnej UDF.
To wyjątkowo istotne w obliczeniach podatkowych i finansowych, gdzie przepisy zazwyczaj wymagają klasycznego zaokrąglania.
W integracji z formułami arkuszowymi ta sama liczba może zostać inaczej zaokrąglona w formule i w kodzie VBA, jeśli użyjesz Round zamiast WorksheetFunction.Round.
RoundDown w VBA – jak zaokrąglać zawsze w dół
Funkcja arkuszowa RoundDown (ZAOKR.DÓŁ)
Microsoft zaleca używanie ZAOKR.DÓŁ (ROUNDDOWN), aby zawsze zaokrąglać w dół – w kierunku zera. Jej składnia w arkuszu:
=ZAOKR.DÓŁ(liczba; liczba_cyfr)
liczba – liczba do zaokrąglenia.
liczba_cyfr – liczba miejsc po przecinku / cyfr znaczących do pozostawienia.
Analogiczna funkcja w angielskiej wersji Excela to ROUNDDOWN.
Użycie RoundDown w kodzie VBA (WorksheetFunction)
W praktyce programiści korzystają z tych samych funkcji, wywołując je przez Application.WorksheetFunction w VBA. To standardowy sposób przeniesienia logiki arkuszowej do kodu.
Przykładowa procedura:
Sub PrzykladRoundDown()
Dim x As Double
x = 123.456
' Zaokrąglanie w dół do 2 miejsc po przecinku
Debug.Print Application.WorksheetFunction.RoundDown(x, 2) ' 123,45
' Zaokrąglanie w dół do liczb całkowitych
Debug.Print Application.WorksheetFunction.RoundDown(x, 0) ' 123
End Sub
Takie wywołanie oznacza użycie tej samej logiki, którą znamy z funkcji arkuszowej ZAOKR.DÓŁ / ROUNDDOWN.
Gwarantuje to pełną zgodność wyników między arkuszem a VBA – jeśli ta sama liczba jest zaokrąglana w formule i w kodzie, rezultat będzie identyczny.
Własna funkcja RoundDown (UDF) w VBA
Alternatywą jest napisanie własnego UDF – szczególnie przy nietypowych zasadach zaokrąglania lub chęci uniezależnienia się od WorksheetFunction.
Przykładowy prosty RoundDown, działający podobnie do Excelowego ROUNDDOWN:
Function RoundDownVBA(ByVal value As Double, ByVal numDigits As Long) As Double
Dim factor As Double
factor = 10 ^ numDigits
RoundDownVBA = Int(value * factor) / factor
End Function
Dla liczb dodatnich powyższe podejście zachowuje się jak „zawsze w dół”.
Dla ujemnych Int zaokrągla w dół matematycznie (w stronę minus nieskończoności), więc aby precyzyjnie naśladować logikę arkuszową (w kierunku zera), trzeba uwzględnić znak i odpowiednio przełączyć metodę.
RoundUp w VBA – zaokrąglanie zawsze w górę
Funkcja arkuszowa RoundUp (ZAOKR.GÓRA)
Aby zawsze zaokrąglać w górę (w kierunku od zera), użyj funkcji ZAOKR.GÓRA (ROUNDUP). Składnia w arkuszu:
=ZAOKR.GÓRA(liczba; liczba_cyfr)
W poradnikach VBA prezentuje się analogiczne wywołanie RoundUp z drugim argumentem określającym liczbę miejsc dziesiętnych, co odpowiada działaniu arkuszowego ROUNDUP.
Użycie RoundUp w VBA (WorksheetFunction)
W kodzie VBA najwygodniej skorzystać z funkcji arkuszowej:
Sub PrzykladRoundUp()
Dim x As Double
x = 123.451
' Zaokrąglanie zawsze w górę do 2 miejsc po przecinku
Debug.Print Application.WorksheetFunction.RoundUp(x, 2) ' 123,46
' Zaokrąglanie zawsze w górę do pełnych złotych
Debug.Print Application.WorksheetFunction.RoundUp(x, 0) ' 124
End Sub
Inne funkcje zaokrąglania i „obcinania” w VBA
Int i Fix – obcinanie części ułamkowej
Oprócz Round / RoundDown / RoundUp, funkcje Int i Fix pozwalają „obcinać” część ułamkową liczby:
Sub PrzykladIntFix()
Debug.Print Int(3.9) ' 3
Debug.Print Fix(3.9) ' 3
Debug.Print Int(-3.9) ' -4 (do dołu)
Debug.Print Fix(-3.9) ' -3 (w stronę zera)
End Sub
Int – zaokrągla „w dół” matematycznie (w stronę minus nieskończoności).
Fix – obcina część ułamkową „w stronę zera”.
Zaokrąglanie do wielokrotności – FLOOR / CEILING / MROUND
W arkuszu dostępne są funkcje zaokrąglania do wielokrotności, np. do najbliższej wielokrotności 0,05 czy 10:
- FLOOR – do najbliższej niższej wielokrotności;
- CEILING – do najbliższej wyższej wielokrotności;
- MROUND – zaokrąglenie do najbliższej wielokrotności.
W VBA można korzystać z nich przez Application.WorksheetFunction (np. Application.WorksheetFunction.Floor), co zapewnia spójność z arkuszem i typową dla Excela logikę zaokrąglania.
Funkcje arkuszowe Round/ZAOKR vs VBA Round
Arkuszowa ZAOKR / ROUND
W arkuszu funkcja ZAOKR ma składnię:
=ZAOKR(liczba; liczba_cyfr)
liczba – wartość do zaokrąglenia.
liczba_cyfr – liczba cyfr, do których liczba ma zostać zaokrąglona.
Jej zachowanie jest klasycznie matematyczne – 0–4 w dół, 5–9 w górę.
VBA Round (zaokrąglanie bankierskie) i konsekwencje
W dokumentacji funkcji Round dla VBA podano tylko składnię i opis „zwraca liczbę zaokrągloną do określonej liczby miejsc dziesiętnych”. W praktyce jest to zaokrąglanie bankierskie. Jeśli potrzebujesz „zwykłego” zaokrąglania jak w arkuszu, masz dwie opcje:
Użyć WorksheetFunction.Round (czyli arkuszowej ZAOKR) w kodzie VBA.
Napisać własną funkcję Round, która stosuje klasyczną regułę 0–4 w dół, 5–9 w górę.
Przykład z wykorzystaniem arkuszowej funkcji w VBA:
Sub PrzykladRoundClassic()
Dim x As Double
x = 2.5
' Arkuszowa logika – klasyczne zaokrąglanie
Debug.Print Application.WorksheetFunction.Round(x, 0) ' 3 (0–4 w dół, 5–9 w górę)
' VBA Round – zaokrąglanie bankierskie
Debug.Print Round(x, 0) ' 2
End Sub
Typowe pułapki i dobre praktyki
Pułapki
Najczęstsze błędy to:
-
Inne wyniki Round w arkuszu i w VBA
Ta sama liczba może dać różny rezultat, jeśli w arkuszu używaszZAOKR, a w VBA wbudowanegoRound. -
Zaokrąglanie formatu vs wartości
Samo formatowanie komórek (zmniejszanie liczby miejsc po przecinku) nie zaokrągla faktycznej wartości, a tylko to, co widać. Dla spójności obliczeń należy zawsze używać funkcji zaokrąglających (ZAOKR,ZAOKR.GÓRA,ZAOKR.DÓŁlub ich odpowiedników w VBA). -
Liczby ujemne
Int, Fix, RoundDown i Floor różnie traktują liczby ujemne – trzeba świadomie dobrać funkcję, aby uzyskać oczekiwany kierunek zaokrąglania.
Dobre praktyki
W codziennej pracy warto trzymać się poniższych zasad:
- ustal jedną logikę zaokrąglania dla całego pliku – jeżeli w arkuszu używasz
ZAOKR, w VBA sięgaj poWorksheetFunction.Round, a nie wbudowanyRound; - do „zawsze w dół” używaj RoundDown / ZAOKR.DÓŁ – w VBA przez
Application.WorksheetFunction.RoundDown, w arkuszu przezZAOKR.DÓŁ; - do „zawsze w górę” używaj RoundUp / ZAOKR.GÓRA – w VBA przez
Application.WorksheetFunction.RoundUp; - w obliczeniach podatkowych i finansowych unikaj wbudowanej VBA Round – jeśli przepisy wymagają klasycznego zaokrąglania, oprzyj się na arkuszowych funkcjach lub własnych UDF.
Przykładowy moduł – „centrum zaokrąglania” w VBA
Poniższy moduł zapewnia spójną logikę w całym projekcie:
Option Explicit
' Klasyczne zaokrąglanie jak ZAOKR (ROUND) z Excela
Public Function RoundClassic(ByVal value As Double, _
Optional ByVal numDigits As Long = 0) As Double
RoundClassic = Application.WorksheetFunction.Round(value, numDigits)
End Function
' Zaokrąglanie zawsze w dół – jak ZAOKR.DÓŁ (ROUNDDOWN)
Public Function RoundDownVBA(ByVal value As Double, _
Optional ByVal numDigits As Long = 0) As Double
RoundDownVBA = Application.WorksheetFunction.RoundDown(value, numDigits)
End Function
' Zaokrąglanie zawsze w górę – jak ZAOKR.GÓRA (ROUNDUP)
Public Function RoundUpVBA(ByVal value As Double, _
Optional ByVal numDigits As Long = 0) As Double
RoundUpVBA = Application.WorksheetFunction.RoundUp(value, numDigits)
End Function
Dzięki takiemu modułowi:
- w kodzie VBA używasz RoundClassic, RoundDownVBA, RoundUpVBA,
- w arkuszu odpowiednio:
ZAOKR,ZAOKR.DÓŁ,ZAOKR.GÓRA, - logika zaokrąglania jest spójna i przewidywalna w całym skoroszycie.






