W dobie operacji finansowych wykonywanych dla jednostek wyrażanych w czterech, pięciu miejscach po przecinku zaokrąglanie wyników może sprawiać pewien problem. Szczególny problem pojawia się w momencie, gdy sięgamy po standardową, wbudowaną funkcję VBA Round. Okazuje się bowiem, że funkcja ta nie zaokrągla w sposób jaki oczekujemy. Zobrazuje to poniższy przykładowy kod:
1 | Debug.Print Round(0.515, 2) |
2 | Debug.Print Round(0.525, 2) |
3 | Debug.Print Round(0.535, 2) |
4 | Debug.Print Round(0.545, 2) |
5 | Debug.Print Round(0.555, 2) |
6 | Debug.Print Round(0.565, 2) |
7 | Debug.Print Round(0.575, 2) |
8 | Debug.Print Round(0.585, 2) |
Jak widać zwracane wynik są w niektórych sytuacjach lekko zaskakujące. Teoretycznie bowiem obowiązuje tu zasada, iż w sytuacji, gdy zaokrąglana wartość wynosi 5 (jak w każdym powyższym przypadku) to zaokrąglenie w górę nastąpi o ile poprzednia liczba jest nieparzysta, oraz w dół- gdy poprzednia liczba jest parzysta. Jak widać nie w każdym przypadku jest to prawdziwe.
Jeżeli więc potrzebujemy klasycznej techniki zaokrąglania to niezbędne jest stworzenie własnej funkcji zaokrąglającej. Poniżej przykład takie funkcji:
01 | Public Function RoundUDF(Wartosc As Double , _ |
02 | Optional MiejscPoPrzecinku As Integer = 0) As Double |
04 | On Error GoTo ErrHandler |
06 | RoundUDF = Round((Wartosc * (10 ^ MiejscPoPrzecinku)) + 0.5, 0) / _ |
07 | (10 ^ MiejscPoPrzecinku) |
11 | MsgBox Err.Number & vbNewLine & Err.Description |
Wyniki działania naszej funkcji zaokrąglającej prezentuje poniższy przykład:
1 | Debug.Print RoundUDF(0.515, 2) |
2 | Debug.Print RoundUDF(0.525, 2) |
3 | Debug.Print RoundUDF(0.535, 2) |
4 | Debug.Print RoundUDF(0.545, 2) |
5 | Debug.Print RoundUDF(0.555, 2) |
6 | Debug.Print RoundUDF(0.565, 2) |
7 | Debug.Print RoundUDF(0.575, 2) |
8 | Debug.Print RoundUDF(0.585, 2) |
Brak komentarzy:
Prześlij komentarz