Zaokrouhlování v Excelu

Zaokrouhlování v Excelu není téma, nad kterým je dobré jen mávnout rukou a používat jednu či dvě z funkcí, které nabízí. Přečtěte si dnešní článek a uvidíte, že by vás v budoucnu mohlo čekat nemilé překvapení.

Co je potřeba vědět hned zkraje? Do problematiky výpočtů a zaokrouhlování vstupuje procesor, dvojková soustava, v níž počítače pracují, a nakonec i samotný Excel. Čísla jsou zaokrouhlována, některá nejdou vyjádřit přesně, …

Chyby ve výpočtech
Chyby ve výpočtech

Co z toho vyplývá? Vzpomínáte si, když vás učitel nutil dosadit do rovnice a provést zkoušku „levá strana = pravá strana“, zjednodušeně L = P? Na takový prostý (teoretický) způsob porovnávání dvou čísel, resp. obsahu dvou proměnných v Excelu a programování zapomeňte. Jestliže se k výsledkům A a B dopracujete dvěma různými cestami a chcete provést kontrolní srovnání, pak vypočítejte rozdíl A – B v absolutní hodnotě a porovnejte ho s akceptovatelnou odchylkou, tj. |A – B| < ε

Vizuální(!) podobu čísla v buňce pak určuje také její formát. Ne vždy je vhodné bez rozmyslu klepat na tlačítko Odebrat desetinné místo a pak jít s vytištěnou tabulkou za šéfem…

Vizuální zaokrouhlování formátem buňky
Vizuální zaokrouhlování formátem buňky

A teď už hurá na zaokrouhlovací funkce listu.

Zaokrouhlování v Excelu
Zaokrouhlování v Excelu

Při studování tématu jsem vypsal české i anglické názvy funkcí na listu, porovnal je s nabízenými funkcemi VBA a postavil je proti zažitým definicím funkcí z matematiky. Tak vznikla následující tabulka.

Zaokrouhlování pod lupou
Zaokrouhlování pod lupou

Jak se v tabulce orientovat? Kupříkladu na listu máme funkci CELÁ.ČÁST (anglicky INT), která zaokrouhluje na celá čísla směrem doleva, ať už na kladné, nebo záporné ose (jinak řečeno napravo, resp. nalevo od nuly). V matematice odpovídá pojmu „dolní celá část“ a ve VBA má ekvivalent ve vestavěné funkci Int či ve vlastních funkcích epfInt2 a epfFloor (viz níže).

Zbývá uvést kódy funkcí ve VBA. V případě hledání ekvivalentů pro funkce listu byly z velké části použity samostatné algoritmy, nikoliv prostý odkaz s pomocí WorksheetFunction. Taková řešení je možné použít i mimo prostředí Excelu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Function epfInt(Cislo)
    epfInt = Int(Cislo)
End Function

Function epfInt2(ByVal Cislo As Double, _
               Optional ByVal Faktor As Double = 1) As Double
    epfInt2 = Int(Cislo * Faktor) / Faktor
End Function

Function epfCInt(Cislo)
    epfCInt = CInt(Cislo)
End Function

Function epfFix(Cislo)
    epfFix = Fix(Cislo)
End Function

Function epfFix2(ByVal Cislo As Double, _
               Optional ByVal Faktor As Double = 1) As Double
    epfFix2 = Fix(Cislo * Faktor) / Faktor
    'alternativně
    'epfFix2 = Int(Abs(Cislo), Faktor) * Sgn(Cislo)
End Function

Function epfRound(Cislo, Faktor)
    epfRound = Round(Cislo, Faktor)
End Function

Function epfRound2(Cislo As Double, Optional Faktor As Integer = 0) As Double
    epfRound2 = CDbl(FormatNumber(Cislo, Faktor))
End Function

Function epfRound3(ByVal Cislo As Double, _
                 Optional ByVal Faktor As Double = 1) As Double
    epfRound3 = Fix(Cislo * Faktor + 0.5 * Sgn(Cislo)) / Faktor
End Function

Function epfFormat(Cislo, Tvar)
    epfFormat = Format(Cislo, Tvar)
End Function

Function epfFormatNumber(Cislo, Faktor)
    epfFormatNumber = FormatNumber(Cislo, Faktor)
End Function

Function epfMRound1(Cislo, Faktor)
    epfMRound1 = WorksheetFunction.Round(Cislo / Faktor, 0) * Faktor
End Function

Function epfMround2(Cislo, Faktor)
    epfMround2 = Int(Cislo / Faktor + 0.5) * Faktor
End Function

Function epfFloor(Cislo)
    epfFloor = Fix(Cislo) - (Cislo < 0) * (Cislo <> Fix(Cislo))
End Function

Function epfCeiling(Cislo)
    epfCeiling = Fix(Cislo) + (Cislo > 0) * (Cislo <> Fix(Cislo))
End Function

Function epfRoundUp(Cislo, Faktor)
    epfRoundUp = WorksheetFunction.RoundUp(Cislo, Faktor)
End Function

Function epfRoundDown(Cislo, Faktor)
    epfRoundDown = WorksheetFunction.RoundDown(Cislo, Faktor)
End Function

Function epfTrunc(Cislo, Faktor)
    epfTrunc = Fix(Cislo * (10 ^ Faktor)) / (10 ^ Faktor)
End Function

Function epfOdd(Cislo)
    epfOdd = WorksheetFunction.Odd(Cislo)
End Function

Function epfEven(Cislo)
    epfEven = WorksheetFunction.Even(Cislo)
End Function

Function epfFloorExcel(Cislo, Faktor)
    epfFloorExcel = WorksheetFunction.Floor(Cislo, Faktor)
End Function

Function epfCeilingExcel(Cislo, Faktor)
    epfCeilingExcel = WorksheetFunction.Ceiling(Cislo, Faktor)
End Function

Function epfFrac(Cislo)
    epfFrac = Cislo - Fix(Cislo)
End Function

Function epfParity(Cislo)
    epfParity = (-1) ^ (Abs(Int(Cislo)))
End Function

Function epfMod(Cislo, Faktor)
    epfMod = Cislo - Faktor * Int(Cislo / Faktor)
    'fMod = Cislo - Faktor * epfFloor(Cislo / Faktor)
End Function