4.6.4 Tvorba formulářů
Ing. Marek Laurenčík
Obsahem této kapitoly je několik komplexních příkladů pro tvorbu
uživatelských formulářů. Zaměříme se především na formuláře obsahující také
programový kód VBA. Příklady probírané v této kapitole jsou poměrně jednoduché.
Nebude však jistě velkým problémem postupy a techniky, které si procvičíme v
této kapitole, spojit v rozsáhlejším formuláři, používaném v praxi.
Příklady, probírané v této kapitole, jsou vyřešeny v sešitu 4_6_4_priklady_formularu.xls.
Nahoru Formulář pro vstup dat
Prvním příkladem je formulář, který je určen pro zápis údajů,
přenášených do buněk na některém listu. Tento formulář může být velice
užitečný, zejména pokud příkaz pro jeho spuštění napíšeme do událostní
procedury Open (kap. Spouštění maker událostmi a z programového kódu). Tím se formulář spustí při
každém otevření sešitu a donutíme tak uživatele vyplnit vždy před prací se
sešitem potřebné údaje, např. aktuální měnové kurzy. Pro jednoduchost vytvoříme
formulář pouze s jediným zadávaným údajem; tvorba podobného formuláře s více
údaji již nebude problémem.

Potřebujeme vytvořit formulář, který by umožnil vyplnění
aktuálního kurzu eura vůči koruně a výsledek zapsal do buňky C3 na listu
„Kurzy“. Požadujeme převod údaje na měnu a kontrolu zapsaného údaje. Zároveň je
potřeba, aby uživatel nemohl formulář zavřít ležatým křížkem, ale pouze
některým z příkazových tlačítek (OK pro uložení údaje, Storno pro zavření
formuláře bez zápisu).
Nejprve vytvoříme nový formulář a v něm potřebné prvky: TextBox s
názvem „txtEuro“ a příkazová tlačítka s názvy „cmdOK“ a „cmdStorno“. Vlastnost Cancel u druhého tlačítka nastavíme na hodnotu True, aby bylo
možné formulář zavírat bez zápisu do buňky klávesou ESC.
Nejdůležitější částí formuláře je kód události Click u
tlačítka cmdOK, který provádí kontrolu a zápis údaje do buňky. Při odkazu na
buňku musíme důsledně používat také odkaz na list, protože uživatel může
formulář spustit na jakémkoliv listu. Prostý příkaz
Worksheets(„Kurzy“).Range(„C3“) = Me.txt Euro
však nestačí, protože uživatel může do textového pole zapsat
nesmyslný údaj (např. písmeno) nebo je nevyplnit vůbec. Kromě toho je údaj z
TextBoxu chápán vždy jako text a potřebujeme jej převést na měnový údaj.
Převod textu na měnu provedeme tak, že nejprve v kódu nadeklarujeme
pomocnou měnovou proměnnou „kurz_eu“ a do ní dosadíme potřebný text (v kap. Proměnné a funkce jsme tento trik prováděli s
datovým údajem). Kontrolu, zdali uživatel údaj vyplnil, můžeme provést
zjištěním délky údaje pomocí funkce Len (kap. Proměnné a funkce). Tato kontrola však selže,
jestliže uživatel zapíše do textového pole písmeno; v takovémto případě je
délka údaje sice nenulová, avšak kód formuláře skončí chybou.
Proto použijeme odchycení chyb příkazem On Error (kap. Tvorba vlastních panelů a nabídek). Jestliže v tomto příkazu
použijeme klauzuli Resume Next, při chybě se následující příkaz
přeskočí. Problém tedy vyřešíme takto: do proměnné „kurz_eu“ nejprve dosadíme
nesmyslnou hodnotu (např. -1). Poté použijeme příkaz On Error a za ním
dosazení obsahu textového pole do této proměnné:
kurz_eu = -1
On Error Resume Next
kurz_eu = Me.txtEuro
Pokud pokus o dosazení skončí chybou, v proměnné „kurz_eu“ zůstane
záporná hodnota. Pak již stačí použít podmíněný příkaz: je-li hodnota kurz_eu
záporná, upozorníme uživatele na chybu, vrátíme kurzor do textového pole pomocí
metody SetFocus (kap. Programový kód ve formuláři) a proceduru předčasně ukončíme
příkazem Exit Sub. Tím také zabráníme uzavření formuláře. V opačném
případě dosadíme proměnnou „kurz_eu“ do potřebné buňky.
Pro chybové hlášení použijeme MsgBox jako funkci s parametrem
48 (výstražné hlášení). Hodnotu funkce musíme dosadit do pomocné proměnné,
kterou dále nepoužijeme (kap. Proměnné a funkce).
Obrácené dosazení, tj. přepis buňky s údajem do formuláře při jeho
otevření můžeme provést jednoduchým dosazovacím příkazem, který zapíšeme do
událostní procedury UserForm_Initialize (kap. Programový kód ve formuláři).
Nakonec ještě napíšeme kód, který donutí uživatele zavřít formulář
příkazovým tlačítkem. K tomu využijeme událostní proceduru UserForm_QueryClose (kap. Programový kód ve formuláři), která se spustí při pokusu o
zavření formuláře. Tato procedura má parametry Cancel a CloseMode. Jestliže má druhý parametr hodnotu nula, znamená to zavření
formuláře ležatým křížkem. V tomto případě dosadíme do parametru Cancel hodnotu True a tím zabráníme zavření formuláře.

