Skupiona kaukaska kobieta siedząca przy biurku, pracująca z domu i korzystająca z laptopa w słonecznym pokoju

VBA RoundDown i inne funkcje zaokrąglania w Excel VBA

8 min. czytania

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:

  1. Inne wyniki Round w arkuszu i w VBA
    Ta sama liczba może dać różny rezultat, jeśli w arkuszu używasz ZAOKR, a w VBA wbudowanego Round.

  2. 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).

  3. 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 po WorksheetFunction.Round, a nie wbudowany Round;
  • do „zawsze w dół” używaj RoundDown / ZAOKR.DÓŁ – w VBA przez Application.WorksheetFunction.RoundDown, w arkuszu przez ZAOKR.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.