dnes je 1.5.2024

Input:

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

25.11.2010, , Zdroj: Verlag Dashöfer

V předchozím článku jsme probrali první část programu k ošetřování součtů. Dnes pokročíme v úloze evidovat součet bloku na samostatném listu, ale současně se trochu více seznámíme s editorem VBE a jeho podporou našim potřebám.

Ú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.“

Zapisovat budeme na list „Součty“ a u každého součtu uvedeme okamžik zápisu.

Stáhněte si nově sešit 10_24_Zapis_součtu.xlsm z odkazu na konci článku. Bude obsahovat další prvky, které si vysvětlíme tentokrát.  Sešit otevřete.

Otevřete si VBE (editor Visual Basicu) např. Alt+<F11> a zobrazte stav programu, jak jsme posledně skončili. Viz obrázek:

Modul v okénku  Properties přejmenujte (cvičně) z MD_soucty  na MD_soucty1. (Nehraje to v naší úloze žádnou funkční roli, nicméně vy si ověříte, že se vám to daří) a na list „Data“ umístěte další tlačítko nezvyklého tvaru. Využijte nabídku Vložení ->Klipart a omezte hledání na slovo „kalkulačka“  – viz obrázek.

Pak vyberte vhodnou kalkulačku myší a ťukněte v ploše. Objeví se poměrně velký obrázek kalkulačky.

Tu pomocí myši přetáhněte nahoru vpravo a pomocí rohových objektových značek zmenšete do přijatelné velikosti:

Nakonec přiřaďte tomuto obrázkovému tlačítku makro „Zapisuj_soucty“ podobně, jako jsme se naučili v předchozích dílech. Zkuste si spustit akci svým tlačítkem. Mělo by se to chovat zcela stejně.

Tímto krokem jsme se naučili, že ke spouštění není nutné použít jenom tlačítko z nabídky automatických tvarů (nebo z nabídky Vývojář->Ovládací prvky->Vložit->Ovládací prvky formuláře->tlačítko apod.) ale třeba fotografii některé filmové hvězdy stažené z internetu či víceméně jakýkoli obrázek.

Dále jsme se naučili, že tlačítko spouštějící nějaké naše makro můžeme vytvořit vícekrát (a třeba na různých listech), a vykoná stejnou akci.

Podprogram Zapis_Soucet si nejprve v tomto dílu nahradíme dočasnou funkčností, abychom se přiblížili situaci, jaká čeká na většinu těch, kdo začnou něco vyvíjet. Obvykle totiž potřebujete dokončit jednu subroutinu nebo funkci tak aby tvořila vhodný funkční celek, a odbíhání do detailů další subroutiny nepřijatelně rozptyluje vaši pozornost.

Hotovou funkci  „zapis_soucet“ byste na první pokus jen obtížně dali dohromady.

Nyní si tuto dočasnou rutinu vytvoříme. Nejprve její cíl (samozřejmě dočasný):

Rutina obdrží součet z nadřízené rutiny, ale neudělá s ním nic, jen vrátí hlášení, že dosud není hotová, a nastaví hodnotu funkce na 8.

Z důvodu zachování původního vzhledu si původní funkci zkopírujeme ještě jednou na místo, kam v obrázku ukazuje červená šipka, a tu první přejmenujeme na „zapis_soucet0“.  Viz obrázek:

Z původní funkce vymažeme skoro všechno, a ponecháme v ní jen návratovou hodnotu. Přidáme hlášení pro uživatele. Viz:

Function zapis_soucet(Cislo As Double) As Integer

'zatím není hotová

MsgBox "Bohužel v tomto okamžiku se zápis nezdařil. Omlouváme se."

zapis_soucet = 8

End Function

Zápisem „zapis_soucet = 8“ ošetříme, aby se blok součtů nesmazal, i když uživatel dá povel „Zapsat a smazat blok“. Mohl by být nepříjemně zaskočen J.

Kopii neporušené funkce přejmenujeme na  „Function zapis_soucet0(Cislo ….“

Abychom rozšířili své dovednosti, spustíme nyní z nabídky programu příkaz Debug -> Compile VBA project (přeložit), a analyzátor nás upozorní, že v přejmenované Funkci zapis_soucet0 používáme nedeklarovanou proměnnou zapis_soucet. Viz obrázek.

Odhalená chyba spočívá v tom, že v přejmenované funkci jsme zapomněli přejmenovat i vrácení hodnoty. Správně by mělo vypadat „zapis_soucet0 = 4“. (Bohužel i když umíte anglicky, text chyby vám mnoho nepomůže. To je i jeden z důvodů, proč navštívit nějaký kurs VBA, protože spousta hlášek vypadá pro začátečníky podobně nesrozumitelně)

Opravte si v původní funkci názvy obohacené o nulu na konci. Zde je

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