Na tomto formuláři je názorně vidět, že většina kódu je určena pro
zabránění uživatelových chyb. Zdůrazněme si znovu, že ošetření chyb u maker a
formulářů musíme věnovat patřičnou pozornost zejména tehdy, je-li sešit určen
pro rutinní práci více uživatelů.
Popisovaný formulář je vytvořen v sešitu 4_6_4_priklady_formularu.xls pod názvem
„Vstup_udaju“. Spustíme jej na prvém listu „Kurzy“ pomocí makra
Spustit_vstup_udaju.
Nahoru Různé volby na formuláři
Pro nastavení různých variant práce sešitu budeme často potřebovat
formulář, který je určen pro nastavení různých voleb. Jako prvky můžeme použít
zaškrtávací políčko, přepínač nebo rozvírací seznam.

Potřebujeme vytvořit formulář s následujícími prvky: zaškrtávací
políčko bude zapisovat do buňky C3 texty „ANO“ a „NE“, dva přepínače o třech
polohách fungující nezávisle a zapisující do buněk C5 a C7 pořadová čísla voleb
a rozvírací seznam, který bude do buňky C9 zapisovat rovněž pořadové číslo
volby. Texty voleb, zobrazované v rozvíracím seznamu, se při spuštění formuláře
načtou vždy znovu z oblasti počínaje buňkou G4. Počet voleb v rozvíracím
seznamu se může měnit.
Nejprve vytvoříme nový formulář a v něm potřebné prvky:
zaškrtávací políčko s názvem „chkVolba“, šest přepínacích voleb s názvy
„grpJedna_1“ až „grpJedna_3“ a „grpDva_1“ až „grpDva_3“, rozvírací seznam s
názvem „cboVyber“ příkazová tlačítka s názvy „cmdOK“ a „cmdStorno“. Označíme
první tři volby ve formuláři a nastavíme u nich vlastnost Groupname na hodnotu
„Jedna“, obdobně u zbylých tří voleb tuto vlastnost nastavíme na hodnotu „Dva“.
Tím dosáhneme toho, aby obě trojice přepínacích voleb tvořili dvě samostatné
skupiny (kap. Použití seznamů ve formuláři).
Dále vytvoříme kód u tlačítka „cmdOK“. Pro vkládání výsledku ze
zaškrtávacího políčka do buňky C3 využijeme funkce IIf (kap. Proměnné a funkce). Do buňky C5 vložíme pořadové
#číslo volby v první skupině přepínačů. Protože volba nabývá hodnot True nebo
False, musíme otestovat postupně všechny tři volby a podle jejich hodnot zapsat
do buňky potřebné číslo (kap. Pokročilé prvky na formuláři), např.
If Me.grpJedna_1 Then
Worksheets(”volby”).Range(”C5”) = 1
End If
U druhé skupiny využijeme vlastnosti formuláře Tag, do které
můžeme dosazovat libovolnou hodnotu (kap. Programový kód ve formuláři). Do událostních procedur
AfterUpdate u prvé volby druhé skupiny zapíšeme kód
If Me.grpDva_1 Then
Me.Tag = 1
End If
a podobně u ostatních voleb. V události Click tlačítka „cmdOK“ potom
postačí jediný příkaz, kterým vlastnost Tag dosadíme do buňky C7.
Nakonec do buňky C9 dosadíme vlastnost ListIndex rozvíracího seznamu,
zvětšenou o jednotku (vlastnost ListIndex vrací pro prvou volbu hodnotu
nula, viz kap. Použití seznamů ve formuláři).
V událostní proceduře Initialize zapíšeme kód pro naplnění
rozvíracího seznamu texty ze sloupce G. Použijeme přitom cyklus typu For. Each
přes kolekci buněk (kap. Práce s listy, sešity a aplikací Excelu). Protože počet voleb může
být různý, nevíme dopředu velikost oblasti buněk s texty. Proto využijeme
odkazu CurrentRegion, spojený s prvou buňkou, ve které je zapsán text,
což je buňka G4 (kap. Odkazy na buňky a oblasti). Pro přidání obsahu buňky do
seznamu voleb využijeme metodu AddItem (kap. Použití seznamů ve formuláři).
Při spuštění formuláře ještě zajistíme, aby se v rozvíracím seznamu
zobrazil text, odpovídající údaji v buňce C9. Je-li buňka prázdná, zobrazíme
prvý text. K tomu využijeme indexovanou vlastnost List, která vrací
texty jednotlivých voleb (kap. Použití seznamů ve formuláři). Jestliže je v buňce C9 zapsán
nějaký údaj, tj. délka, zjištěná funkcí Len je větší než nula (kap. Proměnné a funkce), do seznamu dosadíme vlastnost List s indexem o jednu menším, než je obsah buňky (indexování textů
voleb se počítá od nuly). Jestliže je buňka C9 prázdná, do seznamu dosadíme
vlastnost List s indexem nula.

Uvedený cyklus přes buňky v odkazu CurrentRegion můžeme využít
pouze tehdy, jestliže kolem oblasti s texty nejsou žádné zaplněné buňky.
Sloupce F a H tedy musí být prázdné.
Tento formulář s volbami je v sešitu 4_6_4_priklady_formularu.xls vytvořen
pod názvem „Volby“. Spustíme jej na prvém listu „Volby“ pomocí makra
Spustit_volby.
Nahoru Dva propojené seznamy
Třetím příkladem je formulář s dvojicí seznamů. Volby, zobrazované
ve druhém seznamu, jsou rozděleny do skupin a označení jednotlivých skupin se
zobrazuje v seznamu prvním. Jestliže v prvním seznamu nastavíme některou ze
skupin, ve druhém seznamu se zobrazí pouze volby, odpovídající nastavené
skupině. Jestliže má formulář nabízet velké množství voleb, použití takto
vytvořené dvojice rozvíracích seznamů vede k výraznému zpřehlednění
formuláře.

Ve formuláři je třeba vytvořit rozevírací seznam s názvy měst,
patřících do čtyř různých zemí: Německa, Francie, Velké Británníe a USA.
…