dnes je 30.11.2022

Input:

Excel 2007: Makra - VBA - Program na zápis součtu - 3. část

7.12.2010, , Zdroj: Verlag Dashöfer

V předchozím článku jsme probrali druhou část programu k ošetřování součtů, kdy jsme evidovali součet bloku na samostatném listu V komentáři k programu jsme se dostali až k místu, kde se přepneme na list „Součty“ . Vlastní porozumění kódu, který součet zapisuje, jsme si nechali na dnešní díl.

Úloha zněla: V sešitě na listu „Data“ budeme mít blok čísel, která na posledním řádku sečteme – vše zatím v Excelu. Nahoře na listu umístíme tlačítko, po jehož stisku se objeví zpráva “Součet bloku je ....  Chceš součet zapsat a výsledek smazat?“ . „Ano = zapsat a smazat, Ne = zapsat a nesmazat, Storno = nedělat žádnou akci.“

Výsledky zapisujeme na list „Součty“ a u každého součtu uvádíme okamžik zápisu.

Stáhněte si nově sešit 10_25_Zapis_součtu.xlsm z odkazu na konci článku. Bude obsahovat další komentář k funkci, jež součty organizuje. Sešit otevřete.

Otevřete si VBE (editor Visual Basicu) např. Alt+<F11> a zobrazte stav programu, jak jsme posledně skončili. Posuňte se k funkci  „zapis_soucet“ . Viz obrázek:

Zobrazení některého podprogramu, např. funkce na uvedeném obrázku, lze ovládat více způsoby. Dokud je napsaných řádků málo, je nejjednodušší se k hledanému místu dolistovat. Ovšem jakmile počet řádků v modulu naroste, začne být hledání listováním neefektivní. Vyzkoušíme si, jak se na cílovou rutinu dostat pomocí služeb VBE. Podívejte se na následující obrázek:

V rozbalovacím seznamu modulu „MD_soucty“ vpravo nahoře jsou k dispozici všechny názvy podprogramů daného modulu. Pokud zvolíme název „zapis_soucet“, skočí VBE na začátek této funkce.

Ještě se sluší poznamenat, že tím nejsou vyčerpány možnosti, jak určitý podprogram nalézt. Někdo by mohl navrhnout např. hledání pomocí Ctrl+F, kam zapíšeme do pole hledat „zapis_soucet“ – viz obrázek:

Všimněte si orámečkované volby „Current Module“, která znamená, že VBE bude hledat jen v aktivním modulu – momentálně MD_soucty.  Mohli bychom také hledat ve všech modulech, pokud je jich více. Metoda Ctrl+F má dvě nevýhody. První, že jsme mohli udělat překlep, a hledat třeba „zapiš_součet“ (písmena s diakritikou). Pak se nenajde nic. Nebo jsme to zapsali správně, ale VBE najde postupně i všechna volání, takže tam budeme muset doskákat dalšími stisky tlačítka „Find next“ trochu podobně, jako při listování – viz obrázek:

Přímo zde v článku budeme věnovat pozornost řádku 56 z volané funkce:

„Range("A65536").End(xlUp).Offset(1).Select“

Tento řádek je vlastně řada pokynů: "Nastav se na buňku A65536, pak jdi nahoru tak dlouho, dokud budou prázdné buňky a zastav se na první neprázdné buňce. Z této neprázdné buňky se posuň o řádek dolů, a tam umísti selektor."

Bude pro nás užitečné zápisu porozumět ještě podrobněji. Předně, proč se nastavit na A65536? Proč jsme nepostupovali shora dolů? A proč jsme se nepostavili na buňku A10000, nebo A99999?

Nejprve si ujasněme, že očekáváme využití zápisů součtů jen na nějakých pár tisíc součtů. Uvažujeme tak, že denně třeba zapíšeme 10 součtů, takže za rok to bude odhadem 365 x 10 = 3650 řádků se součty. Když máme rezervu na 65000, je to skoro na 20 let.

Dále soubory typu xls mají standardně 65536 řádků, takže pokud bude se souborem pracovat někdo v Excelu 2000, bude mu makro pořád fungovat. Kdybychom zvolili maximum podle formátu xlsm, bylo by to 1048576 řádků. Pak by ovšem náš program zhavaroval na starších verzích Excelu.  Jelikož se nejedná (viz předchozí odstavec) o nic zásadního, vybereme hodnotu, s níž zahrajeme nejvíc „muziky“.

Druhá otázka – proč nejedeme shora? Pokyn „.End(xlUp)“ jede zdola nahoru, „.End(xlDown)“ shora dolů.  Oba pokyny známe z Excelu ve formě Ctrl+↑  a  Ctrl+↓. Pokyn znamená, že Excel rozlišuje pouze dva druhy buněk – s prázdnou hodnotou (formátování není podstatné) a s neprázdnou hodnotou. Ve chvíli, kdy by se někde v zaplněné části objevila prázdná buňka (např. by ji někdo ve sloupci A smazal), postup shora dolů by se zastavil těsně před ní, a následně by se zápis provedl na tento řádek s prázdnou buňkou, tak říkajíc mimo pořadí.

Třetí otázka – proč jsme se nepostavili na buňku A10000? Pokud očekáváme, že se za rok zapíše nejvýše 3650 řádků, vyhověla by i buňka A10000. Ovšem rychlost nastavení z výchozího bodu A10000 nebo A65536 je prakticky totožná. Nastavením na A10000 nic zajímavého nezískáme, zato ztratíme „rozlet“, kdyby řádků bylo více.

Zamyslíme se ještě nad zápisem toho složeného příkazu. V objektovém programování se nejčastěji používá právě takového popisu s tečkami. Ve VBA se zabýváme objekty (třeba buňkou). Mohli bychom si na následujících řádcích představit, co se vlastně ve VBA děje:

Nahrávám...
Nahrávám...