dnes je 11.5.2025

Input:

Tvorba formulářů

10.11.2006, , Zdroj: Verlag Dashöfer

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.

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.

Příklad
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.

Pozor!
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.

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.

Příklad
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.

Pozor!
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.

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.

Příklad
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.

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