dnes je 10.12.2024

Input:

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

16.3.2011, , Zdroj: Verlag Dashöfer

V 1. díle článku jsme začali řešit problém s nechápavým uživatelem. Často totiž potřebujete, aby uživatel zadal nějakou hodnotu, na jejímž základě uskuteční program nějakou akci. Ale co když uživatel není „ve formě“ a zadá nějakou hloupost? Použili jsme cyklus Do…Loop a z něj bylo možné odejít „jen násilně“.

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 2011-6 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 poměrně pomalou rutinu zkusíme zrychlit. Uživatel excelového souboru to neví, ale čtenářům článku prozradím, že skrytá databáze obsahuje 13 684 položek dat.  Viz obrázek:

Takže naše rutina se musí vyrovnat s vyhledáváním v rozsáhlé tabulce. Pokud chceme rutinu zrychlit, musíme nejdřív vypátrat, co nejvíc zdržuje. Pro měření času u jednotlivých operací existují sofistikované metody, které teď ponecháme stranou, a zkusíme metodu našemu vnímání nejbližší, a to intuitivní. Prostě rutinu vyvoláme ve VBA a budeme ji krokovat. Prodlevy přímo „ucítíme“.

Otevřete si VBE a zobrazte modul  MD_prijmeni. Měli byste vidět zhruba toto:

Pro zahájení krokování pro jistotu postavte myší kurzor na slovo „Zadej_Prijmeni()“ a stiskněte <F8>.  Opakovaným stiskem  <F8> posunujete žluté podbarvení řádku (přesněji instrukce), který má být vykonán. Zapojte svou intuici a po každém stisku odhadujte, kdy se instrukce provedla „okamžitě“ a kdy to chvíli „přemýšlelo“. Viz obrázek:

Po odmáčknutí <F8> na „Range("J:P").Clear“ přejde žlutá šipka okamžitě na „Do“, zato odmáčknutí <F8> na „Do“ vykazuje určitou

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