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ě, …
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…
A teď už hurá na zaokrouhlovací funkce listu.
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.
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 |