dnes je 29.3.2024

Input:

Excel 2007: Makra - VBA - Jak donutit uživatele zadat odpověď - 3. část

30.3.2011, , Zdroj: Verlag Dashöfer

Vysvětlíme si zbylé části kódu, zejména překopírování výběru na list „Ovládání“.

Původní úloha: Máme sestrojit makro, které pracuje s nějakým seznamem osob. Tento seznam nechceme uživateli ukázat celý, např. z důvodu ochrany osobních údajů. Od uživatele chceme, aby nějakou osobu vybral při znalosti jejího jména, příjmení, titulu a obce. Na základě toho vyfiltrujeme jednu, nebo několik málo osob, které dané kritérium splňují, a pak vytvoříme pomocí údajů z tabulky adresní rámeček pro obálku s okénkem.

Stáhněte si sešit 11_07_Vynucena odpoved.xlsm z odkazu na konci článku. Sešit otevřete. Uvidíte zhruba toto:

Na listu Ovládání je nastavena oblast tisku, která obsahuje pouze adresu. V buňce ID je vybrána první osoba, která splňuje požadavky. Pokud chce uživatel zvolit jiného, musí zapsat jeho ID ze sloupce „J“ do této buňky (na adrese F5).

Minule jsme si slibovali, že si vysvětlíme, jak se ze skrytého listu překopíruje provedený výběr na list Ovládání.   Na skrytém listu máme databázi s více než 13 tisíci jmény, a nesmíme připustit, aby se k těmto datům uživatel dostal, takže se tam nemůžeme ani na chvíli přepnout. Co kdyby zrovna v tom okamžiku došlo k nějaké chybě, a my bychom nestačili utajovaný list zase skrýt. Samozřejmě, že sami pro sebe v průběhu ladění si databázi zobrazíme, aby se nám snáze ladil program. Viz obrázek:

Takže naše rutina musí umět vybrat vyfiltrovanou oblast v rozsáhlé tabulce, vložit ji do schránky, a překopírovat na list Ovládání. V dílu 1 této série jsme se seznámili s kvalifikací listu, který zrovna není aktivní.

Viz obrázek:

Všimněte si, že kvalifikaci je nutno opakovat pro každý odkaz, který se vztahuje ke skrytému listu. Jakmile bychom v příkazu na obrázku vynechali kvalifikace u vnitřních parametrů, a vypadalo by to takto:

Worksheets("Data").Range(Range("$A$1"), Range("$A$1").End(xlDown).Offset(, 6)).Copy

příkaz by havaroval. Asi se zeptáte, proč by havaroval? Zkusím slovně popsat, jak by zněl příkaz „uším VBE“, kdybychom na něj mohli mluvit česky:

Na listu „Data“ vyber oblast buněk, v jejímž levém horním rohu je buňka na aktuálním listu, a pravým dolním rohem je buňka rovněž na aktuálním listu, na kterou se dostaneš tak, že pojedeš od buňky A1 na aktuálním listu směrem dolů, dokud tam nenarazíš na prázdnou buňku.

VBE samozřejmě ve chvíli programování nemůže tušit, že aktuálním listem nebude zrovna list „Data“, takže nemá důvod nám nahlásit nějakou chybu. Ovšem ve chvíli zpracování zjistí, že aktuální list se jmenuje „Ovládání“, takže najde buňku Ovládání!A1 (kde my máme napsáno „Výběr adresáta a tisk adresního rámečku“) a

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