+ All Categories
Home > Documents > 00-vba1 - Kopie

00-vba1 - Kopie

Date post: 26-Jun-2015
Category:
Upload: asd12323
View: 1,427 times
Download: 5 times
Share this document with a friend
182
Transcript
Page 1: 00-vba1 - Kopie
Page 2: 00-vba1 - Kopie

Excel 2000-2007 záznam, úprava a programování maker - 2 . , aktualizované vydání

Jaroslav Černý

Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 3277. publikaci

Odpovědný redaktor Pavel Němeček Návrh vnitřního layoutu Miroslav Lochman Sazba Petra Tesárková Návrh a grafická úprava obálky Vojtěch Kočí

Počet stran 192 První vydání, Praha 2008

Copyright © Grada Publishing, a.s., 2008

V knize použité názvy programových produktů, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků.

Vytiskly Tiskárny Havlíčkův Brod, a.s. Husova ulice 1881, Havlíčkův Brod

ISBN 978-80-247-2305-1

Page 3: 00-vba1 - Kopie

Obsah Úvod 9

1 . Makra v Excelu 1 3

1 . 1 Proč je v Excelu obsažen i programovací j a z y k 1 3

1 . 2 Něco málo o v ý v o j i Excelu z hlediska programování 1 6

1 . 3 Typy listů v sešitu a jejich v z t a h k programování 1 6

2. Nahrávání maker 1 9

2 . 1 Proč makra nahráváme? 2 0

2 . 2 Začínáme s nahráváním maker 2 0

2 . 3 Relativní a absolutní o d k a z y na buňky a jejich použití při nahrávání maker 2 9

3. První setkání s editorem jazyka Visual Basic 31

3 . 1 J a k nahraná makra upravit? 3 1

3 . 2 Spuštění editoru j a z y k a Visual Basic 3 2

3 . 3 V z h l e d editoru j a z y k a Visual Basic 3 4

3 . 4 R e ž i m y práce v editoru Visual Basicu 3 8

3 . 5 Rozbor nahraných maker 39

3 . 6 O k n o Immediate 4 4

4 . Úvod do V B A a objektového programování 4 7

4 . 1 Principy programování v Excelu 4 7

4 . 2 O b j e k t y v j a z y k u V B A 4 8

4 . 3 Události 55

4 . 4 Nápověda k jednotlivým objektům 55

Page 4: 00-vba1 - Kopie

5. Začínáme psát vlastní makra 59

5 . 1 Části standardního modulu kódu 60

5 . 2 Procedury a funkce 60

5 . 3 Jednotlivé části podprogramů 62

5 . 4 P ř í k a z y a jejich zápis 64

5 . 5 Proměnné 64

5 . 6 Konstanty 65

5 . 7 N á z v y objektů, proměnných a konstant 65

5 . 8 V ý r a z y 66

5 . 9 O p e r á t o r y 6 7

5 . 1 0 D a t o v é t y p y proměnných a konstant 69

5 . 1 1 Rozsah platnosti a životnost 7 1

5 . 1 2 Deklarace proměnných 7 3

5 . 1 3 Praktické u k á z k y deklarací proměnných,

jejich platnosti a životnosti 7 5

5 . 1 4 Z p ů s o b y zápisu hodnot do proměnné 7 7

5 . 1 5 Další poznámky k d a t o v ý m typům 7 9

5 . 1 6 Pole proměnných 8 0

5 . 1 7 Parametry a jejich druhy 82

5 . 1 8 Rozhodovací bloky 85

5 . 1 9 Cykly 89

5 . 2 0 J a k se spouští procedury (shrnutí) 91

6. Často používané příkazy, funkce a konstrukce 9 7

6 . 1 Funkce pracovního listu v kódu V B A 9 7

6 . 2 Vestavěné příkazy a funkce obecně 98

6 . 3 J a k z kódu informovat uživatele - příkaz a funkce M s g B o x 99

6 . 4 Z a d á v á n í hodnot - funkce a metoda InputBox 1 0 2

6 . 5 Funkce pro práci s t e x t o v ý m i hodnotami 1 0 4

Obsah

Page 5: 00-vba1 - Kopie

6 . 6 Funkce pro práci s číselnými hodnotami 1 0 7

6 . 7 Vlastní funkce, které můžete použít na pracovních listech 1 0 8

6-8 Další časté konstrukce 1 0 9

6 . 9 Cvičení 1 1 1

7 . Pracujeme s objektem Range 1 1 3

7 . 1 Co všechno může být objektem typu Range? 1 1 3

7 . 2 J a k určit oblast bunék 1 1 4

7 . 3 O d k a z y na objekt typu Range 1 1 4

7 . 4 Pracujeme s oblastmi bunék - základní vlastnosti a metody 1 2 1

7 . 5 Příklady různých technik pro práci s buňkami 1 2 4

7 . 6 Formátování obsahu bunék 1 3 2

7 . 7 Cvičení 1 3 5

8. Pracujeme s objekty Workbook a Worksheet 1 3 7

8 . 1 Pracovní listy 1 3 8

8 . 2 Práce s objektem PageSetup a tisk listů 1 4 6

8 . 3 Pracujeme se sešity 1 4 9

8 . 4 O d p o v ě ď na hádanku 1 5 6

8 . 5 Cvičení 1 5 6

9. Objekt Application a jeho význam 1 5 7

9 . 1 Užitečné metody a vlastnosti objektu Application 1 5 7

9 . 2 Z o b r a z e n í vestavěných dialogových oken 1 6 3

9 . 3 Cvičení 1 6 4

1 0 . Jak řešit chyby v makrech 165

1 0 . 1 Chyby z a běhu programu 1 6 7

1 0 . 2 Chybové rutiny v kódu 1 6 7

Page 6: 00-vba1 - Kopie

8 E X C E L 2 0 0 0 - 2 0 0 7

1 0 . 3 Ladicí nástroje Excelu 1 7 3

1 0 . 4 Stručný přehled nedůležitějších chyb 1 7 8

Rejstřík 1 8 1

Obsah

Page 7: 00-vba1 - Kopie

I I I M

Úvod

Zdravím budoucí programátory, kteří si vybrali programovací jazyk VBA. Doufám, že se vám kniha bude líbit a že bude tím správným výchozím bodem pro další studium, a pře-devším psaní vlastního kódu.

Učebnice se zaměřuje na základy programování v Excelu 97 až 2007 (tedy i Excelu 2000, 2002 a 2003) - uvedené verze se navzájem liší jen zanedbatelně, případné důležité rozdíly budou v textu vždy zdůrazněny. Zásadním rozdílem je jen zcela nové uživatelské rozhraní Excelu 2007 (které mne ničí), ale v něm se naštěstí příliš pohybovat nebudeme.

V prvním dílu knihy se věnuji těm záležitostem, které programátor Excelu prostě „musí' znát, a těm technikám, které bude v Excelu používat nejčastěji.

První díl nyní vychází již potřetí - a já proto děkuji všem, kteří si ho zakoupili, a postarali se tak o relativně slušný úspěch této útlé knížečky. Na základě současných informací z nakladatelství se bohužel zdá, že druhý díl vyprodán ještě není, a zůstane proto bez aktualizace.

V celém textu se snažím být maximálně stručný, což je přirozený důsledek dlouholeté zkušenosti lektora, který ví, že jeho posluchači (čtenáři) se chtějí něco naučit a nezajímají je

Page 8: 00-vba1 - Kopie

marketingové a jiné bláboly. Připouštím, že sem tam na některé věty či pasáže narazíte více-krát - ale opakování je matka moudrosti a některé věci je dobré připomenout vícekrát.

Programování maker není záležitostí pro úplné počítačové začátečníky a také ne pro ty, kdo si jen rádi hrají. V celém textu knihy automaticky předpokládám, že umíte s Excelem pracovat a víte, k čemu všemu se dá použít. Např. v části věnované programování grafů (je součástí druhého dílu učebnice) rozhodně nenajdete výklad toho, jak se graf vytváří ručně v uživatelském rozhraní...

Počítejte také s tím, že bez znalosti angličtiny se toho moc nenaučíte, pro zvládnutí pokro-čilých témat je nezbytná, ale i u základů se vám bude hodit. Česky toho totiž příliš nevyšlo a spoustu materiálů seženete na internetu jen v angličtině.

Je přirozené, že váš pohled na knihu bude jiný než můj. Pokud zjistíte, že v knize schází některá fakta, bez kterých si nevíte rady, napište na adresu [email protected], a já se pokusím vám stručně vysvětlit souvislosti.

Používané konvence Jak jste již z publikací nakladatelství Grada zvyklí, orientaci v textu vám budou usnadňovat různé typografické pivky:

Pozor! Důležité pojmy a pasáže textu, které je třeba zvýraznit (názvy složek, souborů, tlačítek, nabídek, příkazů, dialogových oken), jsou vysazeny tučně. Názvy internetových adres a odkazů označuji kurzívou. Jednotlivé příkazy v posloupnosti příkazů zadávané v nabídkách, podna-bídkách a následně otevíraných dialogových oknech oddělujeme šipkami - např. Nástroje —> Možnosti —> Zobrazení —» Zalomit do okna. Názvy kláves a klávesových zkratek označujeme KAPITÁLKAMI - např. ENTER nebo A L T + S .

Program Pro výpis zdrojového kódu v příkladech a pro odlišení jednotlivých prv-ků programu v běžném textu je použito patkové neproporcionální písmo.

V textu se budete často setkávat s odstavci označenými ikonou, která bude charakterizovat druh informace v daném odstavci:

Ikona označuje poznámku, která není nezbytná k pochopení dané problematiky, ale týká se tématu a prozrazuje další souvislosti.

Tato ikona vás upozorní na různé tipy a triky, kterými si můžete usnadnit některé činnosti nebo které vám umožní dosáhnout efekt-ních výsledků.

Varovný trojúhelník označuje text, který vás upozorňuje na něco, na co byste si měli dát pozor, co vás může nepňjemně překvapit nebo co by vám ?nohlo způsobit problémy.

Název Vložit —• Rám

KLÁVESA

t i p

ty

Page 9: 00-vba1 - Kopie

mm

E X C E L 2 0 0 0 - 2 0 0 7 2 3

U k á z k o v é soubory ke knize Ke druhému aktualizovanému vydání jsem připravil několik jednoduchých ukázkových souborů, které si můžete stáhnout ze stránek nakladatelství na adrese www.grada.cz. Soubory jsou v archivu uspořádány velmi jednoduchým způsobem (každá kapitola má vlastni složku).

Archivní soubor po staženi rozbalte do některé vlastni složky.

Page 10: 00-vba1 - Kopie
Page 11: 00-vba1 - Kopie

¿2 >

o 3S

Makra v Excelu

Základní otázkou, na kterou jste si měli sami odpovědět, než jste tuto knihu zakoupili, je to, zda má vůbec smysl se do programováni pouštět. A náplní první kapitoly jsou právě odpovědi na otázky: „K čemu je programováni? Proč bych to měl dělat? Jak se do toho pustit?"

1 . 1 Proč je v Excelu obsažen i programovací jazyk Čím více zkušeností s prací v Excelu budete mít, tím rychleji zjistíte, že mnohdy určité činnosti a operace stále a stále opakujete - a to tak často, že zatoužíte po nějakém „po-mocníkovi", kteiý by tyto operace dělal za vás.

V mnoha případech vám bude některá operace připadat příliš zdlouhavá - např. dopl-ňování vstupních údajů do složitě strukturovaných tabulek, ve kterých musíte pro každý nový údaj vyhledat příslušný sloupec či řádek. Ztráta času bude dost velká, takže nejspíše začnete uvažovat o nějakém nástroji, který by celou činnost zrychlil.

1 . 1 Proč je v Excelu obsažen.

Page 12: 00-vba1 - Kopie

14 E X C E L 2 0 0 0 - 2 0 0 7 2 3

Tyto pocity zažívaly tisíce uživatelů před vámi, proto byly do většiny populárních kan-celářských (i jiných) programů začleněny prostředky pro psaní tzv. maker (má je nejen Excel, ale i Word a další programy). Makro je posloupnost příkazů, spuštěná jako celek, jejímž cílem je automatizovat některé pracovní postupy, vyloučit tak opakované operace a snížit počet případných chyb při zpracování dat.

V e kterých případech je vhodné používat makra? Otázku je možné položit i jinak - co všechno se dá pomocí maker udělat? Možností je mnoho, přiblížíme si alespoň ty nejdůležitější:

1. Automatizace často prováděných úkonů. Zkuste si sami vzpomenout, které činnosti provádíte vždy před odchodem z práce, na konci týdne, na konci měsíce, po vytvoření sešitu... Patřit sem může např.:

V Otevření sešitu, vytištění jeho části a následné uzavření. Otevření více sešitů najednou, sloučení jejich obsahu do nového sešitu a jeho uložení.

V Zpracování více různých sešitů stejným způsobem.

V Opakované vkládání delších textů (adresy, seznam telefonních čísel...).

Vytváření grafů.

V Stejné formátování různých oblastí buněk.

S Tisk různých, přesně daných částí sešitu.

2. Vytvoření vlastní funkce či příkazu. Pomocí vlastní funkce se dají zjednodušit některé vzorce, vlastním příkazem můžete zkombinovat několik příkazů z nabídek Excelu.

3. Vytvoření celé nové aplikace. Programovací jazyk většinou nabízí i vlastní dia-logová okna nebo panely nástrojů, které výrazně zjednoduší práci s programem.

J a k se dají makra v y t v o ř i t ? V zásadě jsou možné dva způsoby:

V Makro si můžete nahrát pomocí záznamníku maker. Při nahrávání jsou všechny činnosti, které v Excelu provádíte, automaticky zapisovány jako makro do modulu (části sešitu určené pro ukládání programovacího kódu). Po zastavení záznamníku můžete nahrané makro okamžitě spouštět, ve většině případů je ovšem nutné ho trochu upravit. Výhody a nevýhody záznamníku maker jsou popsány ve druhé kapitole.

-Z Makro můžete napsat ručně. Tento přístup má mnoho výhod, ale jednu zásadní nevýhodu - musíte dobře znát daný programovací jazyk.

Kdo makra obvykle v y t v á ř í ?

S Každodenní uživatelé Excelu ovládající programování špatně či vůbec, kteří si ale dokážou makro nahrát a urychlit tak některé úkoly.

Vývojáři (programátoři), jejichž úkolem je vytvářet rozsáhlejší tabulkové aplikace pro pracovníky vlastního podniku či zákazníky.

1 . Makra v Excelu

Page 13: 00-vba1 - Kopie

J a k se dají hotová makra spouštět? Hotové makro je uloženo v tzv. modulu uvnitř sešitu, kde ho lze spustit či dále upravit, běžný uživatel se ovšem s modulem v praxi přímo nesetká (to by musel otevřít editor jazyka Visual Basic). Proto je nutné, aby mohl spouštět makra přímo z uživatelského prostředí. Excel v tomto ohledu nabízí dostatečné množství variant:

v" Makro můžete vždy spustit z dialogového okna Makro, které otevřete příkazem Nástroje —> Makro —> Makra (nebo klávesovou zkratkou A L T + F 8 ) , V Excelu 2 0 0 7

je to příkaz Zobrazit makra v rámečku Makra na kartě Zobrazení. V dialogovém okně Makro vidíte seznam všech dostupných maker, pokud některé z nich v seznamu označíte, stačí pak už jen stisknout tlačítko Spustit.

V Makru můžete přiřadit klávesovou zkratku. 2 určitých důvodů vám však Excel v dialogovém okně možností makra nabízí jen zkratky typu CTRL+PÍSMENO, případně CTRL+SHIFT+PÍSMENO. Neznamená to, že byste makro nemohli spouštět i jinými kom-binacemi kláves, ale ty již musíte určitým způsobem naprogramovat.

V Makro se dá spouštět určitým příkazem nabídky. Příkaz pro spuštění makra se dá přidat do libovolné nabídky, dokonce si můžete vytvořit i vlastní nabídku.

y Makro můžete přiřadit nějakému tlačítku na panelu nástrojů. Jde o velmi často používanou možnost, protože toto tlačítko můžete graficky upravit tak, aby vizuálně naznačovalo, jaké makro se po jeho stisknutí spustí.

y/ Makro dále můžete přiřadit tlačítku umístěnému v listu či na formuláři, nebo libovolnému grafickému objektu. I tato možnost se hojně využívá, zvláště u maker určených k provádění operací na konkrétním listu.

Kromě toho umí Excel spustit makro (programový kód) i sám, bez přispění uživatele. Využívá při tom tzv. událostí, které probíhají při určitých akcích, např. otevření sešitu, tisk sešitu, aktivace jiného listu apod.

1 . 1 Proč je v Excelu obsažen.

Page 14: 00-vba1 - Kopie

16 E X C E L 2 0 0 0 - 2 0 0 7 2 3

Tip V Excelu 2007je většina příkazů uživatelského rozhraní, spojených s makry, umístěna na kartě Vývojář. Tato karta se však standardně v pásu karet nezobrazuje, proto je třeba ji nejdříve zapnout:

1. Klepněte na tlačítko sady Microsoft Office a v rozvinuté nabídce dole klepněte na tlačítko Možnosti aplikace Excel.

2. V kategorii Oblíbené zaškrtněte v horní části políčko Zobrazit na pásu kartu Vývojář a klepněte na tlačítko OK.

1.2 Něco málo o vývoji Excelu z hlediska programování Excel má dost bohatou historii verzi, i když v dnešní době ty starší (2, 3, 4, 5, 95) jsou již dávno mimo hru; těžko se najde někdo, kdo by je ještě používal (Microsoft je již také žádným způsobem nepodporuje).

V nejstaršich verzích Excelu byl k dispozici programovací jazyk XLM, v Excelu 5 se poprvé objevil mnohem modernější, výkonnější a objektově orientovaný jazyk Visual Basic for Applications (dále VB A), který byl pravděpodobně jedním z faktorů, proč se Excel velmi brzy poté stal dominantním tabulkovým procesorem.

Pro nás je výchozí až Excel 97, kteiý se objevil začátkem roku 1997, bud samostatně, nebo jako součást balíku aplikaci Office 97. (Někdy je označován jako Excel 8, hlavně v názvech souborů nápověd.) Excel 97 totiž přišel se zcela novým uživatelským rozhraním pro pro-gramování - s moduly maker se pracuje ve zvláštním editoru Visual Basicu, starý způsob psaní kódu přímo v uživatelském prostředí Excelu byl opuštěn (moduly jsou ovšem stále ukládány jako součást sešitů, tedy uvnitř souborů XLS). Značně se tak zvýšila efektivita práce programátorů, protože staré nástroje se s pohodlím nového editoru nemohly srovnávat. Je zajímavé, že tento editor byl v českém Excelu 97 počeštěn, zatímco v české verzi Excelu 2000 a novějších verzích zůstal nelokalizován.

V dalších verzích Excelu se již nic zásadního nedělo, samozřejmě každá verze přinesla pár novinek, obvykle souvisejících s vylepšenými nebo novými funkcemi.

1 . 3 Typy listů v sešitu a jejich vztah k programování Celkem existuje pět typů listů, které se v sešitu Excelu mohou objevit:

S pracovní listy (angl. worksheets);

S listy typu graf (charts);

V listy maker XLM (Makro MS Excel 4.0; zastaralé, stále jsou však podporovány);

V listy dialogů Microsoft Excel 5.0 (zastaralé, stále jsou však podporovány);

y mezinárodní list maker (relikt z prastarých verzí Excelu; jeho význam je utajen již v nápovědě k Excelu 95!).

Na poslední tři typy listů jste asi v praxi nikdy nenarazili, ale i v nejnovějším Excelu 97 se dají stále vložit přes místní nabídku listu, kterou vyvoláte klepnutím pravým tlačítkem myši na ouško listu. V místní nabídce stačí vybrat příkaz Vložit, a objeví se toto dialogové okno:

1 . Makra v Excelu —

Page 15: 00-vba1 - Kopie

G r a f M a k r o M S M e z i n á r o d n í E x c e l 4 . 0 list m a k e r

D i a l o g M S E x c e l S . 0 N á h l e d n e n í k dispozici.

S a b b n y v e s l u ž b ě O f f i c e O n l i n e O K S t o r n o

Nejběžnějším typem listu je tzv. pracovní list. Tento list má většina lidí na mysli, pokud mluví o tabulkách. Každý pracovní list Excelu 97, 2000, 2002 a 2003 má 256 sloupců a 65 536 řádků, v Excelu 2007 byly tyto limity zvýšeny na 16 384 sloupců a 1 048 576 řádků.

S prvními dvěma typy listů pracujete přímo v sešitu. Makra jazyka VBA jsou ukládána vý-hradně v modulech, se kterými je možné pracovat jen v programovacím editoru.

Kromě maker, která jsou složena jen z kódu, můžete naprogramovat i vlastní dialogová okna, tedy grafický pivek uživatelského rozhraní, který lze zobrazit přímo nad pracovním listem Excelu. Ve starších verzích Excelu se tato dialogová okna vytvářela na speciálních listech dialogů. Novější verze (počínaje Excelem 97) sice stále tyto listy podporují, nabízejí však daleko lepší alternativu: formuláře UserForm.

py listů v sešitu a jejich vztah.

Page 16: 00-vba1 - Kopie
Page 17: 00-vba1 - Kopie

Nahrávání maker

Jak již víte z pivní kapitoly, při nahrávání maker je zaznamenávána veškerá činnost, kterou v Excelu provádíte. Pro nahrávání maker má Excel vestavěn zvláštní záznamník. Uživatel nebo programátor určitým příkazem Excelu vyvolá úvodní dialog, ve kterém zapíše název makra, a poté spustí záznamník. Excel začne nahrávat všechny akce myši, stisk kláves, vyvolané příkazy, otevřené dialogy atp. Jakmile je vše potřebné nahráno, uživatel nahrá-vání ukončí.

Nahrávání je nutné ukončit ručně, jinak zůstane záznamník zapnut a bude do makra ukládat všechny další činnosti, a to až do ukončení Excelu!

2 . Nahrávání maker

Page 18: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

2.1 Proč makra nahráváme? Co získáte, když budete makra nahrávat?

V Jedná se o nejrychlejší způsob vytvořeni makra.

V Nahráváni je nezasmpitelné během všech fázi poznáváni jednotlivých objektů Excelu. V kapitole věnované objektům se dozvíte, že objekty maji velké množství různých vlastnosti, které jsou sice popsány v nápovědě, nicméně nahráním makra zjistíte nejrychleji, které z těchto vlastnosti skutečně musíte použít.

Na druhé straně nelze přehlížet zásadní nevýhody nahraných maker:

S Záznamník vždy jednotlivé objekty (buňky, listy, grafy) vybírá, v nahraném makru tedy vždy najdete příkazy pro výběr - pokud si ovšem požadovaný objekt nevy-berete sami ještě před spuštěním záznamníku. Výběr objektů však ve skutečnosti není nutný a prodlužuje dobu provádění makra.

S Výběr objektů má ještě následující důsledky: bud si příslušný objekt (buňky, graf) ozna-číte ještě před začátkem nahrávání makra - v takovém případě pak bude makro vždy zpracovávat aktuální výběr - nebo budete jednotlivé objekty vybírat až při vlastním nahrávání - pak ovšem bude nahrané makro pracovat vždy a právě jen s těmito objekty. Jestli to není jasné, nelamte si s tím hlavu, zopakujeme si to později na příkladech.

V Nahrané makro vždy zaznamená jen přesně daný sled činností, které jste prováděli při jeho nahrazování. Není možné nahrát například výběr akce na základě nějaké podmínky, není možné žádnou akci na základě určité podmínky vynechat.

Způsob, jakým záznamník nahrává prováděné operace, se občas dá těžko pochopit. Kód, který byste ručně napsali mnohem efektivněji, je někdy správně strukturován, někdy ne.

2.2 Začínáme s nahráváním maker V předchozím výčtu nevýhod nahrávání jsem napsal, že záznamník maker vždy nahraje i veškeré výběry objektů, které při nahrávání provádíte. Nahraný kód navíc ve výchozím nastavení pracuje s absolutními adresami buněk, což také nemusí být vždy to pravé.

Při každém nahrávání funkčního makra - makra, která potřebujete jen k učení, nepovažuji za funkční - je tedy třeba si nejdříve rozmyslet, jestli začnete makro nahrávat již s nějakým označeným objektem, nebo ho označíte až během nahrávání. Rozdíl si nejlépe ukážeme na úvodních jednoduchých příkladech.

První nahrané makro: formátování buněk Nejdříve si předvedeme makro, v němž objekt vyberete až po začátku nahrávání. Otevřete pokusný sešit Nahravani.xls, uložený ve složce Kap2, a na Listul najděte jednoduchou tabulku z obrázku 2.1.

2. Nahrávání maker

Page 19: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

nahravani-xls [Režim kompatibility] _ Ö X

A B C D i jl E i • 1 2 Sloupec A Sloupec 8 3 : 10 40 m

4 20 50 5 30 50

1 6 7

9 10 11 t H < ( • • l i Us t l List2 t i s t s v g r m mi.,, i 0

Obr. 2.1: Tabulka pro nahrávání maker

A nyní se můžeme pustit do nahráváni. Každé makro musí být nějakým způsobem pojme-nováno, proto vás Excel ještě před spuštěním vyzve k zadání jeho názvu.

V nabídce Excelu vyberte postupně Nástroje —> Makro —> Záznam nového makra (v Excelu 2007 jde o tlačítko Záznam makra na kartě Vývojář; nebo se přepněte na kartu Zobrazení, poté vpravo klepněte na tlačítko Makra a v nabídce vyberte Záznam makra). Objeví se dialogové okno Záznam makra (viz obrázek 2.2).

Obr. 22: Tento dialog se objeví těsně před spuštěnírn záznamníkn maker

V tomto dialogu je nutné zapsat alespoň název makra. Výchozí názvy, které Excel pro nahrávaná makra nabízí (Makro 1, Makro2 atd.), jsou v praxi nepoužitelné, protože neříkají nic o tom, k čemu makro slouží. Proto do textového pole Název makra zapište vlastní název, např. PokusneFormatovani. Pozor, při vymýšlení názvu musíte dodržet určitá pravidla, jinak vás Excel upozorní na chybu a nedovolí vám pokračovat:

M i c r o s o f t O f f i c e E x c e l m Zadaný název není platný,

» \ Příčinou mohou být například tyto důvody: » \ • Na začátku názvu není písmeno nebo podtržitko.

- Název obsahuje mezeru nebo jiné neplatné znaky. - Název koliduje s předdefinovaným názvem aplikace Excel nebo s názr Yern jiného objektu v sešitu.

1 « 1

S Pivním znakem názvu makra musí být vždy písmeno. Na dalších místech mohou být písmena, číslice nebo podtržítka. Název makra nesmí obsahovat mezery, jiné interpunkční znaky (např. tečky, čárky, pomlčky) a některé další znaky (třeba #,

Page 20: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

%, &). Chcete-li název složený z více slov, oddělte je pomoci znaku podtržitka, nebo pište první písmeno každého slova velké, jak jsem to navrhnul já v názvu PokusneFormatovani.

S Maximální délka názvu makra je 255 znaků.

Možné příklady platných a neplatných jmen vidíte v následující tabulce:

Platný název Nevyhovující název MojePrvniMakro 1.Makro (začíná č í s l i c í a obsahuje

tečku) Gra fJLl l Graf 111 (mezera v názvu) OdesliMail Odesli@ (zakázaný znak @)

Název makra by měl odrážet jeho účel. Např. makro pro formátování buněk se může jme-novat Tucne__Cervene_Pismo nebo Ohraniceni_Tabulky_Tloustka2, makro pro vložení nového listu s prázdným záhlavím určité tabulky zase Vlozit_Prehled_Trzeb.

Spodní textové pole Popis obsahuje standardní komentář, který bude zapsán na začátek makra. Komentář můžete ponechat tak, jak je, nebo ho přepsat vlastním textem. (Ko-mentář je možné libovolně upravit i později.). V Excelu 2 0 0 7 již toto pole není předem vyplněno.

U klávesové zkratky vás možná zarazí, že okno Záznam makra nabízí jen variantu CTRL+PÍS-

MENO. Kde je slíbená možnost CTRL+SHIFT+PISMENO? Vidět přímo není, ale postačí do pole zadat velké písmeno (se stisknutou klávesou SHIFT) a sami uvidíte, že SHIFT se do klávesové zkratky dostane. V dalším výkladu nepočítám s tím, že byste si hned pro pivní makro klávesovou zkratku vytvořili - ale když to uděláte, bude jen dobře.

Kam bude makro uloženo? Poslední - a velmi důležitá - volba v tomto dialogovém okně se týká místa, kam bude makro uloženo. Jde vždy o nějaký sešit, jinam se makro uložit nedá. Excel implicitně nabízí uložení do aktivního sešitu („Tento sešit"). Vzhledem k tomu, že makro je k dispozici jen v případě, kdy je tento sešit otevřen, hodí se tato volba jen pro makra používaná v rámci daného sešitu.

V případě, že není žádný sešit otevřen, není tato možnost dostupná.

Druhým možným místem, kam se dá makro zapsat, je osobní sešit maker. Uživatel se s ním při běžné práci v Excelu nesetká - je určen výhradně pro ukládání maker (i když v případě zájmu můžete ukládat i data do jeho listu). Excel tento sešit vytvoří až v oka-mžiku, kdy do něj chcete první makro uložit.

Osobní sešit maker se jmenuje PERSONAL.XLS a je uložen ve složce XLStart, jejíž umístění je různé (v závislosti na verzi Windows). Jak asi víte, sešity umístěné ve složce XLStart se otevírají automaticky při spuštění Excelu, takže makra z tohoto sešitu jsou vždy k dis-pozici.

2 . Nahrávání maker

Page 21: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Osobní sešit maker je od svého vytvoření označen jako skrytý, takže jeho obsah (jeden prázdný list) zobrazíte jedině příkazem nabídky Okno —>Zobrazit (v Excelu 2007ho najdete na kartě Zobrazení). V editoru Visual Basicu se dají jeho 7nakra zobrazit vždy.

Kromě složky XLStart je možné definovat i další složku se stejným účelem (příkazNástroje —»Možnosti, karta Obecné, pole Umís-tění souborů otevřených při spuštění). Sešity uložené ve složce, kterou zde zadáte, se budou rovněž automaticky otevíratpň spuštění Excelu.

Poslední možnosti pro uloženi makra je nový sešit - v tomto případě dojde k vytvoření nového sešitu, a makro bude uloženo do něj. Nikdy jsem se nesetkal s tím, že by tuto možnost někdo využil.

Základní rozdíl v umístění maker tedy spočívá v tom, že makro používané jen v rámci jednoho sešitu ukládáme přímo do něj, zatímco makro obecně zaměřené, využitelné ve více různých souborech, ukládáme do osobního sešitu maker.

Vlastní nahrávání

To jsou tedy volby, které na vás čekají v dialogovém okně Záznam makra. Poté, co v něm klepnete na tlačítko OK, se spustí záznamník maker a na obrazovce se objeví nový panel nástrojů, obsahující dvě tlačítka. Zatím si zapamatujte to pivní - s ikonou modrého čtverečku - protože jeho stiskem se celé nahrávání ukončí.

V Excelu 2007jsou namísto panelů nástrojů jen karty rozmístěné v tzv.pásu karet. Zde nahrávání ukončíte příkazem Zastavit zá-znam, který najdete na stejném místě, jako příkaz zahajující nahrá-vání (pňpadně, je-li aktivní karta Vývojář, je toto tlačítko také dole ve stavovém řádku). Malý panel nástrojů se dvěma tlačítky zde chybí.

Od tohoto okamžiku Excel nahrává všechny vaše akce, včetně těch, které jste udělat ne-chtěli! Postupujte proto při nahrávání maker vždy pomalu a s rozmyslem. Na druhé straně určitou ochranu znamená fakt, že Excel nenahraje akce zbytečné - když např. vyberete oblast buněk a ihned poté vyberete jinou oblast, bude záznam prvního výběru vypuštěn, protože jste buňky v této oblasti nijak neměnili.

Vpňpadě, že jste již dňve zkoušeli programovat ve Wordu, tak víte, že při nahrávání maker v tomto programu není možné používat uvnitř dokumentu myš. To v Excelu neplatí, myší můžete buňky vybírat, přesouvat apod.!

(Word má však jinou výhodu - nahrávání maki-a v něm můžete na chvíli přerušit, v Excelu tato možnost chybí. Pokud tedy před začátkem nahrávání zapomenete provést nějakou nezbytnou operaci, musíte makro nahrát znovu.)

^títornň^

Page 22: 00-vba1 - Kopie

Začali jsme tedy nahrávat makro, přičemž se nacházíme na listu zkušebního sešitu, ve kterém máme připravenou tabulku. První pokus si co nejvíce zjednodušíme:

1. Vyberte myší celou tabulku (oblast buněk A2:B5).

2 . Zadejte příkaz Formát —• Buňky. ( V Excelu 2 0 0 7 stiskněte kombinaci CTRL+SHIFT+F.)

3. V zobrazeném dialogu nastavte na kartě Písmo tučný řez písma a červenou barvu. Okno uzavřete tlačítkem OK.

4. Stiskněte tlačítko s tmavěmodrým čtvercem, které je na malém panelu nástrojů a jmenuje se Zastavit záznam. (V Excelu 2007 klepněte na kartě Zobrazení na tlačítko Makro a vyberte příkaz Zastavit záznam.)

Výborně, první makro je nahráno. Ještě než se pustíme do jeho zkoumání, nahrajeme si stejným způsobem druhé, které bude dělat to samé, jen s tím rozdílem, že buňky tentokrát vybereme ještě před spuštěním záznamu a nebudeme používat dialogové okno Formát buněk, ale použijeme tlačítka na formátovacím panelu nástrojů. Celý postup si tedy zo-pakujete, jen pořadí kroků bude jiné:

1. Vyberte myší celou tabulku.

2. V nabídce Úpravy vyberte Vymazat —> Formáty. (V Excelu 2007 najdete tento příkaz na kartě Domů v rámečku Úpravy.) Tabulku ponechte vybranou.

3. Vyvolejte okno Záznam makra a zadejte název makra (třeba Druhy_pokus). Podle chuti můžete znovu vytvořit i klávesovou zkratku. Potvrďte tlačítkem OK.

4. Objeví se panel nástrojů s tlačítkem pro ukončení makra a Excel začne s nahráváním.

5. Na formátovacím panelu nástrojů (v Excelu 2007 na kartě Domů v rámečku Písmo) stiskněte tlačítko s písmenem B, a poté v rozevíracím seznamu pro barvu písma vyberte červenou barvu.

6. Ukončete nahrávání stisknutím tlačítka Zastavit záznam.

Máme teď nahraná dvě makra, jejichž činnost vypadá zcela shodně. Hned si však ukážeme, že se přece jen podstatně liší.

Zkoumání nahraných maker Praktický rozdíl si předvedeme na dalším listu v sešitu, kde je připravena další pokusná tabulka s jiným počtem řádků a sloupců, která je zároveň umístěna trochu více vpravo (viz obrázek 2.3).

Visual Makra Basic

J Zastavit záznam

jHJ Použít relativní odkazy

J \ Zabezpečení maker

Kód

Page 23: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

nahravam.xis [Režim kompatibility] - 3 X

A B C 1 D E F Gl t 2 :

3 4 I Petr Milan Helena 5 leden 10 20 35 6 únor 15 30 30 7 březen 20 40 25 y 3 duben 25 50 20 9 j květen 30 60 15 10 1 červen 35 70 10 11 m

< • •« Listí j Ltst2 x List3 "T® i M i Obr. 23: Zkušební tabulka pro ověření funkčnosti makra

Stejná tabulka je i na třetím listu v sešitu.

A nyní si ukážeme rozdíl mezi oběma makry. Vyberte celou tabulku (tedy oblast B 4 : E 1 0 ) .

Příkazem Nástroje —> Makro —> Makra (nebo stiskem klávesové zkratky ALT+F8) vyvolejte okno Makro, ve kterém uvidíte obě nahraná makra (viz obrázek 2.4).

Makro mm1 I N á z e v makra:

Ä i f f l E l Spustit |

P o k u s n e F o r m a t o v a n i [ ^ r o k o v a t s v n o ř e n í m j

U p r a v i t |

V y t v o ř i t

| O d s t r a n i t |

M o ž n o s t i . . . j

]

[ S t o r n o ]

M a k r a v : V š e c h n y o t e v ř e n é sešity ]

[ S t o r n o ]

Popis ]

[ S t o r n o ]

Obr. 2.4: Seznam dostupných maker v dialogovém okně Makro

Vyberte makro PokusneFormatovani a stiskněte tlačítko Spustit. Pokud jste si při na-hrávání vytvořili klávesovou zkratku, můžete celé dialogové okno Makro obejít a rovnou ji použít.

Co se stane? Výběr buněk se zruší, místo něj se objeví nová vybraná oblast A2:B5 a text uvnitř bude tučný a červený. Nezávisle na aktuálním výběru tedy makro vybere původní oblast (A2:B5) a v ní provede změnu typu písma.

Přesuneme se do dalšího (třetího) listu a zde označíme libovolnou buňku dané oblasti (např. D7). Nyní spusťte druhé makro - postup je obdobný. Druhé makro změní formát písma jen v označené buňce.

Faktor výběru při nahrávání maker je tedy jasný, navíc z předešlého výkladu jste něco podobného očekávali, můžeme to tedy shrnout:

Page 24: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Tip Jestliže před nahráním makra označíte oblast nebo objekt (grafapod.), bude nahrané makro později vždy pracovat s aktuálně vybranou ob-lastí či objektem.

Dodávám, že spuštěni makra, nahraného pro vybranou oblast buněk, pravděpodobně neskonči dobře, bude-li při jeho dalším použití vybrán např. graf. Pilka na dřevo se také nehodí k řezání ocelového prutu, že?

Je tu však ještě jeden rozdíl, a to dost zásadní. Zatím se ovšem neprojevil, protože jsme formátovali obyčejný text (jehož formát předtím nebyl nijak upraven).

Vrátíme se na původní list s pokusnými daty a vymažeme formáty (Úpravy —» Vymazat —> Formáty, v Excelu 2007 tento příkaz najdete v rámečku Úpravy na kartě Domů). List tedy bude zase vypadat jako na obrázku 2.5.

« nahravani.xls {Režim kompatibility]

¡ H T A I B i C 1

Obr. 2.5: Tabulka v původní podobě

Text v oblasti A2:B5 podtrhněte a změňte typ písma (např. na Courier New). Na obrázku 2.6 vidíte výslednou podobu, zobrazení mřížek mezi buňkami je kvůli lepší viditelnosti vypnuto.

*H| nahravani.xls [Režim kompatibility] — H X

A £ i i C ; D i E : F S 1

«

2 S l o u p e c A S l o u p e c B 3 10 40 4 2 0 5 0 5 3 0 60 6 7

9 10 11 M < i • M L i s t í , List2 List3 . J ' mmm

Obr. 2.6: Upravený formát písma v tabulce

A začneme s dalšími pokusy. Spusťte první makro (to vždy pracuje s oblastí A2:B5, není tedy nutné tabulku vybírat). Co uvidíte? Makro správně změnilo řez písma (na tučné) a barva se také změnila na červenou. Zmizelo však podtržení a došlo ke změně fontu!

2 . Nahrávání maker

Page 25: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Vraťte formát písma do původního tvaru podle posledního obrázku (smažte formáty, znovu písmo podtrhněte a vyberte font Courier New). Jak to bude vypadat, když nyní spustíte druhé makro? Jako na následujícím obrázku (i zde je vypnuté zobrazení mřížek):

nahravani.xls [Režim kompatibility] - é x

A ! B C D E j F ' i 1 j 2 S l o u p e c A S l o u p e c B

-

3 1 0 40 4 2 0 50 5 3 0 60 6 j 7 ; 8 9 10 -i}..: .

I Až se podíváme na skutečný kód obou maker, bude vám příčina těchto rozdílů jasná. I slovní odůvodnění by ale mělo stačit:

Jestliže při nahrávání makra provádíte změny libovolných hodnot v dialogových oknech Excelu, nahrají se do makra všechna nastavení, která se v těchto oknech nacházejí.

Vyvolejte dialogové okno Formát buňky a podívejte se na kartu Písmo. Co zde vidíte? Volby pro font, řez, velikost, barvu, typ podtržení a několik dalších políček. Při nahrávání pivního makra jsme na této kartě měnili jen barvu a řez. Jenomže záznamník vám do makra uloží všechny hodnoty z dané karty - a proto zmizelo po spuštění makra podtržení a font byl nastaven na původní základní font Excelu (což je Arial).

Tato nepňjemná vlastnost záznamníku maker je jedním z hlavních důvodů, proč je nutné většinu nahraných maker následně upravit, aby makro vykonávalo jen ty operace, které od něj očekáváme.

V tomto případě bude očividně nutné z makra odstranit všechny příkazy pro nastavení vlastností písma, s výjimkou řezu a barvy. Jak na to, si ukážeme v clalší kapitole.

Problém n á z v ů listů či jiných objektů Další věcí, na kterou je třeba dát při nahrávání maker pozor, jsou názvy (např. názvy listů). Jak již víte, při nahrávání se do maker zaznamenávají i výběry buněk, listů, grafů apod. - a pokud tyto objekty mají své názvy, jsou v makru tímto názvem identifikovány.

K čemu může dojít, si ukážeme na jednoduchém makru, které odstraní list ze sešitu. (V praxi by odstranění listu mohlo být součástí nějaké větší operace.) Odstranění listu ze sešitu se dá provést dvěma způsoby:

V Výběrem příkazu Úpravy —> Odstranit list z nabídky Excelu (v Excelu 2007 tlačítko Odstranit v rámečku Buňky na kartě Domů).

12 Začínáme s nahráváním maker

Page 26: 00-vba1 - Kopie

S Vyvoláním místní nabídky pro list (pravým tlačítkem myši klepnete na záložku), ve které vyberete příkaz Odstranit.

V obou případech zobrazí Excel výstražné okno, ve kterém vás požádá o potvrzení této operace (odstranění listu se nedá vzít zpět, proto tato ochrana proti nechtěnému smazání), a tepive poté list odstraní.

Podívejme se, jak se budou chovat nahraná makra, ve kterých odstraníme list jedním z uve-dených způsobů. Vytvořte si nový sešit, přidejte do něj pár listů (ať je na čem zkoušet), a pak nahrajte dvě makra:

S Vyberte Listí a nahrajte makro Smazat 1, ve kterém z nabídky Úpravy spustíte příkaz Odstranit list, ve výstražném okně potvrdíte operaci a po odstranění listu nahrávání ukončíte.

S Vyberte List2 a nahrajte makro Smazat2, ve kterém pravým tlačítkem myši klepnete na záložku Listu2 a z místní nabídky vyberete příkaz Odstranit. Opět potvrdíte, že chcete list odstranit, a poté nahrávání ukončíte.

Pomocí těchto nahraných maker nyní zkuste smazat další listy v tom samém sešitu. Pivní makro se bude chovat vzorně: po jeho spuštění se zobrazí výstražné okno, když v něm operaci potvrdíte, bude aktivní list ze sešitu odstraněn. Při spuštění makra Smazat2 se však objeví chybové hlášení:

r ^ Microsoft Visual Basic

Run-time error '9':

Subscript out oř range

End |í Debug ] Help

Když v tomto okně klepnete na tlačítko Debug, přenesete se do editoru Visual Basicu (trochu předčasně, představíme si ho až v další kapitole), kde uvidíte žlutě podbarvený řádek s příkazem:

S h e e t s ( " L i s t 2 " ) . S e l e c t

Není nutné tento příkaz podrobně rozebírat, podstatné je to, že je v něm jasně vidět řetězec „List2". Při nahrání druhého makra tedy záznamník nahrál i název listu, na který jste klepli pravým tlačítkem myši. Pokud však makro spustíte později, když je již tento list odstraněn, nemůže ho interpretr kódu najít a ohlásí chybu. Při nahrávání maker je tedy třeba dávat pozor i na to, jakým způsobem určité operace provádíte.

Editor Visual Basicu prozatím zavřete stiskem klávesové zkratky ALT+F4 (V okně s hlášením, které se poté objeví, stiskněte OK).

V další kapitole se na editor podíváme podrobněji a ukážeme si, jak v něm editovat nahraná makra.

Page 27: 00-vba1 - Kopie

2.3 Relativní a absolutní odkazy na buňky a jejích použití při nahrávání maker

Z pokusů vyplývá, že naše první nahrané makro vždy vybere oblast C3:D5. Má tedy v sobě nahrán absolutní odkaz na určitou oblast. V makrech je však ještě možný jiný způsob ad-resování, kterému se říká relativní a ve kterém je oblast buněk vymezena vůči levé horní buňce jiné (většinou aktuální) oblasti.

Pozor, nepleťte si to s absolutním a relativním adresováním ve vzor-cích! Terminologie je sice shodná, jde však o zcela jiné záležitosti!

Otevřete pokusný sešit RelativniOdkazy.xls, uložený ve složce Kap2. Na jeho prvním listu najdete tabulku (viz obrázek 2.7).

R e l a t i v n i O d k a z y . x l s

1 i 2 OdděleníA Odděleni'8 3 Norma Skutečnost 4 ieden 500 5 únor 500 6 březen 500 7 duben 500 8 květen 500 9 červen 500 10 11

< • • 1 Listí Ust2 Ust3 - J m n S i A . . . Z I Z Ä B M » Obr. 2.7: Podoba listu pro cvičné kopírování oblasti na jiné místo

Zkusíme vytvořit makro, které oblast B3:C9 zkopíruje do oblasti D3:E9. Postup při nahrávání bude jednoduchý. Vybereme oblast B3:C9, spustíme nahrávání, zkopírujeme označenou oblast do schránky, označíme buňku D3 a z nabídky Úpravy vybereme příkaz Vložit. Makro však tentokrát budeme nahrávat se zapnutými relativními odkazy.

Při nahrávání makra si vždy můžete určit, jestli budete používat absolutní nebo relativní odkazy. A nejen to, kdykoli během nahrávání můžete mezi těmito způsoby přepínat. Jak to udělat? Přepínač typu odkazů je přímo v panelu nástrojů Zastavit záznam (to je ten, který se objeví na obrazovce jen a právě při záznamu makra). Levé tlačítko Zastavit záznam již známe, vpravo je tlačítko Relativní odkaz. Funguje jako přepínač - je-li vypnuto, nahrává záznamník absolutní odkazy, po jeho zapnutí jsou odkazy nahrávány relativně.

Tip VExcelu 2007je toto tlačítko v rámečku Kód na kartě Vývojář.

v 1. Označte oblast buněk B3:C9.

2. Přes nabídku Nástroje —> Makro zobrazte dialogové okno Záznam makra.

Page 28: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

3. Zadejte název nového makra, např. KopieODVaSloupceDoprava. Makro umístěte do aktuálního (tohoto) sešitu. Klávesovou zkratku si přiřaďte dle chuti. Tlačítkem OK zavřete dialogové okno.

4. Spustí se záznamník maker, což se projeví zobrazením panelu nástrojů Zastavit zá-znam. Než začnete v sešitu cokoli dělat, klepněte myší na panelu nástrojů Zastavit záznam na tlačítko Relativní odkaz, a tak zapněte použití relativních odkazů.

5. Stiskněte klávesovou zkratku CTRL+C, nebo z nabídky Úpravy zadejte příkaz Kopí-rovat.

6. Označte buňku D3.

7. Stiskněte klávesovou zkratku CTRL+V, nebo z nabídky Úpravy zadejte příkaz Vložit.

8. Zkopírovaná oblast se vloží do listu. Ukončete záznam makra.

Hotové makro si nyní vyzkoušejte na jiné tabulce. Protože jsme výběr tabulky provedli ještě před spuštěním záznamníku, stačí jakoukoli tabulku vybrat a poté makro spustit. Vzhledem k tomu, že makro kopíruje výběr vždy o dva sloupce doprava, není možné ho použít pro zkopírování třeba třísloupcové tabulky - v tomto případě by byl poslední sloupec přepsán.

Zkuste si samostatně nahrát toto makro ještě jednou, ale tentokrát nechte tlačítko Relativní odkaz vypnuté. Jak se bude druhé makro lišit od toho prvního?

2 . Nahrávání maker

Page 29: 00-vba1 - Kopie

První setkání s editorem jazyka Vísual Basic

Po podrobném vykladu nahráváni maker se nyní podíváme, kde se dá takto získaný kód upravit. Od verze 97 je součástí Excelu také samostatné vývojové prostředí, označované jako „editor jazyka Visual Basic", s vcelku „luxusní" výbavou.

3.1 Jak nahraná makra upravit? Každé makro (ať už nahrané či napsané ručně) se ukládá do tzv. modulu. V prastaiých verzích Excel 5 a 95 byly tyto moduly uloženy v sešitu jako zvláštní typ listu (pojmenovaný jako modul jazyka Visual Basic) a bylo možné je upravovat přímo v sešitu. Od nástupu verze Excel 97 jsou makra nadále ukládána do modulů, které se však již nezobrazují přímo v okně Excelu, ale pouze v samostatném editoru jazyka Visual Basic.

Když se v Excelu 97 či novější verzi pokusíte otevřít sešit s moduly, uložený ve formátu Excel 5/95, můžete na zlomek sekundy zahléd-nout také listy s moduly, pak se ale objeví následující okno s hlášením, a listy modulů zmizí.

Page 30: 00-vba1 - Kopie

32 E X C E L 2 0 0 0 - 2 0 0 7 2 3

Microsoft Office Excel

Moduly maker v jazyce Visual Basic jsou nyní upravovány v editoru jazyka Visual Basic a nikoli v sešitu. Moduly můžete zobrazit klepnutím na příkaz Editor jazyka Visual Basic (nabídka Nástroje, příkaz Makro). V okně projektu je naleznete ve složce modulů. Moduly se i nadále ukládají do sešitu.

• [ P ř í š t ě již t e n t o diaiog n e z o b r a z o v a t . j

Obr. 3-1: Pň pokusu o otevření staršího formátu souboru s makry zobrazí Excel toto hlášení

3.2 Spuštění editoru jazyka Visual Basic Editor jazyka Visual Basic se spoušti příkazem Nástroje —> Makro —> Editor jazyka Visual Basic (v Excelu 2007 tlačítkem Visual Basic u levého okraje karty Vývojář), nebo stiskem klávesové kombinace A L T + F 1 1 (funguje i pro návrat z editoru VBA zpět do Excelu):

Nástroje | D a t a O k n o N á p o v ě d a

P r a v o p i s . . . P 7 " io » b i u m m m ^ ;< Z d r o j e informací. . . Alt+klepnutí

Kontrola c h y b . . . H 1 i J | K | 1

Sdílený pracovní p r o s t o r . . .

Sdílet s e š i t . , .

Sledování zrněn

P o r o v n a t a sloučit sešity. . .

Z á m e k

Spolupráce online •

1 Hledání řešení. . .

Správce scénářů. . .

Závislosti v z o r c ů •

Mgkro V Makra. . . A l t + F 8

D o p l ň k y . . . Q Z á z n a m n o v é h o makra. . .

i Možnosti automatických o p r a v . . . : Z a b e z p e č e n í . . .

; Vlastní.. . Editor j a z y k a Visual Basic A l t + F l l K

1 Možnosti . . . Microsoft Script Editor A l t + S h i f t + F U ^

Podmíněný součet. . .

Obr. 32: Přístup k Editoru jazyka Visual Basic z nabídky Excelu

^ j j l j i j V v - ä * > * < * ' 5 M i c r o s o f t Excel ?. , r , Domu Vložení Rozložení stránky Vzorce Data Revize Zobrazení Vývojář ;

/ ¿ « a S I Záznam makra

L__J g | j Použít relativní odkazy Visuajl Makra Basicl^ J aZabezpečen í maker

Kód

í A , ¿¿J Zobrazit kód : i Vložit Režim _

- návrhu 1 Spustit dialog Ovládací prvky

ÍS~*j * ' • " - 11 Import

Rozšiřující balíky • ; Export Zdroj . . < # | Aktualizovat data

XML

! Visual Basic (Alt+Fll)

Umožňuje spustit editor jazyka Visual Basic.

! Visual Basic (Alt+Fll)

Umožňuje spustit editor jazyka Visual Basic.

ti) Další nápovědu zobrazíte stisknutím klávesy F l

Obr. 33: Přístup k Editoru jazyka Visual Basic v Excelu 2007

Editor jazyka Visual Basic není možné spustit samostatně; Excel musí s ď s být spuštěn. <y

3. První setkání s editorem jazy

Page 31: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Pozor, neplefte si editor jazyka Visual Basic s editorem Microsoft Script. Jsou to dva odlišné programy. Microsoft Script Editor se používá pro vkládání a úpravu skriptů, psaných v jazycích VBScript nebo Ja-vaScript, které se nacházejí v sešitech ukládaných ve formátu HTML. Tato kniha se editorem Microsoft Script vůbec nezabývá.

Editor se dá také otevřít z dialogu Makra. Když v tomto okně označíte makro, které chcete změnit, stačí klepnout na tlačítko Upravit, a editor se otevře. V tomto druhém případě se navíc v okně editoru dané makro ihned zobrazí, zatímco jinak si ho musíte v editoru vyhledat (a to pro začátečníka není jednoduchá záležitost).

Makro mm 1 Nasev makra:

Spustit

PokusneFormatovani j Krokovat s vnořením j PokusneFormatovani PokusneFormatovani

| Upravit |

Vytvořit

PokusneFormatovani

Odstranit J

PokusneFormatovani PokusneFormatovani

Možnosti... J

Makra v: Všechny otevřené sešity

P o p i s 1 Makra v: Všechny otevřené sešity

P o p i s

[ Storno ]

Makra v: Všechny otevřené sešity

P o p i s

Obr. 3-4: Tlačítkem Upravit otevřeme označené makro v editoru jazyka Visual Basic

Pokud se ale tlačítkem Upravit pokusíte přistoupit k makru, které je uloženo v osobním sešitu maker (PERSONAL.XLS), objeví se chybové hlášení:

^ozorn^

Microsoft Excel

Osobní sešit maker je totiž skryty a z nějakého důvodu to Excelu v okně Makra vadí (přímo v editoru se přitom k těmto makrům dostanete bez problémů). Nejdříve je nutné příkazem Okno —> Zobrazit osobní sešit odkryt, a pak už tlačítko Upravit bude použitelné.

Máte-li otevřeno více sešitů najednou a makra nejsou uložena jen v jednom z nich, je lépe začínat editaci z okna Makro, kde si najdete název makra a klepn ete na tlačítko Upravit. V editoru jazyka Visual Basic totiž není možné vyhledávat název makra ve více sešitech na-jednou, takže musíte vědět, ve kterém sešitu makro je.

iWélmk^ tění editoru jazyka Visual Basic

Page 32: 00-vba1 - Kopie

3.3 Vzhled editoru jazyka Visual Basic Po spuštěni editoru se objeví jeho hlavni okno s několika ukotvenými panely uvnitř. Přesný vzhled bude záviset především na rozlišeni vašeho monitoru a také na tom, jestli v editoru přímo otvíráte konkrétní makro nebo ho spouštíte klávesovou zkratkou A L T + F 1 1 .

Obr. 3-5: Okno editoru jazyka Visual Basic

Na obrázku 3-5 byl editor spuštěn přímo pro úpravu konkrétního makra, takže v pravé polovině s otevřeným modulem vidíte přímo kód vybraného makra.

o^Sr Editor jazyka Visual Basic byl počeštěn jen v Excelu 97; v novějších verzích Excelu zůstal v anglickém provedení (včetně nápovědy k pro-gramovacímu jazyku).

Otevřený modul kódu má nahoře dva rozevírací seznamy, které si prozatím popisovat nebudeme, stejně tak jako účel šedého pruhu po levé straně jeho okna. K vlastnímu kódu maker se dostaneme za chvíli, ted jen dokončím stručný popis okna editoru.

V levé polovině okna editoru jsou dva ukotvené panely. První se jmenuje Project, uvnitř něj vidíte seznam všech otevřených sešitů (včetně doplňků a skrytých sešitů). Po klepnutí na značku 0 vlevo od názvu některého sešitu se rozevře seznam všech jeho modulů (a dalších objektů, které si představíme později). Modul otevřete poklepáním myši na jeho názvu.

Page 33: 00-vba1 - Kopie

Project - VBAProject

mj i a

" T i§r VBAProject (nahravani.nls) ? Ér Microsoft Excel Objects

i O list i (Listí) B j List2 (List2) Šgj LístS (List3) ' Q ThisWorkbook

j B Ô Modules Module 1

éM VBAProject (PERSONAL.XLSB)

û Microsoft Excel Objects ÉS- & Modules

^ B S E S B l

Obr. 3.6: Okno Projekt s vybraným modulem

Druhý panel v levé části editoru se jmenuje Properties (okno vlastností) a uplatní se především při práci s formuláři. Je-li aktivní některý z modulů, najdete tu jen jedinou vlast-nost Name, čili název modulu, který se zobrazuje v panelu Project. V panelu Properties můžete název přepsat, a tak modulu přiřadit jiný název, který lépe vyjadřuje jeho obsah (např. modFunkce, modDatabaze, modFormatTabulek).

Project 1 VBAProject i n V Project - VBAProject mm i J J . J Ç 1 1 L J

® Lisfc3 (ListS) A i i O List3 (List3) 0 ThisWorkbook S ThisWorkbook

: E & Modules : E 63 Modules 41 Module 1 Module!

.4 VBAProject (PERSONAL.XLSB) E ^ VBAProject (PERSONAL.XLSB) © (23 Microsoft Excel Objects SI- Cu Microsoft Excel Objects E Modules E f 3 Modules

Module I V 4 1 modFunkce yji

Properties - Module 1 Mx| Properties - modFunkce • j Module 1 Module ~ 3 modFunkce Module

Alphabetic | categorized j Alphabetic [ Categorised )

TSPII^g gggiifisi p I l l l i M J l i T O

Obr. 3-7: Změna názvu modulu v panelu Properties se projeví i v panelu Project

Panely Project i Properties se dají zobrazit či skrýt pomocí pří-slušných pňkazů v nabídce View (namísto Project je tu plný název Project Explorer), pňpadně klávesovými zkratkami CTRL+R a F4.

Na rozdíl od panelů Project a Properties nejsou moduly ukotveny, a lze je proto zvětšovat či zmenšovat klasickým tlačítky v jejich pravém horním rohu. Jestliže modul maximalizujete, vyplní celou pravou plochu.

óo&náfm-..

editoru jazyka Visual Basic

Page 34: 00-vba1 - Kopie

EXCEL 2000-2007

oxnám^ Ukotvené panely se dají poklepáním myši na jejich titulkovém (mod-rém) pruhu převést na panely „plovoucí", které můžete umístit na libovolné místo. Dalším poklepáním myši na titulkovém pruhu panel opět ukotvíte.

Poklepáním myši lze v panelu Project postupně otevřít více modulů najednou, jejich okna pak v pravé části editoru můžete uspořádat podobným způsobem jako více otevřených sešitů v rámci Excelu (v nabídce Window jsou příkazy Tile Horizontally, Tile Vertically a Cascade, které odpovídají příkazu Okno —» Uspořádat a jeho volbám Vodorovně, Svisle, Na sebe).

Nabídku a panel nástrojů není třeba podrobně představovat, protože každý ví, že tyto pivky najdeme téměř v každé aplikaci. Implicitní panel nástrojů Standard je umístěn přímo pod nabídkou. Celkem máte v editoru k dispozici čtyři panely nástrojů (další se jmenují Debug, Edit, UserForm a zobrazíte je klasickým způsobem přes nabídku View —> Toolbars).

V panelu nabídky je celkem 11 nabídek, které stačí popsat jen velmi stručně (podrobněji budeme některé z nich probírat později):

S File (Soubor) - obsahuje mj. příkaz Save pro uložení sešitu (CTRL+S), Print pro tisk aktuálního modulu nebo všech modulů v projektu (CTRL+P), Close and Return... pro uzavření editoru a návrat do prostředí Excelu (ALT+Q) .

V Edit (Úpravy) - tady jsou důležité editační příkazy, mj. Find pro hledání v textu (CTRL+F), Replace pro záměnu textu (CTRL+H), Select All pro výběr celého obsa-hu modulu (CTRL+A). Dále zde jsou příkazy pro práci se schránkou, které znáte, a skupina pomocných příkazů (List Properties/Methods až Complete Words) pro snazší editaci, které si vysvětlíme později.

V View (Zobrazit) - obsahuje příkazy pro zobrazení či skrytí jednotlivých částí edi-toru a dalších pomocných nástrojů.

Insert (Vložit) - zde najdete příkazy pro vkládání nových modulů a formulářů. Podrobně-ji bude probrána v jedné z následujících sekcí kapitoly.

V Formát - nabídka s příkazy pro formátování ovládacích prvků na formulářích. Po-drobněji bude probrána v kapitole věnované formulářům.

Debug (Ladění) - obsahuje příkazy pro ladění maker. O této nabídce si řekneme více v kapitole věnované ladění a odstraňování chyb.

S Run (Spustit) - zde najdete příkazy pro spuštění, ukončení a přerušení maker.

V Tools (Nástroje) - obsahuje mj. příkaz Options pro přístup k oknu s předvolbami editoru, příkaz Macros pro zobrazení seznamu maker v aktuálním projektu (sešitu).

Add-Ins (Doplňky) - tady je příkaz pro spuštění správce doplňků editoru a na-instalovaných doplňků.

V Window (Okno) - obsahuje seznam otevřených modulů a příkazy pro jejich uspo-řádání.

S Help - nabídka nápovědy.

Page 35: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Kde všude může být kód V B A ? Ze souhrnného obrázku se zdá, že při hledáni nahraných maker se nemůžete splést - stačí v panelu Project najit příslušný sešit, rozbalit jeho složku Modules a myší v ní poklepat na tom modulu, jehož obsah chcete otevřít.

— — p To je pravda a nám tento fakt bude ještě hodně dlouho stačit, rád bych však už teď upo-zornil na to, že kód VBA se může kromě standardních modulů vyskytovat i jinde:

V V modulech kódu pro jednotlivé listy - zde jsou uloženy speciální procedury, vázané na konkrétní list, jež jsou spouštěny při výskytu nějaké události.

V V modulu kódu ThisWorkbook - zde jsou uloženy speciální procedury, spouš-těné automaticky například při otevření sešitu, před jeho vytištěním nebo před uzavřením.

V V modulech tříd - moduly pro vytváření vlastních tříd objektů.

V Ve formulářích - moduly vázané na vlastní dialogová okna (tzv. formuláře).

jProject - VBAProject g3| jgjgy a

T i g " V B A P r o j e c f c ( P E R S O N A L X L S 8 ) • HE VBAProject (Sešiti)

Ei M i c r o s o f t E x c e l O b j e c t s É j Û Lisfcl ( L i s t í ) f ß L í s t ž ( L i s t 2 ) I g L i s t 3 ( L i s t 3 ) !

Q u i a J

- Forms I D U s e r F o r m l

B & M o d u l e s é í Module 1

B & C l a s s M o d u l e s ^ C l a s s 1

moduly jednotlivých Iistu a modul This Workbook

formulář

standardní modul

rnodul třídy

Obr. 3-8: Jednotlivé typy modulů v panelu Project

Nahraná makra jsou vždy ukládána do standardních modulů. * r V

V panelu Project ani nikde jinde v editoru jazyka Visual Basic nenajdete příkaz pro uzavření sešitu nebo přidání nového sešitu do panelu Project. Sešity se vytvářejí, otevírají a zavírají bud v Excelu, nebo programovým kódem. V uživatelském rozhraní editoru jazyka Visual Basic je možné sešity jen uložit.

Stejně tak v editoru nenajdete žádný příkaz pro vložení nového pracovního listu do sešitu. Tato akce se provádí bud ručně v uživatelském prostředí Excelu (Vložit —» List, v Excelu 2007 tlačítko Vložit v rámečku Buňky na kartě Domů) nebo programovým kódem.

dítoru jazyka Visual Basic

Page 36: 00-vba1 - Kopie

38 E X C E L 2 0 0 0 - 2 0 0 7 2 3

Moduly kódu však v editoru přidávat můžete, a to z nabídky Insert. Jak vidíte na obrázku, jsou v ní čtyři možnosti:

Procedure - vloží novou proceduru (makro) do modulu. Příkaz je dostupný jen tehdy, je-li aktivní nějaký modul s kódem.

V Module - přidá prázdný modul kódu.

V UserForm - vloží UserForm (formulář). V této knize není problematika formulářů probírána.

Class Module - přidá modul třídy. Ani s nimi se v této knize nepotkáte.

Insert F o r m a t D e b u g

P r o c e d u r e . . .

i & l U s e r F o r m

Module Class M o d u l e

f i l e . , ,

Modul otevřete poklepáním myši na jeho názvu ve složce Modules. Pokud chcete modul zkopírovat do jiného sešitu, stačí podržet stisknutou klávesu CTRL a myší modul přetáhnout do jiného sešitu (který musí být otevřen, aby byl v panelu Project vidět).

Možnost vložit více modulů do jednoho sešitu se dá využít např. k logic-kému roztňděníprocedur a funkcí podle určitých kritérií. Záznamník maker také vytváří nové moduly.

K vyhledání určitého makra se dá použít dialogové okno Edit -+Find, jehož jediným omezením je fakt, že umí text vyhledávat jen v rámci jednoho sešitu (projektu).

3.4 Režimy práce v editoru Vísual Basicu Jestliže makra vytváříte, testujete nebo spouštíte, nacházíte se vždy v jednom ze tří mož-ných režimů práce:

y Režim návrhu (design) - v něm píšete vlastní kód, přidáváte a měníte moduly či formuláře.

V Režim běhu (run) - procedura je spuštěna.

V Režim přerušení (break) - v tomto režimu můžete opravovat chyby, sledovat hodnoty proměnných, vlastností apod. Pokud za běhu makra dojde k chybě, můžete do režimu přerušení přejít bud sami, nebo automaticky.

Režimy návrhu a běhu jsou jistě jasné. O třetím režiími si budeme podrobně povídat v ka-pitole věnované chybám a ladění.

3. První setkání s editorem

Page 37: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

3.5 Rozbor nahraných maker Máme tedy spuštěný editor, v okně kódu (pravá polovina hlavního okna) vidíme naše nahraná makra a konečně tedy můžeme prozkoumat, čím se navzájem liší a jak vlastně takový programový kód vypadá.

Každý z vás na pivní pohled vidí dvě základní skutečnosti:

Text maker má různé barvy - to je velmi užitečná pomůcka každého slušného programovacího editoru, který vám tak usnadňuje orientaci a rychle umožní najít např. chybné názvy příkazů. Jinou barvou se zobrazují i komentáře.

Téměř vše je anglicky - na češtinu narazíte jen ve vlastních názvech maker (jsou na řádku začínajícím slovem Sub), pokud je budete vymýšlet v češtině. S tím se nic dělat nedá, a ti z vás, kteří moc nebo vůbec anglicky neumí, by si měli pospíšit a polepšit se. Ne proto, že jinak byste tuto knihu nemohli používat - všechny pojmy si vysvětlíme - ale kvůli vyšší efektivitě práce. Budete-li muset vždy přemýšlet, jak se určitá vlastnost nebo metoda jmenuje, abyste ji mohli použít, budete s prací hotovi mnohem později.

' . I M i c r o s o f t V i s u a l Basic - n a h r a v a n U l s - [ M o d u t e l ( C o d e ) ] Q @ ® 1

I File Edit View Insert Format Debug Run Tools Add-Iru Window Help Nápevěda adejř csorar • _ ¡9 x > ï) J %< J* , # In 34, Col 8 -

1 (General) jrj joruftyjpokus j ÍĚ —j Sub PokusneFormatovani (5 ~ VBAProjeet (nahravani.xls)

B €S Microsoft Excel Objects 1 f-okxisl flak ro ÍO Listí (Listí) List2(Ust2) ® List3 (List3) 15 ThisWorkbook Range (*'A2:B5") .Select - Q Modules With Selection.Font Modutel .Name » "Calibri" í+i VBAProject (PERSDNAL.XtSB) .FontStyle » "Tu&ne" í+j igi VBAProject (Sešiti) .Size = 11 .Strikethrough = False .Superscript - False .Subscript « False .OutlineFont • False .Shadow = False •Underline « xlUnderlineStyleNone .Color = 528793 6 .TintAndShade = 0 . TherneFont = xlThemeFontHinor End With End Sub Sub Druhy_pokus()

1 Po)cus2 Hakro »! 3 ®iJ_J J T

Obr. 3-9: Modul kódu otevřený v editoru

Jako první jsme nahráli makro PokusneFormatovani, v němž jsme pro nastavení atributů písma použili dialogové okno. Protože již víte, že v takovém případě se do makra nahrávají všechny hodnoty z daného dialogového okna (nebo z jeho vybrané karty), nepřekvapí vás, že toto makro je o hodně delší než druhé, při jehož nahrávání jsme myší klepali na ikony ve formátovacím panelu nástrojů.

Celý kód makra je uveden v prvním výpisu, z pochopitelných důvodů v knize chybí ba-revné rozlišení jednotlivých částí.

Makro bylo nahráváno v Excelu 2007. Ve starších verzích může kód vypadat trochu jinak, vzhledem ke změnám ve vlastnostech písma.

Sub PokusneFormatovani ()

PokusneFormatovani Makro

3.5 Rozbor nahraných maker

Page 38: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Range("A2:B5") .Selec t With S e l e c t i o n . F o n t

.Name = " C a l i b r i "

.Fon tS ty l e = "Tučné"

. Size = 11

. S t r i k e t h r o u g h = Fa l še

. S u p e r s c r i p t = Fa l še

. S u b s c r i p t = Fa l še

.Out l ineFont = Fa l še

.Shadow = Fa l še

.Under l ine = xlUnder l ineStyleNone

.Color = 5287936

.TintAndShade = 0

.ThemeFont = xlThemeFontMinor End With

End Sub

Hlavička m a k r a

S rozborem makra začneme od jeho hlavičky. Tu tvoři dva řádky, které jsoLi v makru vždy první a poslední:

Sub PokusneFormatovani() End Sub

V pivním řádku hlavičky se nachází jednak název makra (pravidla pro pojmenování maker jsme si uvedli v minulé kapitole), jednak klíčové slovo Sub, oznaČLijící typ proceduiy (typy budeme probírat později).

U nahraných maker má první řádek hlavičky vždy tento tvar. Ručně vytvářené podprogramy však mohou v obou řádcích místo slova Sub obsahovat slovo Function, případně se v prvním řádku mohou objevit další klíčová slova. Ta si ukážeme později.

Název makra je vždy doplněn závorkami. Do nich se zapisLijí tzv. formální parametry, což je zase tématika dalších kapitol.

Komentáře

Pivní řádky makra jsou psány zeleně. Tato barva je implicitní barvou komentářů - neboli té části makra, která slouží jako nápověda a vysvětlivky. Komentáře se při vykonávání makra ignorují.

Komentář, který již v makru máme, byl vložen automaticky záznamníkem. Obsahuje název makra, dále poznámky k makru, jež zadáváte už v dialogovém okně pro nové makro, da-tum a základní údaje o uživateli, který ho nahrál. (V Excelu 2007 je do komentáře zapsán jen název makra.)

Page 39: 00-vba1 - Kopie

41 Záznam makra 0 ®

| Název makra: Pokus 1

Klávesová zkratka: Ctrí-f

Uiožít makro do:

j Osobní sešit maker 3 ! Popis:

Makro zaznamenané 1?. 7. 200?

I 0 K 1 [ Storno 1 mmmmm

Obr. 3.10: Údaje z textového pole Popis jsou přidány do makra jako komentář

Komentáře můžete do maker přidávat sami, a to bud na celý řádek - jako to udělal zá-znamník - nebo na konec řádku za příkaz jazyka VBA. Začátek komentáře je vždy vyzna-čen znakem apostrofu (který se dá psát různým způsobem, na české klávesnici většinou funguje zkratka SHIFT+ZPĚTNÉ LOMÍTKO, nebo stisknete levý ALT a na numerické klávesnici napíšete číslo 39). Pokud komentář zapisujete za příkaz na konec řádku, musí být před apostrofem mezera!

Praktickou ukázku doplněného komentáře vidíte v dalším výpisu, který představuje začátek našeho nahraného makra:

Sub PokusneFormatovani ()

' PokusneFormatovani Makro

Range("A2:B5").Select 1 výběr buněk With Se lec t ion .Fon t ' změna v l a s t n o s t i pisma

.Name = "Aria l CE"

.FontStyle = "tučné" ' změna řezu pisma . . . zde makro pokračuje dále

Komentáře byste měli používat co nejvíce, a to z těchto důvodů:

V Jestliže se budete k nahranému (či napsanému) makru později vracet, např. když bude třeba doplnit do něj nějaké další příkazy, usnadní vám podrobné komentáře orientaci v kódu.

S Nikdy nemůžete dopředu vědět, kdo všechno s vaším makrem bude pracovat. Pokud se do kódu podívá někdo jiný, musí mít nějaké vodítko, podle něhož zjistí, o co vlastně v makru jde.

Co vše se má komentovat, na tomto místě vysvětlovat nebudu, protože drtivou většinu pojmů zatím neznáte. Ale nikdy s komentáři nešetřete.

Komentáře se dají rovněž výborně využít pro dočasné vyřazení části kódu. Když nějaký výkonný řádek (řádek s příkazem) označíte jako komentář, nebude dále prováděn. Hodí se to např. při postupném psaní složitějších maker nebo při testování.

5 Rozbor nahraných maker

Page 40: 00-vba1 - Kopie

Pro převod jednoho či více řádků na komentář a zpět jsou na pane-lu nástrojů Edit k dispozici tlačítka (jmenují se Comment Block a Uncomment block).

Vlastní kód makra PokusneFormatovani V této části nezískáte informace o všech příkazech, které jsou v tomto makru použity, ale zato si vysvětlíme prakticky všechny problémy, na něž jsme již narazili, hlavně výhody a nevýhody nahraných maker a nutnost jejich úpravy především kvůli odstranění nežádoucích nastavení hodnot v dialogových oknech.

Pivní výkonný řádek makra vypadá takto:

Range("A2:B5").Select

Co jsme si říkali v minulé kapitole? Že záznamník maker při nahrávání vždy vybírá ty objekty, s kterými pracujete. Sloveso vybrat se anglicky řekne se l ec t , takže je zřejmé, že v tomto případě dochází k výběru... čeho? Je tu další anglické slovo Range, které má v závorkách odkaz na oblast buněk (to znáte ze vzorců). Slovo Range tedy odkazuje na určitou oblast. Až si budeme povídat o objektech, budete vědět, že oblast buněk je možné vyjádřit objektem Range.

Význam prvního výkonného řádku je tedy jasný - vybere do bloku oblast buněk A 2 : B 5 .

Protože tu není nikde určeno, na jakém listu se buňky mají nacházet, je výběr proveden na právě aktivním listu.

V dalším řádku je slovo Select ion, jehož význam asi správně odhadnete jako odkaz na vybrané buňky. Selec t tedy něco vybere, a pomocí slova Selec t ion se na tento vybra-ný objekt (buňky, graf) dále v kódu odkazujete. Dále je tu slovo Font, vyjadřující druh písma (font Arial, font Courier New...). Výraz Se lec t ion .Fon t si tedy můžeme přeložit jako „písmo ve vybrané oblasti". Naše makro skutečně mění vlastnosti písma ve vybrané oblasti...

Na dalších řádcích máme blok příkazů, ohraničený řádky With. . .End With. Tento pří-kaz používá záznamník pro zkrácení zápisu. Při záznamu makra jsme na kartě Písmo v dialogovém okně Formát buňky změnili některé vlastnosti písma. Prakticky jsme si také ukázali, že záznamník do makra zapíše všechny vlastnosti písma, které se na této kartě nacházejí - nejen ty změněné.

Aby se na každém řádku nemusel opakovat výraz Se lec t ion . Font, má VB A k dispozici příkaz With. . . End With, který umožňuje tento výraz uvést jen jednou. Kdyby záznamník uvedený příkaz nepoužil, vypadalo by makro takto:

Sub Pokus() Range ("A2 : B5 ") . Se lec t Selection.Font.Name = "Ca l ib r i " Se l ec t ion .Fon t .Fon tS ty l e = "Tučné" Se l ec t i on .Fon t .S i ze = 11 Se l ec t i on .Fon t .S t r i ke th rough = False

Tip Všimněte si, že na začátku každého příkazu uvnitř struktury With. .. End With je tečka.

Page 41: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

S e l e c t i o n . F o n t . S u p e r s c r i p t = False S e l e c t i o n . F o n t . S u b s c r i p t = False Se lec t ion .Fon t .Out l ineFon t = False Select ion.Font .Shadow = False Se lec t ion .Fon t .Under l ine = xlUnderlineStyleNone Se lec t ion .Fon t .Co lo r = 5287936 Select ion.Font .TintAndShade = 0 Selection.Font.ThemeFont = xlThemeFontMinor

Makro by sice pracovalo úplně stejně, ale sami uznáte, že už jen kvůli snazší orientaci je ta podoba s příkazem With. . .End With lepši.

Ve všech řádcích uvnitř příkazu With. . . End With se mění vlastnosti písma. Už od pohledu je jasné, že Name je jméno fontu a Si ze je velikost.

Podívejme se ted na chvíli do druhého makra. Tam jsou jen čtyři řádky:

Se lec t ion .Fon t .Bo ld = True With Se lec t ion .Fon t

.Color - -11480942

.TintAndShade = 0 End With

Chybí tu řádek s výběrem oblasti buněk. Díky tomu výraz Se lec t ion odkazuje vždy na aktuální výběr, který existuje v okamžiku spuštěni makra (a tím může být i jediná buňka). Schází tu výběr přesně určené oblasti.

Postačí" tedy upravit první makro tak, aby nastavovalo jen vlastnosti Bold, Color a TintAnd-Shade. Jediný rozdíl, který mezi nimi potom bude, je uveden v předchozím odstavci.

Ale co to? Když se podíváte do prvního makra, abyste v něm našli vlastnost Bold, zjistíte, že tu žádná taková vlastnost není. Namísto ní je tu totiž vlastnost Font Style. Vzpomeňte si, že v dialogovém okně Formát buňky jsou v seznamu Řez písma možnosti ovlivňLijící jak nastavení tučného písma, tak kurzivy. Na panelu nástrojů tlačítkem pro tučné písmo však určujete jen tučné nebo netLičné písmo.

Možná řešení jsou tedy dvě, bud vlastnost FontStyle nahradit vlastností Bold, nebo ji pone-chat tak, jak je, což si předvedeme i my. Po vymazání přebytečných řádků bude pivní nahrané makro vypadat takto:

Sub PokusneFormatovani() ! ' Pokus Makro

Range("A2:B5").Select With Se lec t ion .Fon t

.FontStyle = "tučné"

.Colorlndex = 3 End With

End Sub

End Sub

V Excelu se potkáte s velkým množstvím vlastností, které se někdy vzájemně překrývají, případně změna jedné vlastnosti vyvolá změnu i jiných vlastností.

Page 42: 00-vba1 - Kopie

Takto upravené makro při opakovaném spuštěni vybere oblast buněk A2:B5 na aktivním listu a změní pouze barvu a řez (tučnost) písma.

Krátce k barvám kódu Již víte, že komentáře jsou vyznačeny zeleně, ale ve zbytku kódu se občas objevují slova psaná modře. Modrá je standardní barvou pro tzv. klíčová slova programovacího jazyka, která nesmíte použít pro názvy jiných částí kódu. Proč jsou modře označeny jen určité části kódu, vysvětlovat nebudu, berte to jako fakt. Případný pokus o zakázané použití některého klíčového slova vám editor oznámí.

S dalšími barvami (červená, žlutá) se potkáte později.

otitnánur^ Barvy různých částí kódu si můžete upravit v dialogovém okně

Jednou ze součástí editoru VBA je i okno Immediate („okamžité" - název je odvozen z toho, že v něm okamžitě vidíte např. vrácenou hodnotu). Toto okno se vám bude hodit během následujících kapitol k testování všeho, co se budete učit.

Chcete-li totiž testovat chování jednotlivých příkazů, funkcí či procedur, máte dvě možnosti. Bud příkaz či funkci umístíte do nějakého makra (procedury) a tu pak spustíte... nebo to uděláte přímo v okně Immediate. Druhá možnost je ve většině případů výhodnější. Až budete psát vlastní funkce (nebo procedury s parametry), mohli byste je rovněž testovat dvěma způsoby: bud napsat jinou proceduru, ve které byste funkci volali, nebo funkci testovat přímo v okně Immediate. Tady už o výhodách okna Immediate není možné pochybovat.

Nyní si stručně ukážeme, jak se s tímto oknem pracuje. Nejprve ho musíme otevřít, a to pří-kazem View —> Immediate. Okno je standardně ukotveno k dolnímu okraji okna editoru (viz obrázek 3-11).

Protože zatím neumíte psát vlastní procedury ani funkce, předvedeme si spuštění těch, které jsou vestavěnou součástí programovacího jazyka VBA. Vestavěné příkazy spustíte tak, že zapíšete jejich název a stisknete ENTER. Zkuste např. zapsat Beep a stisknout ENTER.

Jestliže máte v počítači zapojený speaker, ozve se poté pípnutí (tento příkaz nic jiného nedělá, jen pípne). Nebo napište následující příkaz:

mkdir "c : \d i r0001"

a poté stiskněte ENTER. Tento příkaz vytvoří na disku C: novou složku s názvem dirOOOl. (Odstraníte ji příkazem rmdir "c:\dir0001".)

Tools Options na kartě Editor Formát. Podrobnosti o jednotli-vých nastaveních editoru najdete v páté kapitole.

3.6 Okno Immediate

Procedura provede nějakou činnost, funkce kromě toho navíc ještě vrátí hodnotu.

Page 43: 00-vba1 - Kopie

Microsoft V i s u a l Basic - P E R S O N A L . X L S 6 - [ m o d F u n k c e ( C o d e ) ]

File Edit View Insert Format Debug

msĚ-Q * & a o » « Run Tools Add-tns J & $ 'rj

Window < #

Nápověda-• jadeite dota: • . 5 X

VBAProject (PER50NAL.XL5B) H C3 Microsoft Excel Objects

Ô Modules

£ VBAProject {SešitI) -: t 3 Microsoft Excel Objects

® Listl (Ustl) fflj List2 (Ust2) 1 5 list3 (Ust3) •<jjT¡ ThisWorkbook

modFunkce Module

Alphabetic J Categorized}

[(General) jPokusneFormatowani " 3 S\ih P o k u a n e F o r m a t o v a n i { )

' P o k u s n é Foe rnac o v a » i í lakco

R a n g e ( " A 2 : B 5 " ) . S e l e c t ütich S e l e c c i ó n . F o n c

.Naroe » " C o u t i e c New"

. F o n t S t y l e = "Tucné"

. S ü ; 11 .Strikechrough » F a l 3 e

Obr. 3-11: Editor VBA s otevřeným oknem Immediate

Kromě vestavěných příkazů VBA je možné v okně Immediate testovat i celé vlastni pro-cedury. Vyberte na některém z listů oblast buněk (obsahující nějaké hodnoty), přepněte se do editoru VBA, do okna Immediate zapište Druhy_pokus a stiskněte ENTER. Nahrané makro se spustí a zformátuje vybrané buňky.

Vestavěné příkazy ani vlastní procedury obvykle do okna Immediate nic nevypisují. Funkce spuštěná v tomto okně však na následující řádek vypíše vrácenou hodnotu - tím se funkce liší od procedury: kromě toho, že odvede nějakou práci, vrátí hodnotu. Pozor, u funkcí nelze zapsat jen jejich název, musíte použít příkaz p r i n t nebo jeho zkrácenou podobu ? (otazník). Na následujícím obrázku vidíte, jak funkcí Time vypíšete do okna Immediate aktuální čas. Zapište ? time ( ) a stiskněte ENTER (VBA nerozlišuje malá a velká písmena, proto na začátku může být i malé ,,ť).

Immediate HHHHHHs ? tizne 0 *

? î 1 4 : 2 9

ill Při testování kódu můžete kdykoli z vlastních procedur či funkcí směrovat výstup do okna Immediate pomocí metody Debug. Pr in t , kterou si ukážeme později.

3 . 6 Okno Immediate

Page 44: 00-vba1 - Kopie
Page 45: 00-vba1 - Kopie

Úvod do V B A a objektového / # programovaní

Přišel čas přestat si hrát a podívat se blíže na vlastní programovací jazyk. Makra již nahrávat umíte, podívejme se tedy na VBA trochu hlouběji.

4.1 Principy programování v Excelu Následující body představují stručný přehled základů programování v Excelu:

V Veškerý kód jazyka VBA je uložen v modulech. Moduly jsou fyzicky uloženy v sešitech (nikdy samostatně) a lze je spouštět jen z nich.

S V modulu jsou uloženy jednotlivé procedury a funkce, které jsou nejmenší mož-nou spustitelnou jednotkou, obsahující programový kód. Dále zde může být úvodní část s deklaracemi proměnných a polí. Pojmy deklarace, procedura a funkce jsou vysvětleny dále.

V Procedury a funkce obsahují příkazy, které jsou interpretrem kódu prováděny, a to směrem od začátku do konce proceduiy či funkce. Tok provádění příkazů

Principy programování v Excelu

Page 46: 00-vba1 - Kopie

je možné změnit pomoci tzv. řídicích struktur. Každý příkaz je obvykle psán na samostatný řádek.

V Jako příkaz lze uvnitř proceduiy nebo funkce volat vestavěný příkaz nebo funkci VB A, jehož význam je definován přímo v jazyku, ale také vlastní procedury či funkce, které programátor napíše, a které mohou plnit nejrůznější úlohy.

-Z Funkce na rozdíl od procedury vrací určitou hodnotu, kterou můžete dále použit.

S Proceduru či funkci můžete volat z jiné procedury či funkce jazyka VBA, funkci však navíc lze použit i ve vzorci na pracovním listu.

-Z Pomoci jazyka VBA pracujete především s objekty, které aplikace obsahuje a které vyjadřují její určitou část (v našem případě s objekty Excelu). Excel obsahuje více než 100 tříd objektů, reprezentujících ve VBA například sešit, pracovní list, oblast buněk, graf nebo nakreslený tvar.

S Jednotlivé třídy objektů dodržují určitou hierarchii, která je vyjádřena objektovým modelem.

-Z Objekty mohou vystupovat i jako kontejnery obsahující jiné objekty. Kupříkla-du samotný Excel je vyjádřen objektem s názvem Appl icat ion a obsahuje další objekty (např. Workbook a CommandBar). Objekt Workbook rovněž obsahuje další objekty (Worksheet a Chart).

S Některé objekty jsou obsaženy v kolekcích. Pojem kolekce označuje skupinu objektů stejného typu. Např. kolekce CommandBars je tvořena všemi objekty třídy CommandBar. Samotné kolekce jsou v rámci objektového modelu chápány také jako objekty.

Mnoho nových a neznámých pojmů, že? Všechno si postupně vysvětlíme. Příkazy, pro-cedury, funkce, řídicí struktury a další pojmy (operátory, výrazy apod.) přijdou na řadu postupně, nejdříve se zaměříme na to, co bude tvořit velkou část vašeho kódu - práce s objekty.

4.2 Objekty v jazyku V B A Nejdříve trochu učeně: z vnějšího pohledu objekty nejvíce připomínají klasickou „černou skříňku", což je pojem známý z kybernetiky. Jako černé skříňky označujeme ty věci nebo struktury, o jejichž vnitřku nevíme nic, ale když na takový objekt budeme určitým způ-sobem působit, dočkáme se určité reakce. Pivní charakteristikou objektu je tedy fakt, že jde o uzavřenou strukturu.

Tyto uzavřené jednotky mají svůj vnitřní obsah a svou funkčnost. S obsahem objektu se pracuje pomocí jednotlivých funkcí, které jsou v něm uloženy. Protože však úplně uzavřená černá skříňka není vůbec přístupná, nedala by se prakticky k ničemu použít (mohli byste ji maximálně obejít nebo s ní zahrkat), umí objekty také komunikovat se svým okolím, tedy přijímat nějaké zprávy a reagovat na ně. Asi nejlépe si to přiblížíme pomocí analogií.

Pracka jako typický příklad objektu

Téměř každý má doma pračku. Pračka navenek vypadá také jako uzavřená krabice, o jejím přesném obsahu mají ponětí jen pracovníci servisních středisek a výrobce. Pro vás jako uživatele je podstatné jen to, že pračka funguje. Z jejího vnitřku vás normálně zajímá jen buben, do něhož se dává prádlo.

Page 47: 00-vba1 - Kopie

Pračka má na sobě několik ovládacích prvků, kterými řídíte její činnost. Některé prvky přímo nic nespouští, pouze mění určité parametry vlastního praní (teplota vody, počet otáček při ždímání, velikost dávky, typ pracího režimu). Určitě však na pračce bude tla-čítko, kteiým jí spustíte.

Pračka tedy vůči okolí vystupuje jako kompaktní celek, se kterým komunikujeme pomocí ovládacích tlačítek a koleček. Naše manipulace má vliv jednak na charakteristiky objek-tu, které mění jeho chování (teplota vody, počet otáček při ždímání...), jednak můžeme spouštět výkonné příkazy (zapnout, vypnout).

V objektové terminologii se používají termíny vlastnosti a metody. Metoda je nějaká činnost, kterou objekt provede, zatímco vlastnosti popisují vzhled nebo stav objektu. Stisk tlačítka spouštějícího pračku je tedy ekvivalentní volání metody v kódu, zatímco přidání deseti triček do bubnu pračky je obdobou změny vlastnosti objektu (hmotnosti prádla v pračce).

Komunikace mezi pračkou a okolím se provádí pomocí tlačítek. Pračka na stisk tlačítka vždy určitým způsobem reaguje, i když se tato reakce často nijak neprojeví (když otočíte regulátorem teploty, nic neuvidíte ani neuslyšíte). Samotná výměna obsahu bubnu nemá na pračku žádný praktický vliv - spustit ji můžete i prázdnou.

Třídy objektu

Odskočíme si od pračky někam jinam. Zkuste se zamyslet nad slovem „strom". Viděli jste jich nepochybně spoustu, viděli jste však někdy něco, co by bylo stromem a již ničím jiným? Tedy - může existovat strom, který by zároveň nebyl třeba jabloní nebo modřínem?

Nemůže. Pojem „strom" představuje v jazyku zobecňující (klasifikační) termín. Spousta druhů dřevin patří mezi stromy, ale strom sám o sobě je jen abstraktní pojem.

Jabloň je také abstraktní pojem. Nikdy nenarazíte na dvě zcela stejné jabloně, různý může být počet větví, jejich rozmístění, stáří stromu..., každá jabloň je tedy jedinečná. Pojem „jabloň" je opět obecný.

U objektů se tato abstraktní klasifikace provádí pomocí tříd. V Excelu je více než 100 tříd objektů, např. třída sešitu (Workbook) nebo grafu (Chart). Každá třída se něčím od ostat-ních odlišuje, stejně jako „jabloňovitost" (kvalita) stromu se zásadně liší od „modřinovosti". Každá třída má svou vlastní sadu vlastností a metod, kterou můžete použít.

V praxi však v programovém kódu obvykle nepracujeme s třídou, ale s instancí. Třída sama je abstraktní, konkrétním objektům dané třídy v paměti počítače se správně říká instance. Instance mají všechny vlastnosti i metody, které má jejich třída.

V běžné řeči se však spis používá pojem objekt namísto instance, a proto ho dále budu používat i já.

Kolekce a jejich v z t a h k samostatným objektům

Při programování v Excelu se ve spojitosti s objekty budeme často setkávat také s kolek-cemi. Kolekce je skupina objektů stejné třídy (ale sama o sobě je také objektem). Od jednotlivých objektů, které obsahuje, se dá odlišit svým názvem, ve kterém je oproti názvu těchto objektů obvykle přidané písmeno „s". Např. Workbooks je kolekce obsahující všech-ny otevřené sešity čili objekty Workbook. Worksheets je zase kolekce všech pracovních listů (objektů Worksheet), které jsou obsaženy v určitém sešitu (Workbook).

K čemu jsou kolekce určeny? Jejich význam se dá shrnout do několika bodů:

y/ Kolekce výrazně zjednodušují celý objektový model.

Page 48: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

S Umožňuji jednoduchým způsobem zpracovat všechny objekty stejného druhu. Např. všechny otevřené sešity uzavřete tak, že projdete všechny členy kolekce Workbooks a uzavřete je.

v' V každé kolekci jednoduše zjistíte počet členů.

Pro přistup k jednotlivým členům kolekce slouží jejich pořadové číslo (tzv. ordinálni in-dex) nebo název.

Kolekce většinou (někdy ne) maji metody pro přidáni nebo odstraněni svého člena. Např. do kolekce Worksheeets můžete v makru přidat nový pracovní list metodou Add nebo ho z kolekce odstranit metodou Delete, v kolekci Workbooks však metoda Delete není - sešit z kolekce Workbooks odstraníte jen jeho uzavřením, pro které je ale určena jiná metoda, a to metoda sešitu, ne kolekce.

V kódu VB A můžete pracovat bud s celou kolekcí (jako s objektem), nebo s jejími jednot-livými členy. Záleží na tom, co chcete udělat.

Kontejnery jako „ n á d o b y " na jiné objekty a jejich hierarchie

Jestliže je celý dostupný formou objektů, je žádoucí, aby tyto objekty mezi sebou měly vazby. Představte si např. tuto úlohu:

V sešitu jsou listy, na kterých jsou určité účetní hodnoty. Každý list shrnuje údaje za určitý měsíc, vy ale nevíte, kolik je v sešitu listů. Máte dané hodnoty sumarizovat a uložit do jiného sešitu.

Úloha se dá samozřejmě řešit ručně, pokud by se ale požadované hodnoty nacházely na posledním řádku s údaji a jednotlivé listy měly různý počet řádků, pořádně byste se zapotili.

Požadované makro tedy musí projít všechny listy v sešitu, najít poslední neprázdný řádek, načíst z něj jednu (či více) hodnot a ty přičíst k celkovým součtům, které na závěr třeba zapíšete do jiného sešitu nebo vytisknete.

Pokud by jednotlivé objekty nebyly mezi sebou nijak vázány, jak byste zjistili, kolik listů máte sečíst? Jak byste na listu prohledávali buňky?

Vztahy mezi objekty jsou v objektovém programovacím jazyku vyjádřeny pomocí určitého hierarchického modelu, ve kterém jsou si objekty navzájem podřízeny. Na nejvyšším místě celého modelu obvykle stojí jeden objekt, jenž je kontejnerem pro objekty na úrovni o jeden stupeň nižší. Ty zase v sobě obsahují další objekty... a tak to jde dále, až k objektům nejnižší úrovně, které už kontejnerem nejsou.

Na nejvyšší úrovni v aplikaci je objekt Application, v našem případě sám Excel. Tento objekt Applicat ion obsahuje další objekty, které však existují jen tehdy, existuje-li sám objekt Application (Excel tedy musí být spuštěn, což je logické). Celkem je objektu Appli-cat ion podřízeno asi 50 (přesný počet je v každé verzi Excelu jiný) tříd objektů a kolekcí, ty nejzajímavější si vyjmenujeme:

Workbooks — kolekce všech sešitů - objektů Workbook.

V Windows - kolekce všech objektů Window, neboli oken uvnitř hlavního okna Excelu; pokud nechápete rozdíl vůči Windows a Workbooks, vzpomeňte si, že jeden sešit může být otevřen ve více oknech.

4 . Úvod do V B A a objektové

Page 49: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

V CommandBars - kolekce všech nabídek a panelů nástrojů.

- / D i a l o g s - kolekce všech vestavěných dialogových oken.

y Addlns - kolekce všech objektů Addln, neboli doplňků.

Debug - objekt používaný pro ladění programů.

Každý z těchto objektů může obsahovat další objekty. Např. kolekce Workbooks se skládá ze všech otevřených sešitů Workbook. Každý sešit Workbook obsahuje další objekty, opět si uvedeme jen některé z nich:

S Sheets - kolekce všech listů v sešitu.

S Workshee ts - kolekce všech pracovních listů v sešitu, objektů Worksheet.

S Charts - kolekce listů typu graf - objektů Chart.

V Names - kolekce pojmenovaných názvů v listu - objektů Name.

V S t y l e s - kolekce formátovacích stylů - objektů Style.

Každý z uvedených objektů může opět obsahovat další objekty. Kompletní objektový model Excelu je znázorněn formou diagramu v nápovědě programu.

[Application

- j Addlns

jAutoRecover

-[CellForroat

-{Borders

jFont ^Interior

-jÖefäultWebQption;

-¡Pialogs

-¡Dialog

-{ErrorCheckingOptions

-¡Names

-jOPBCErrors

-jOLEOBErrors

H -¡Areas

-{Borders ~

-{Characters

- { C o m m e n t -

'-{shape

-jFormatConditions

'¡Hyperlinks

"-¡Interior

^ R a n g e (continued)""

-¡List Columns

- j Phonetic

- j Phonetics

-¡PivotCeH

-{PivotField "

-{PivotItem~

jPivotTable

-¡ListRoi

HXmlMap

-jpivotltemlist

-{CalculateriMembers

jOibeFields ~

HPivotFormulas leryTable

-¡SoundNote

-¡Validation

-{Worksheet ~

AutoFilter ~

-¡Comments

- jCustomProperties "

-¡HPageBreaks

-{listQbjecti

-jputlint

- jPageSetup

-¡Protection

-¡Quer y Tables

-{Shapes

- j t a b

HVPageBreaks

HXPath

HxmlMap"

! ' _ _

-¡RTP

-{Smart TagRecognizers

-{Speech "

-jSpellingOptions

- jUsedOb|ects

-{Watches

-¡HPageBreaks

^HPageBreak~" HyPageBreaks

bjypageBreak

H SmartTagRecognizer

-[Windows *

T i - {Workbook -

-¡Custom Views

j Mailer

jPubl ishObjects

^Publ ishObject

-¡RoutingSlip

-{SmartTagOptions

-¡Styles -¡Style

-fWebOptions

"jXrožMaps

L{XmlMap~"

HxmlNamespaces

^XmlNamespace

-{Workbooks

H w o r k s h e e t F u n c t i o n "

o

> o

1 a

i £ o .

1 «

Obr. 4.1: Objektový model Excelu 2003 (žlutě jsou kolekce, modře objekty - v knize tento rozdíl samozřejmě nevidíte)

4 . 2 Objekty v jazyku V B A

Page 50: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

O d k a z y na objekty v kódu

Je jasné, že při práci s objekty pomoci kódu VBA musíte vždy zadat název objektu. To však nestačí. Objekt se vyskytuje vždy v nějaké úrovni objektového modelu, a v kódu je proto nutné zadat i toto umístění.

Jednotlivé úrovně objektového modelu se v kódu vyjadřují pomocí tečkové konvence, kdy je každá úroveň oddělena tečkou.

áin^ Tečka se používá i k oddělení objektu od jeho vlastnosti či metody.

Na nejvyšší úrovni hierarchie stojí objekt Applicat ion, který v úplném odkazu na objekt stojí vždy zcela vlevo.

Úplný odkaz na kolekci sešitů Workbooks bude tedy vypadat takto:

Application.Workbooks

Podívejte se zpět do diagramu objektového modelu, uvidíte tam kolekci Workbooks na úrovni „o jeden stupeň níže" než objekt Appl icat ion.

Chcete-li pracovat s nějakým objektem obsaženým v kolekci, vložte název objektu do závorek za název kolekce:

Applicat ion.Workbooks("pokus.xls") 'odkaz na s e š i t pokus .x ls

Názvy objektů mohou mít různou podobu. Např. název listu ve VBA odpovídá názvu na oušku listu. Názvem sešitu je vždy jen název souboru XLS, včetně přípony. Při odkazu na sešit nesmíte příponu vynechat a nesmíte zadat 11 plnou cestu. Následující dva odkazy na sešit jsou neplatné:

Application.Workbooks("pokus") Application.Workbooks("C:\Dokumenty\VBA\pokus.xls")

To je také důvodem, proč nemůžete v Excelu otevřít dva sešity se stejným názvem souboru, přestože jsou uloženy v různých složkách. Excel sešity rozlišuje jen podle názvu souboru.

Microsoft Office Excel M \ D o k u m e n t s n á z v e m A n a l ý z y . x l s je již o t e v ř e n . N e m ů ž e t e o t e v ř í t d v e d o k u m e n t y s e s t e j n ý m n á z v e m , i k d y ž s e

t \ n a c h á z e j í v r ů z n ý c h s l o ž k á c h . • « - £ - ) c h c e t e - l i d r u h ý d o k u m e n t o t e v ř í t , z a v ř e t e m o m e n t á l n ě o t e v ř e n ý d o k u m e n t n e b o j e d e n z d o k u m e n t ů p ř e j m e n u j t e .

Dále můžete používat odkazy pomocí pořadového čísla. Následující řádek je odkaz na prvního člena kolekce Workbooks:

Application.Workbooks(1)

Dávejte pozor na to, že pořadové číslo prvního člena kolekce je nula nebo jednička. Obecně se dá říci, že u kolekcí Excelu je to jednič-ka, u některých kolekcí s původem mimo Excel se však může začínat i nulou. Konkrétní údaje o způsobu číslování najdete v nápovědě k dané kolekci.

4 . Úvod do V B A a objektového m m m

Page 51: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Chcete-li zjistit nějaký údaj o celé kolekci nebo s ní něco udělat, odkážete přímo na ni. Např. počet otevřených sešitů se v kódu vyjádří takto (všimněte si, že tu chybí závorky):

Application.Workbooks.Count

Vyzkoušejte si to v okně Immediate (viz obrázek 4.2).

Immediate ? Application.WorJtbooks.Count

3

Obr. 42: V tomto případě byly otevřeny 3 sešity

Kolekce pracovních listů obsažených v sešitu pokus.xls je vyjádřena odkazem:

Applicat ion.Workbooks("pokus.xls") .Worksheets

Odkaz na první list v tomto sešitu bude v kódu zapsán takto:

Appl ica t ion .Workbooks("pokus .x ls") .Worksheets("Lis t í" )

Zkrácené odkazy na objekty

Úplný odkaz na objekt má několik nevýhod:

Ve většině případů byste se upsali k smrti.

S Orientace v takovém kódu je značně ztížená.

Z tohoto důvodu není nutné uvádět v odkazu na objekt všechny jeho „nadřízené" objekty. Jestliže však poLižijete zkrácený zápis, musíte si pamatovat, že Excel si vynechané objekty do odkazu doplní sám, a to podle určitých pravidel.

U kolekce Workbooks se není třeba ničeho obávat, protože nad ní je v odkazu už jen objekt Appl icat ion, a ten není možné nahradit ničím jiným. Takže následující dva řádky kódu jsou významově shodné:

Applicat ion.Workbooks("pokus.xls") Workbooks("pokus.xls")

U jednotlivých sešitů - na které odkazujete pomocí kolekce Workbooks - to už tak jed-noduché není. Jestliže vynecháte určení sešitu, pak Excel předpokládá, že máte na mysli sešit aktuální, tedy ten, jehož okno je v Excelu aktivní.

Pokud byste makro spustili v okamžiku, kdy žádný sešit není otevřen, ohlásil by Excel chybu.

Několik dalších řádků kódu bude snad dostatečnou ilustrací:

Workbooks("Seš i t i " ) .Worksheets ("Lis t í " ) Worksheets("Lis t í" )

V pivním řádku odkazujete na pracovní list Listí v sešitu Sešiti, i když aktivním sešitem může být sešit jiný. Ve druhém řádku odkazujete na list v aktivním sešitu, ať už se jmenuje jakkoli.

Page 52: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Pro odkaz na určitou oblast buněk (třeba na buňku AI) na listu s názvem Listí v sešitu Sešiti můžete použit následující vyraz:

Workbooks("Seši t i") .Worksheets("Lis t í") .Range("AI")

Tato forma zápisu připadá v úvahu vždy, kdy si nejste jisti, který sešit je právě aktivní. Jestliže víte (bezpečně!), že aktivní je právě Sešiti, můžete použít tento zápis:

Worksheets("List í") .Range("AI")

A - už asi tušíte, kam tím mířím - pokud je aktivním listem Listí, můžete použít ještě jednodušší výraz:

Range("AI")

Vynecháte-li tedy některé odkazy v hierarchii objektů, Excel dosadí ty, které jsou právě aktuální (aktivní).

Samotný odkaz na objekty (jak je tomu v těchto příkladech) však nedělá nic. Aby se provedlo něco smysluplného, musíte si přečíst nebo změnit vlastnosti objektu nebo zadat metodu objektu, která se má provést.

Rozdíl mezi vlastnostmi a metodami v kódu

Vlastnost popisuje vzhled či stav objektu, metoda provádí činnost. Z toho vyplývá, že vlastnost má vždy nějakou hodnotu. Např. vlastnost Name obsahuje název objektu, a to v textové podobě. Vlastnost V i s ib l e říká, zda je objekt viditelný či ne. Tentokrát jde o logickou hodnotu (ano/ne - je vidět/není vidět). Vlastnost Column vrací číslo sloupce, v němž se nalézá určitá buňka.

Hodnoty vlastností zjišťujeme, nebo je zadáváme. Proto se vlastnosti v kódu vyskytují vždy v přiřazovacím výrazu nebo ve výrazu, který vrací hodnotu (výrazy si podrobně vysvětlíme později). Následující řádek kódu přiřadí do vlastnosti Value hodnotu 20: 1 Value j e v l a s t n o s t , Act iveCell j e objekt Act iveCell .Value = 20

Vyzkoušejte si předchozí přiřazení v okně Immediate. Pro jistotu nejprve zkontrolujte, zda je v Excelu aktivní nějaký pracovní list (a ne list typu graf), a poté zapište do okna Immediate Act iveCel l .Value = 2 0 a stiskněte ENTER. Aktivní buňka na aktivním listu poté bude obsahovat číslo 20.

Při zjišťování hodnoty vlastnosti ukládáme získaný údaj obvykle do proměnné. Ty zatím neznáte, proto si ukážeme, jak zjistit hodnotu vlastnosti v okně Immediate:

Vrácená hodnota vlastnosti je vypsána přímo do okna Immediate. Předchozí ukázka výpisu do okna Immediate (? Appl ica t ion .Workbooks . Count) byla vlastně to samé, protože Count je vlastnost kolekce Workbooks.

Na rozdíl od vlastnosti provádí metoda nějakou akci:

? ActiveCell.Value 20

. i L I jT

Se lec t ion .C lea r

Page 53: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Metoda Clear smaže obsah objektu, na kterém ji spustíte. Nepřiřazujeme nikam žádnou hodnotu, proto tu schází rovnítko. Spuštěním této metody v okně Immediate vymažete obsah i formáty v aktuálně vybraných buňkách.

Pozor, některé metody vracejí hodnotu (fungují zároveň jako funkce), takže se mohou vyskytnout i v přiřazovacím pňkazu, ovšem jen na jeho pravé straně7 l

koef = Application.InputBox ("Zadej číslo")

V tomto případě je InputBox metoda objektu Application.

Většina metod má také parametry pro další upřesnění jejich činnosti. V další ukázce je na místo buňky C5 vložena buňka a původní buňka C5 je odsunuta směrem dolů. V tomto příkladu má metoda In se r t jeden parametr, kterým je směr posunu původní buňky. Zá-hadné slovo xlShiftDown je zástupný vyraz pro určitou hodnotu neboli konstanta. Další pojem, k němuž se brzy dostaneme.

Range("C5").Insert xlShiftDown

O parametrech si toho řekneme více v následujících kapitolách.

4 . 3 Události Kromě vlastností a metod se k objektům nerozlučně váží ještě události, o kterých zatím nebyla řeč.

Událost je akce vyvolaná uživatelem nebo systémem, na kterou objekt dokáže reagovat. Mezi takové akce patří např. otevření či uzavření sešitu, klepnutí či poklepání myší na objekt, změna hodnoty v buňce apod.

Každý objekt má přesně definovánu sadu událostí, které umí rozeznat. Pro vlastní progra-mování se obvykle použije jen jejich nepatrná část, ale zkušený programátor samozřejmě musí vědět, k čemu se určitá událost dá použít.

Každá událost má přiřazenu svou proceduru (říká se jí událostní procedura), v níž obvykle není vložen žádný kód. Pokud však nějaký kód do takové procedury napíšete, bude spuš-těn při každém výskytu dané události, tedy např. při otevření nějakého sešitu nebo před jeho uzavřením, před přepočítáním sešitu, po změně hodnoty v buňce apod.

Je jasné, že události představují značný potenciál, který je možné použít pro tvorbu robust-ních a výkonných aplikací. V pivním dílu této knihy se však s nimi setkávat nebudeme.

4.4 Nápověda k jednotlivým objektům Tématiku nápovědy většina příruček probírá jen okrajově. Prostě se předpokládá, že uži-vatel ví, jak nápovědu spustit (klávesou F1 nebo z nabídky Nápověda).

Nápověda k jazyku VBA se spouští klávesou Fl, přehled objektů Excelu najdete v části Microsoft Excel Visual Basic Reference. Vzhledem k velkému množství objektů je tato část dále dělena podle počátečního písma názvLi třídy.

ápovědo k jednotlivým objekti H

Page 54: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

i]2i Microsoft Excel Visuai Basic Reference ( | | Microsoft Excel Object Model

SWhaťs New Programming Concepts

íářCollections ^ýObjects 4^Mefchods tÉřProperťies ^Events

Enumerations

Kontextová nápověda

Jestliže v modulu kódu umístíte kurzor do názvu nějakého objektu, případně do názvu metody či vlastnosti, zobrazí nápověda přímo po stisku klávesy F1 heslo týkající se da-ného objektu, vlastnosti nebo metody. Stejně to funguje u názvů vestavěných příkazů či funkci.

V některých případech - obvykle u vlastností nebo metod- však kon-textová nápověda takto jednoduše nefunguje, konkrétně v případě, kdy je slovo, ke kterému chcete nápovědu zobrazit, definováno ve více objektových knihovnách. (Ano, vím, pojem „objektovéknihovny"zatím nebyl vysvětlen.) Vtom případě se objeví ještě dialog z následujícího obrázku, ve kterém je nutné vybrat správný řádek. V tomto případě jsem se pokusil vyvolat kontextovou nápovědu k vlastnosti Value.

Context Help

Multiple instances of the selected word have been found. Please select a topic and press Help.

Help Topic

Help

Cancel

V heslu nápovědy, které se týká celého objektu, najdete v horní části vždy hypertextové odkazy na seznamy všech vlastností (Properties), metod (Methods) či událostí (Events ) objektu. Na začátku hesla se vždy nachází výřez z objektové hierarchie, kde najdete, na jaké úrovni objektového modelu se daný objekt nachází. Na obrázku 4.3 vidíte heslo k objektu Workbook.

Page 55: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

<D Nápověda pro Microsoft Visual Basic B B B

H <=> s A

Workbook Object See Also Properties Methods Events

[Multiple objects j

H Workbook I I , ^Multiple objects ;

Represents a Microsoft Excel workbook. The Workbook object is a member of the Workbooks collection. The Workbooks collection contains all the Workbook objects currently open in Microsoft Excel.

Using the Workbook Object The following properties for returning a Workbook object are described in this section:

• Workbooks property

• ActiveWorkbook property

• ThisWorkbook property

Obr. 43: Heslo nápovědy s odkazy na seznam vlastností, metod a událostí

Page 56: 00-vba1 - Kopie
Page 57: 00-vba1 - Kopie

Začínáme psát vlastní makra

Poté, co jsme probrali první část teorie, se budeme nyní věnovat základům psaní maker, včetně spousty další teorie. Nahrávání maker vám pomůže v začátcích, ale složitější procedury je nutné psát ručně (celé nebo upravit nahrané makro). Proto si pamatujte, že schopným programátorem je teprve ten, kdo si dokáže potřebný algoritmus sám navrhnout i napsat.

Výkladem algoritmizace se tato kniha bohužel nezabývá, i když se jedná o fundamentální část programování. Je to ale příliš rozsáhlá tematika.

Ve třetí kapitole jste se seznámili s editorem jazyka VBA. Umíte se do něj dostat, vrátit se zpět do Excelu ( A L T + F 1 1 ) , umíte najít moduly a otevírat je. Ve čtvrté kapitole jste se seznámili s tím, co je objekt, co jsou jeho vlastnosti a metody. Abychom se mohli pustit do psaní, bude nejprve nutné větší množství teorie, které zkusíme (hned jak to půjde) proložit jednoduchým cvičením.

Začínáme psát vlastní makra

Page 58: 00-vba1 - Kopie

V běžných výukových kurzech se snažím pň výkladu co nejvíce střídat teorii a její praktickou aplikaci na nižných objektech. Při psaní knihy se mi ale tento přístup nelíbí.

5.1 Části standardního modulu kódu Obecně se dá říci, že standardní modul může obsahovat jednak procedury a funkce, které jsme si již stručně vysvětlili (a hned se k nim vrátíme), a dále deklarace proměnných. Deklarace jsou velmi důležité a v této kapitole se o nich dozvíte mnoho podrobností.

Deklarační část je na samém počátku modulu, procedury a funkce jsou umístěny za ní.

. PERSONAL.XLSB - Modulel (Code) [(General) jKonecPrace " 3

P r i v a t e 3meno As S t r i n g

Pub l i c Funct ion CeleJitteno (jmeno As S t r i n g , p r i jmen i As S t r ing) Ce leJweno » jroeno & " " £ p r i j w e n i

End Funct ion

Pub l i c Sub KonecPraceO Dim wb As Workbook For Each wb In Workbooks

wb.Close True Next App l i ca t ion .Qu i t

End Sub

Obr. 5.1: Zcela nahoře je deklarační část, za ní následují procedury a funkce

5.2 Procedury a funkce Česká terminologie programování se poněkud liší od anglické (i když je to nepříjemné), proto si nejdříve objasníme význam základních termínů:

V Podprogram - je to sled příkazů, vykonávaný jako celek a tvořící uzavřenou jed-notku. Běh spuštěného podprogramu je možné přerušit voláním jiného, po jehož vykonání se řízení vrací zpět clo nedokončeného volajícího podprogramu. (Běh může být rovněž přerušen v případě vzniku chyby, zásahem ze strany uživatele nebo použitím příkazu Stop.)

V Procedura (v jazyku se označuje klíčovým slovem Sub) - jedná se o podprogram, který provede sérii příkazů (nebo jeden příkaz) a skončí.

y Funkce (občas označované i jako funkční procedury, anglicky Function) - je to podprogram, který kromě toho, že provede nějaké příkazy, také vrací určitou hod-notu. Tuto vrácenou hodnotu můžete uložit do paměti počítače (tedy do proměnné), nebo ji zpracovat jiným způsobem, případně ji ignorovat.

Funkce znáte už ze základní školy z hodin matematiky:

y = log(x)

Toto je vám jistě známý zápis funkce „logaritmus", která ze zadaného čísla x vypočítá jiné číslo a vyjádří je (v počítačovém slangu „vrátí") jako číslo y. Funkce v programech se chovají úplně stejně - a stejně jako v matematice se za jejich názvem také píší závorky.

Page 59: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Návratová hodnota funkce může obsahovat bud výsledek výpočta, nebo informuje o úspěš-ném či neúspěšném výsledku průběhu funkce (výsledek v tomto případě funkce uloží někam jinam).

Abych se vyhnul dalším zmatkům, budu používat pouze dva pojmy, které jsou v češtině již zažité:

S Procedura - jedná se o libovolný sled příkazů mezi řádky Sub a End Sub.

V Funkce - je totéž, ale mezi řádky Function a End Function.

J a k ý je rozdíl mezi makrem a procedurou?

Tyto dva pojmy se sice někdy zaměňují, mají však trochu odlišné významy. Makro je procedura bez parametrů, kterou můžete nahrát, a kterou lze spustit z libovolného místa Excelu (včetně dialogového okna Makro). Každá procedura nemusí být makrem, ale každé makro je procedurou. Obecně můžeme říci, že makra jsou všechny procedury, které jsou vidět v dialogovém okně Makro.

Funkce se z dialogového okna Makro spustit nedá, stejně jako pro-cedura s parametry.

V dalším výkladu se budu snažit pečlivě rozlišovat mezi makrem a procedurou, pokud se mi to nepodaří, nezlobte se. Oba pojmy se často zaměňují, i když by to programátoři dělat neměli.

Jak vytvoříte novou proceduru či funkci?

Makra nahráváte, vlastní procedury či funkce píšete. Do jednotlivých modulů - modul musí být vždy aktivní - se procedury či funkce vkládají příkazem Insert —> Procedure. Tento příkaz zobrazí následující dialogové okno (viz obrázek 5.2)

Add Proceduře

! fiame: j J 1 O K

T y p e

S u b C a n c e l |

C F u n c t i o n

C P r o p e r t y

S c o p e

i ( * Public

j C P r i v a t e

r Local variables as Statics

Obr. 52: Dialogové okno Add Procedure

Co je tu podstatné - v horním textovém poli Name zapíšete název, ve středním rámečku zvolíte, zda půjde o proceduru nebo funkci. Třetí možný typ (Pr ope r ty ) v tomto dílu probírán nebude. Zbylé volby neměňte.

5.2 Procedury a funkce

Page 60: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Existuji nějaká pravidla pro názvy procedrir? Ano, existuji. Probereme si je v části „Konvence pro názvy objektů a proměnných".

Po potvrzeni tlačítkem OK se do modrilu vloží prázdná hlavička procedury či funkce, která bude mít tento tvar:

Publ ic Sub název()

End Sub

nebo

Publ ic Function název()

End Function

Klíčové slovo Public určuje rozsah platnosti čili viditelnost procedury/funkce (tu si po-drobně vysvětlíme později LI proměnných). Za názvem jsou vždy závorky, ty k názvu psát nenuisíte, editor je doplní sám.

ZkLisme si nyní napsat nějakou primitivní proceduru. Příkazem Insert —> Procedure vyvolejte okno z obrázku 5.2, zapište název Vlož i t Jméno a stiskněte OK. Do modulu se vloží prázdná hlavička procedury, kterou upravte tímto způsobem (namísto Jana Pivody napište do závorek své nebo jakékoli jiné jméno):

Publ ic Sub VložitJméno() ActiveCell = "Jan Pivoda"

End Sub

HotovoLi proceclLiru můžete zkusit spListit bud v Excelu, kde se její název objeví v okně Makro, nebo v okně Immediate, kde zapíšete její název a stisknete ENTER. V obou pří-padech vloží procedura do aktivní buňky text, který jste v ní definovali (ActiveCell je zástupný odkaz, ukazující na aktivní buňku).

5.3 Jednotlivé části podprogramů U nahraných maker to bylo jednoduché: za řádkem s názvem makra následoval několi-kařádkový komentář a pak už jen samotné příkazy. V proceduře či funkci se však mohou nacházet i další části.

Pivní z nich je část pro deklaraci proměnných, se kterou jsme se potkali již LI modulů. Proč se některé proměnné deklarují uvnitř procedur a některé na začátkri modulu (tedy mimo jakoLikoli proceduru), se dozvíte později.

Jednodušší i složitější procedury by také měly počítat s možností nejrůznějších chyb, ke kterým během provádění může dojít. Nahrané makro např. může odkazovat na buňku ležící o čtyři řádky nad buňkou aktuální. Ale co když toto makro spustíte v okamžikLi, kdy aktuální buňkoLi bude např. buňka C2? Čtyři řádky nad buňkou C2 LIŽ samozřejmě žádná buňka není, takže makro v tomto okamžiku ohlásí chybu.

Z těchto důvodů by v procedurách vždy měly být i tzv. chybové rutiny, tedy kód potřebný pro ošetření chyb, k nimž za bělui programu dojde.

A konečně ručně psané procedury mohou přebírat parametry, které modifikují jejich čin-nost. Parametry jsou uvedeny v hlavičce procedury, uvnitř závorek hned za jeho názvem. U nahraných maker se parametry nikdy nevyskytují, stejně jako proměnné.

Možnou strukturu procedriry vám přibližuje tato ukázka:

5. Začínáme psát vlastní makra

Page 61: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

' h lavička s dvěma parametry Sub De len i ( r l As Range, r2 As Range)

1 deklaračni čás t Dim podi i As Integer ' začátek výkonné č á s t i On Error GoTo chybova_rutina podi i = r l .Value \ r2.Value ActiveCell .Value = podi i 1 ukončeni p ř i bezchybném průběhu Exit Sub

' čás t pro oše t řen i chyb

chybova_rutina: If Err = 11 Then

ActiveCell .Value = CVErr(2007) Else

Msgbox "Neznámá chyba v proceduře Deleni" End If

End Sub ' konec procedury

Příkaz MsgBox, který se v této proceduře vyskytuje, bude sice vysvětlen až později, ale vy si raději ihned zapamatujte, že jde o příkaz, který zobrazí hlášení pro uživatele.

Struktura vlastní funkce

Jak už víte, funkce se od procedury liší tím, že umí vrátit nějakou hodnotu. Je jasné, že při psaní vlastních funkcí musíte někde určit, co bude funkce vracet. V jazyku VBA se to udělá tak, že v kódu funkce napíšete příkaz ve tvaru:

název_funkce = hodnota

V následujícím výpisu je jednoduchá funkce, přebírající dva číselné parametry, která vy-počítá a vrátí rozdíl jejich druhých mocnin:

Function RozdilMocnin(a as Double, b as Double) RozdilMocnin = a * a - b * b

End Function

Parametry jsou formálně pojmenovány a, b. Při volání této funkce v kódu pak budeme funkci předávat skutečné parametry, např. takto: 1 předáváme e x p l i c i t n í hodnoty x = RozdilMocnin(20.5, 15) ' předáváme proměnné x = RozdilMocnin(vetsi, menši)

Desetinná tečka v prvním řádku není překlepem, podrobně budeme tuto problematiku rozebírat později.

Deklaračni část a část pro ošetření chyb se pochopitelně ve vlastní funkci vyskytovat může také.

5.3 Jednotlivé části podprogramů

Page 62: 00-vba1 - Kopie

Zkuste si nyní tento příklad prakticky. Kód funkce zapište do modulu a v okně Immediate si poté hotovou funkci otestujte (viz obrázek). Znovu připomínám, že při zápisu desetin-ných čísel je nutné použít jako oddělovač tečku, nikoli čárku. (Čárkou se navzájem oddělují jednotlivé parametiy.)

Immediate ® ? R o z & i l H o c t t i n ( 1 5 , 5 , 10) *

1 4 0 , 2 5

»

j t U j T

5.4 Příkazy a jejich zápis Konvence říká, že na jeden řádek v kódu píšeme jeden příkaz (vestavěný příkaz jazyka, volání vlastní procedury, volání funkce a přiřazení návratové hodnoty apod.). Je to nej-přehlednější způsob, a vylučuje některé chyby vzniklé zápisem.

Při zapnuté kontrole správnosti zápisu zkontroluje VBA po napsání každý řádek kódu, a pokud je bez chyby, přeformátuje ho podle svých vnitřních konvencí (vloží mezery mezi operátory, malá písmena na začátku příkazů převede na velká apod.). Přitom se mohou také některé části kódu (komentáře) barevně odlišit. Toto rozlišení se nastavuje v okně možností editoru. Zde můžete rovněž zapnout či vypnout zmíněnou automatickou kontrolu správnosti zápisu. Jednotlivé volby jsou popsány v jedné z dalších částí této kapitoly.

Microsoft Visual Basic

Compile error:

Expected: expression

O K ~ l | Nápověda )

Obr. 53: Jestliže při zápisu uděláte chybu, editor vám to oznámí

Je-li příkaz příliš dlouhý - obvykle tehdy, když má více parametrů - lze jej rozdělit na více řádků (není to nutné, dělá se to jen kvůli tomu, abyste ho viděli celý v okně modulu). Na konci každého řádku (kromě posledního) je nutné napsat znak pokračování řádku, což je mezera následovaná podtržítkem:

Součet - Act iveCel l .Value + Ac t i veCe l l .Of f s e t (0 , A c t i v e C e l l . O f f s e t ( 0 , 8).Value

1) .Value +

Můžete rovněž psát na jeden řádek více příkazů - přitom je oddělujete dvojtečkou - ale vyhýbejte se tomu, protože zápis pak ztrácí přehlednost:

Součet = Act iveCel l .Value + Range("D2").Value : MsgBox Součet

V tomto případě se na jednom řádku nachází vypočet proměnné Součet, a hodnota této proměnné je pak zobrazena v okně hlášení.

5.5 Proměnné Vzorec v příkladu logaritmické funkce y = log(x) má dvě strany rozdělené rovnítkem (znaménko =). Na pravé straně je vlastní funkce, na levé výsledná hodnota, vrácená funkcí.

5. Začínáme psát vlastní makra

Page 63: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Tuto výslednou hodnotu musíte někam idožit, pokud s ní chcete dále pracovat.

Uložená výsledná hodnota se podobně jako vlastni běžící program nachází v operační paměti. Každé takové dočasné hodnotě, ať LIŽ číselné, textové či jiné, která je uložena na zvláštním místě v operační paměti, se říká proměnná.

Jako proměnné můžeme v podstatě chápat i vlastnosti objektů, protože i ty mají nějakou hodnotu. Proměnná ovšem není na objektu nijak závislá.

Přiřazení hodnoty do proměnné

Přiřazení se provádí operátorem =, u proměnných objektového typu vždy příkazem Set.

x = 15 Set ws = ActiveWorkbook.Worksheets(2)

Proměnné objektového typu si popíšeme podrobněji v části „Odkazy na objekty pomocí proměnných".

Už jméno naznačuje rozdíl oproti proměnným - konstantou je určitá hodnota, která se bě-hem programu nemění. Díky nim je možné zkrátit či zpřehlednit zápis kóclu. Jestliže budete např. na více místech ve více makrech používat určitý koeficient, pak místo opakovaného psaní stejné hodnoty (čísla) je lepší toto číslo deklarovat jako konstantu, a v kódu pak psát její název. Zásadní výhodou konstant je i fakt, že v případě změny její hodnoty stačí zapsat nový údaj na jediném místě, není nLitné vyhledávat a přepisovat všechny výskyty.

VBA rozlišuje konstanty podle místa jejich deklarace:

S Vestavěné konstanty - jsou deklarovány v objektových knihovnách samotného jazyka a také v objektových knihovnách jednotlivých ovladačů nebo objektů jiných aplikací. Co je objektová knihovna, není ted podstatné, je to prostě něco, co vám jazyk VBA připravil předem. Vestavěné konstanty tedy můžete okamžitě používat. Setkáte se s nimi u velkého množství různých metod i vlastností. Jejich výhodou jsou dobře navržené názvy, podle kteiých většinou poznáte, co daná konstanta představuje. ' Ukázka ves tavěných kons tan t u funkce MsgBox odp = MsgBox("Chcete opravdu s k o n č i t ? " , vbQuestion+vbYesNo)

V Symbolické (Liživatelsky definované) konstanty - vytváříte si je sami podle svých potřeb příkazem Const.

Jazyk VBA se skládá z řady klíčových slov, jejichž názvy většinoLi nemůžete poLižít k označení čehokoli jiného. A i když byste nějaké klíčové slovo mohli použít třeba pro název proměnné, nedělejte to. Není to k ničemu, jen se tím při psaní kódu zvyšuje možnost vzniku chyb.

5.6 Konstanty

5 . 7 N á z v y objektů, proměnných a konstant

Page 64: 00-vba1 - Kopie

64 E X C E L 2 0 0 0 - 2 0 0 7

Při tvorbě názvů proměnných, konstant, procedur a funkci musíte dodržovat ještě další pravidla:

v' Názvy musí začínat písmenem (nikoli číslicí!).

V Názvy nesmí obsahovat tyto znaky: mezera, &,# ,©,$ , %, !, čárka, tečka.

V Názvy nesmí být delší než 255 znaků (u objektů 40 znaků). V praxi používejte nejvíce 32 znaků, jinak se kód značně znepřehlední.

S Nemůžete použít dva stejné názvy v rámci stejného rozsahu platnosti proměnné či objektu. Pojem „rozsah platnosti" si objasníme za chvíli.

VBA v názvech nerozlišuje mezi velkými a malými písmeny. Názvy major, MAJOR a Major jsou proto názvy stejné proměnné. m

0 velkých a malých písmenech v názvech si řekneme ještě něco - VBA vám neumožní psát názvy jedné a té samé proměnné s různými velkými a malými písmeny (viz poslední výstraha). Chování editoru se v tomto ohledu liší podle toho, zda proměnná je nebo není deklarována:

V V případě, že proměnná deklarována je, převede editor písmena v názvu na velká a malá přesně tak, jak je dáno v deklaraci. Takže pokud je proměnná deklarována ve tvaru souče t , avy někde v kódu název proměnné napíšete jako Součet, opraví editor tento tvar na součet.

S Jestliže proměnná deklarována není, rozhoduje poslední tvar zápisu. Pokud název proměnné nejdříve napíšete jako součet a o chvíli později jako SOUcet, opraví editor první výskyt rovněž na SOUcet. Napísete-li pak někde jinde Součet, přepíše editor i pivní dva výskyty na Součet.

1 toto chování je důvodem pro to, abyste používali deklarace všech proměnných.

5.8 V ý r a z y Pojem výraz označuje v programovacím jazyku jakoukoli kombinaci klíčových slov, pro-měnných, konstant a operátorů, jejímž výsledkem je logická hodnota (ano/ne čili True/ Falše), text, číslo nebo objekt. Výrazy můžete používat pro testování dat, manipulaci s proměnnými nebo k provádění výpočtů.

Přestože toho zatím z jazyka VBA neznáte mnoho, nebudou vám následující příklady dělat potíže:

x > 5 ' srovnání 2 hodnot, výsledkem j e logická hodnota x ' proměnná sama o sobě rovněž p ředs tavu je hodnotu L e f t ( x , l ) ' funkce v r ac í hodnotu, takže j e výrazem 15 * 52 ' numerický výraz x < (5 * z) 1 s l o ž i t ě j š í porovnání,

' výsledkem j e opět logická hodnota

5. Začínáme psát vlastní makra

Page 65: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 6 7

Nepleíte si výrazy a příkazy. Příkazy provádí nějakou akci, výsledkem výrazu je h odnota. ^ Jl

5.9 Operátory Operátory LirČLijí druh operace, která bLide provedena na částech výrazu okolo daného operátoru (tj. na operandech). Ve VBA budete pracovat se čtyřmi základními druhy ope-rátorů:

V Aritmetické: Provádějí matematické operace. Patří sem operátory sčítání (+), násobení (*), dělení (/), celočíselného dělení (\), odčítání (-), umocňování (A) a operátor Mod, poLižívaný pro vypočet zbytku dělení (tzv. modřilo).

Při celočíselném dělení jsou oba operandy (clělenec a dělitel) zaokrouhleny na celé číslo, následně vyděleny a z výsledku je odříznuta desetinná část. Obdobně funguje operátor Mod - dělenec a dělitel jsou zaokrouhleny na celé číslo, vyděleny a vrácen je tentokrát zbytek po dělení (celé číslo).

aa = bb + cb 1 součet bb + cc p ř i ř a z e n do proměnné aa aa = 5 A 2 ' aa bude obsahovat 25 aa = 15 \ 2 ' aa bude obsahovat 7 aa = 15 Mod 2 ' aa bude obsahovat 1 (zbytek po děleni)

S Srovnávací: VBA podporuje stejné operátory, jaké se dají použít ve vzorcích Excelu: rovná se (=), větší než (>), menší než (<), větší nebo rovno (>=), menší nebo rovno (<=) a nerovná se (<>). Operátor I s se používá pro porovnání dvou objektových proměnných a v příkazu Se lec t Case.

aa > bb ' j e aa v ě t š i než bb?

V Spojovací: Operátor & se používá pro spojování textových řetězců. Více o spojo-vání řetězců najdete v části „Způsoby zápisu hodnot clo proměnné", která začíná na straně 77. 1 spo jen i dvou ře tězců do jednoho

cele_jmeno = jméno & " " & pr i jmeni

V Logické: Provádí logické operace. Do této skupiny patří operátoiy negace výrazu (Not), logický součin čili konjunkce (And), logický součet čili disjunkce (Or), ne-ekvivalence (Xor), ekvivalence (Eqv) a implikace (Imp).

111 Negace vrací logický opak výrazu. Jestliže výraz 2 > 1 platí (což v desítkové číselné sou-stavě je splněno), pak výraz Not (2 > 1) vrátí logickou hodnotu Falše, čili neplatí.

Logický součin platí (vrátí hodnotu True), pokud platí oba výrazy po stranách operátoru And. Jestliže jeden z těchto výrazů (nebo oba dva) neplatí, vrátí operátor And hodnotu Falše. 1 n á s l e d u j i c i výraz p l a t í , pokud aa > 5 a zároveň bb < 10 aa > 5 And bb < 10

Logický součet platí (vrátí hodnotu True), pokud platí alespoň jeden výraz po stranách operátoru Or.

5.9 Operátory

Page 66: 00-vba1 - Kopie

68 E X C E L 2 0 0 0 - 2 0 0 7 HHMNNHMMHMHRM

' n á s l e d u j í c í výraz n e p l a t í 3 > 5 Or 15 < 10 ' t en to výraz p l a t í , protože p l a t í druhý výraz 3 > 5 Or 5 < 10

Operátor neekvivalence Xor vrátí True, pokud platí jen jeden z obou výrazů po jeho stranách. Jestliže platí oba výrazy najednou, nebo pokud oba výrazy současně neplatí, vrátí Xor hodnotu Falše.

Ekvivalence (Eqv) funguje přesně opačně: tento operátor vrátí True, jestliže oba operandy platí nebo oba neplatí.

Poslední logický operátor implikace (Imp) dává trochu „nelogické" výsledky - vrátí True, jestliže oba operandy platí nebo oba neplatí, navíc však vrací True i v případě, kdy levý ope-rand neplatí a pravý platí (pokud levý platí a pravý neplatí, je vrácena hodnota Falše).

Vyhodnocování logických operátorů ještě trochu komplikuje speciální hodnota Null, ale o té bude řeč až za chvíli.

Pořadí vyhodnocování operátorů

Pořadí vyhodnocení jednotlivých operátorů je dáno jejich příslušností do skupiny operátorů a jejich prioritou (ta se dá v případě potřeby změnit uzavřením částí výrazu do závorek):

1. Aritmetické operátory mají přednost před srovnávacími a ty zase před logickými.

2. Srovnávací operátory jsou si navzájem rovny, tzn. jejich vyhodnocování probíhá vždy zleva doprava.

Priorita operátorů v rámci jedné skupiny je dána následující tabulkou. Pozor, oba sloupce jsou na sobě nezávislé - jak již bylo řečeno, aritmetické operátory mají přednost, zde jde jen o úsporu místa.

Aritmetické Logické Umocňování (A) Negace (Not) Znaménko minus (-) Logický součin, čili konjunkce (And)

Násobení a dělení (*, / ) Logický součet, čili disjunkce (Or) Celočíselné dělení (\) Neekvivalence nebo též exkluzivní dis-

junkce (Xor). Zbytek po dělení (Mod) Ekvivalence (Eqv) Sčítání a odčítání (+, -) Implikace (Imp) Spojení textových řetězců (&)

Operátor & samozřejmě nepatří do skupiny aritmetických operátorů, ale v pořadí vyhod-nocování se nachází právě mezi aritmetickými a srovnávacími operátory.

U k á z k y operátorů a jejich vyhodnocování

V dalším výpisu kódu vidíte několik jednoduchých výrazů s různými operátory a výsledek jejich vyhodnocení.

' výsledek j e 20, násobení má přednost 2 * 5 + 10

5. Začínáme psát vlastní mal 391

Page 67: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

' t ady bude výs ledek 30, d ík závorkám proběhne n e j d ř í v s č í t á n í 2 * (5 + 10) ' výraz ve t ř e t í m řádku v r á t í F a l š e , aa není v ě t š í než bb aa = 5 bb = 10 aa > bb ' výraz ve t ř e t í m řádku v r á t í Fa l š e , aa není j i n é než bb aa - 10 bb - 10 aa <> bb

5 . 1 0 Datové typy proměnných a konstant U proměnných rozeznáváme čtyři základní charakteristiky:

Název Pravidla pro pojmenování jsme si uvedli dříve

Datový typ Vyjadřuje, jaký typ hodnoty můžeme do proměnné umístit (text, číslo, clatum...), a také kolik místa v paměti proměnná zabere

Platnost Určuje, které části aplikace mohou s proměnnou pracovat. Někdy se používá též pojem dostupnost

Životnost Specifikuje dobu existence proměnné; většinou souvisí s platností

Datové t y p y proměnných a konstant

Datový typ stanoví, co všechno můžete do proměnné uložit, a také způsob, jakým budou data Liložena v paměti - tedy jako celá čísla, reálná čísla, textové řetězce... Jestliže datový typ nezadáte, použije VBA výchozí typ Var iant , který povoluje zadáni všech možných hodnot.

U konstant toto pravidlo neplatí- neurčíte-lipři deklaraci konstanty datový typ, použije VBA ten, jenž nejlépe odpovídá hodnotě, kterou konstanta představuje.

Informace o datovém typu

Informaci o datovém typu jakékoli proměnné (s výjimkou uživatelsky definovaných typů) vrací funkce TypeName, která vypíše název datového typu jako text (řetězec):

' pro tex tovou proměnnou zobraz í "S t r i ng" apod. TypeName(aa)

U základního typu Var i an t (který může obsahovat vlastně cokoli) lze navíc konkrétní typ obsahu dané proměnné specifikovat pomoci speciální funkce VarType, která vrací číslo:

pokus = "Nazdar" MsgBox VarType(pokus)

Pokud by proměnná pokus z této Likázky neměla určen datový typ (takže by šlo o typ Variant) , vrátí funkce VarType číslo 8, protože v proměnné je Liložen textový řetězec. V praxi se funkce VarType používá k ověření typu hodnoty v proměnné typu Var iant ,

Page 68: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

abyste např. měli jistotu, že v proměnné je číslo, a můžete ji proto něčím vynásobit. (Když proměnnou deklarujete jako číselný typ, nebudete muset nic kontrolovat.)

Návratové hodnoty funkce Var Type jsou uvedeny v nápovědě.

Kromě toho máte k dispozici několik funkcí, pomocí nichž si můžete ověřit, zda daná proměnná obsahuje určitý typ hodnoty nebo zda se dá na určitý typ hodnoty konvertovat. Mezi tyto funkce patří IsNumeric (test na číselnou hodnotu), IsDate (test na datum), IsObject (testujeme, zda proměnná obsahuje odkaz na objekt), I sError (test chybové hodnoty).

pokus = "Nazdar" 1 zobrazí se Falše , protože nejde o č í s l o MsgBox IsNumeric(pokus)

Datové typy se dají rozdělit na několik základních skupin:

V Čísla - jsou celá nebo desetinná, omezená určitým rozsahem. U některých jiných programovacích jazyků se v rámci jednoho typu rozlišují čísla bez znamének (např. 0 až 255) a se znaménky (např. -127 až +127). Ve VBA toto rozlišení schází.

S Text - textové údaje jsou v programování obvykle označovány jako řetězce. Omezeny jsou obvykle svou délkou.

V Logické (Boolean) hodnoty - mají význam Ano/Ne, Platí/Neplatí, Zapnuto/Vy-pnuto. Ve VBA jsou vyjádřeny jako dvojice True/Falše (Pravda/Nepravda).

y Datum - datum a čas, u kalendářních dat je obvyklé určité omezení rozsahu.

V Objekt - proměnná objektového typu obsahuje odkaz na nějaký objekt.

<^títOTn6f»/ Je-li to možné, vyhýbejte se výchozímu typu Var i an t. Proč? Podívejte j!fJ% se do následující tabulky a rychle poznáte, že zabere mnohem více

místa v paměti než ostatní datové typy. Také vlastní početní operace mohou trvat mnohem déle.

V následující přehledné tabulce jsou uvedeny všechny datové typy proměnných (podrob-nější tabulku obsahuje heslo nápovědy „Data Type Summary"):

Typ Velikost Rozsah hodnot a význam Byte 1 bajt Číslo 0 až 255; používá se pro ukládání binárních dat,

což není téma pro tuto knihu. In teger 2 bajty Celá čísla v rozsahu -32 768 až 32 767. Základní typ

pro práci s celými čísly. Long 4 bajty Celá čísla v rozsahu -2 147 483 648 až 2 147 483 647. Single 4 bajty Desetinná čísla s přesností na 6 desetinných míst,

rozsah možných hodnot je uveden v nápovědě k pro-gramu.

Double 8 bajtů Desetinná čísla s dvojnásobnou přesností při výpočtu; rozsah možných hodnot je uveden v nápovědě k pro-gramu.

Page 69: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 / I

Typ Velikost Rozsah hodnot a význam Currency 8 bajtů Číslo s pevným počtem 4 desetinných míst; rozsah

možných hodnot je uveden v nápovědě k programu. Doporučeno pro operace s peněžními hodnotami. Výpočty s tímto typem probíhají rychleji než u typu Single či Double.

Decimal 14 bajtů Tento typ není možné deklarovat, proměnnou to-hoto typu lze získat jen převodem proměnné typu Variant pomocí funkce CDec. Typ Decimal je určen pro čísla s extrémním počtem desetinných míst (až 28). Zapomeňte na něj.

S t r i ng různá pro řetězce pevné a pro-měnné délky

Textové řetězce. Rozsah až 2><109 znaků (proměnná délka řetězce) nebo 64 kilobajtů (pevná délka řetězce).

Příklad dvou možných podob tohoto typu je uve-den v části s názvem „5.15 Dalšípoznámky k datovým typům

Boolean 2 bajty Logická hodnota True nebo Falše (Ano/Ne). Date 8 bajtů Datum v rozsahu 1. leden 100 až 31. prosinec 9999. Object 4 bajty Jakýkoli odkaz na objekt. Blíže bude tento typ před-

veden později, v části „Odkazy na objekty pomocí proměnných" v šesté kapitole.

Var iant různá, nejméně 16 bajtů

Základní typ, může obsahovat speciální hodnoty Null, Error, jakoukoli numerickou hodnotu, jakýkoli text, odkaz na libovolný objekt nebo pole proměnných.

Dále mohou existovat ještě uživatelsky definované typy proměnných, ty nás ovšem v této knize opět nebudou zajímat.

Obecně platí, že je nejlepší používat takový datový typ, který zabere v paměti co nejméně místa, ale přitom dokáže obsáhnout všechny možné hodnoty, které mu můžete přiřadit (pro desetinná čísla tedy nelze použít celočíselný typ Integer apod.). V praxi ovšem hraje roli i počet bajtů, které procesor umí zpracovat v jedné instrukci... a vůbec, to už jsou technické podrobnosti.

5 . 1 1 Rozsah platnosti a životnost Každá proměnná a konstanta má svůj rozsah platnosti určující, které podprogramy jsou schopny s touto proměnnou pracovat (slangově - které ji „vidí"):

Tyto proměnné mohou být použity pouze v tom podprogramu, v němž se vyskytují. Žádný jiný podprogram je „nevidí' a jejich hodnotu tedy jinde nemůžete získat. Deklarace lokálních pro-měnných není povinná a používá se pro ni příkaz Dim, případně Sta t ic .

« S M H

1 1 5

. 1 1 Rozsah platnosti a životnost

Page 70: 00-vba1 - Kopie

72 E X C E L 2 0 0 0 - 2 0 0 7

Modulové proměnné Jsou dostupné v rámci celého modulu, a lze je proto použít třeba k uložení hodnoty, která má být dostupná někdy později v ji-né proceduře. Modulové proměnné musí být deklarovány, a to v deklarační části modulu příkazem Dim nebo Priváte.

Veřejné (globální) pro-měnné

Mohou být použity ve všech modulech, neboli v celém (jednom) sešitu. Veřejné proměnné musí být deklarovány, a to v deklarační části modulu příkazem Public.

Kde se nachází deklarační část modulu? V horní části modulu jsou dva rozevíraci seznamy. Když v levém z nich vyberete položku (General), v pravém seznamu najdete položku (Declarations). A to je právě ta deklarační část modulu (viz obrázek 5.4).

M PERSONAL.XLSB - Mo du le 1 (Code) a i® i j (General) v j | (Declarations) ~3

P r i v a t e jnteno As S t r i n g |

P u b l i c Func t ion CeleJwieno (jwieno As S t r i n g , pr i j j t ieni As S t r i n g ) CeieJineno - jsoeno & " " & p r i j roen i

End Func t ion

a

P u b l i c Sub RonecPrace(} Dim wto As Workbook: For Each xab In Workbooks

wb.Close True Next App1icat i o n . Q u i t

End Sub

" '1 1 A Obr. 5.4: Kurzor se nachází v deklarační části modulu (General- Declarations)

Deklarace veřejných proměnných musí být umístěny jen ve standard-ních modulech, nikoli v modulech formulářů, modulech pro jednotlivé listy nebo v modulu This_Workbook.

Rozsah platnosti se týká i vlastních procedur a funkcí! Ty jsou impli-citně chápány jako veřejné, je tedy možné volat proceduru, která je v jiném modulu (klíčové slovo Public není nutné uvádět, VBA ho předpokládá. Sub a Public Sub mají proto stejný význam).

Pokud je z nějakých důvodů třeba vytvořit funkci nebo proceduru, kterou lze spouštět jen v rámci modulu, kde je umístěna, doplňte do hlavičky klíčové slovo Priváte. „Privátní"procedury se neobjeví v dialogovém okně Makro, je tedy takto možné i zabránit uživatelům v jejich nežádoucím spouštění.

Veřejné funkce uložené ve standardních modulech se v uživatelském rozhraní Excelu objeví v dialogovém okně Vložit funkci, a to v kate-gorii Vlastní).

Životnost proměnných

S rozsahem proměnné L i z c e souvisí i její životnost, tedy délka existence proměnné v pamě-ti. Lokální proměnné mají životnost omezenu na dobu provádění svého podprogramu. Na-opak modulové a veřejné proměnné existují po celou dobu, kdy je daný sešit otevřen.

5. Začínáme psát vlastní makra

Page 71: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 73 Je-li třeba, aby ani lokální proměnná nezanikla po ukončeni podprogramu, ve kterém je použita, musí se uvnitř procedury deklarovat příkazem S ta t i c , případně můžete příkaz S t a t i c přidat do hlavičky procedury, a pak budou všechny lokální proměnné deklaro-vány jako statické.

' deklarace s t a t i c k é proměnné S t a t i c Sc i t ac As In teger ' všechny l o k á l n í proměnné jsou s t a t i c k é Publ ic S t a t i c Sub Vypočet()

Statické proměnné se používají např. jako počitadla, když chcete kontrolovat, kolikrát byla daná procedura spuštěna. Při každém spuštění zvýšíte hodnotu počitadla o jedničku:

Sub NejakaProcedura() S t a t i c poč i t ad lo as Long poč i t ad lo = poč i t ad lo + 1

End Sub

5 . 1 2 Deklarace proměnných Deklarací rozumíme určení jména, typu a platnosti proměnné ještě předtím, než tuto proměn-nou v kódu použijeme (já vím, už to čtete potřetí - alespoň si to lépe zapamatujete...). Ve VBA (na rozdíl od jiných programovacích jazyků) nemusíte deklarovat lokální proměnné. V takovém případě se však vystavujete několika problémům:

S Pokud není proměnná deklarována, je jí při pivním použití automaticky přiřazen typ Variant . To znamená vyšší spotřebu místa v operační paměti (o tom jsme už mluvili; podívejte se do tabulky s přehledem datových typů).

V Kdykoli uděláte při zápisu jména proměnné chybu, vznikne nová proměnná, což se pak odrazí v podivném nebo zcela chybném chování programu.

-Z Nemůžete použít některé pomůcky VBA, konkrétně automatické dokončování názvů proměnných.

Proto je také mnohem výhodnější změnit nastavení editoru VBA tak, aby si deklaraci lokálních proměnných vynutil. Toto vynucení zajistíte zapnutím volby Require Variable Declaration, kterou najdete v okně možností (Tools —> Options) na kartě Editor. Při zapnutí volby se do deklarační části všech nových modulů přidá příslušný příkaz Option E x p l i c i t . (Do již vytvořených modulů musíte tento příkaz přidat sami.)

Vlastní deklaraci proměnné zajistí příkaz Dim, případně Pr ivá te nebo Public. Kdy se kteiý z nich použije, bylo popsáno v části „Rozsah platnosti a životnost".

Dim jméno_proměnné [As typ_proměnné]

Jakmile uvidíte v popisu nějakého pňkazu, funkce nebo metody nějaký text v hranatých závorkách, znamená to, že tato část není povinná! U de-klarace tedy typ proměnné zadávat nemusíte, jméno pochopitelně ano.

Připomínám, že jméno proměnné nesmí být delší než 255 znaků, musí začínat písmenem a nesmí uvnitř obsahovat mezeru nebo znaky $, #, &, %.

1111 5 . 1 2 Deklarace proměnných

Page 72: 00-vba1 - Kopie

7 4 E X C E L 2 0 0 0 - 2 0 0 7

Nepovinná část deklarace umožňuje určit datový typ proměnné (As Integer, As Currency apod.). Je-li vynechána, proměnné je přiřazen typ Variant .

V jednom řádku je možné uvést více deklarací, navzájem oddělených čárkou. Pozor ovšem na to, že pokud chcete zadat jiný typ než výchozí Variant, musíte ho uvést u každé pro-měnné!

' obě proměnné jsou typu In teger Dim i As I n t e g e r , j As In teger ' obecný typ Var iant u obou proměnných Dim han, kan ' typ S t r ing (textový ře tězec) Dim klaun As S t r i ng ' první j e Var ian t , druhá In teger ! Dim i , j As In teger

Mimoto je možné deklarovat proměnné pomocí typové přípony, která se připojí na konec jména proměnné (pak ovšem nesmíte zadávat typ pomocí klíčového slova As):

Typ Typová přípona Typ Typová přípona Integer % Double #

Long & Currency @

Single i String $

1 první proměnná bude typu S t r ing , druhá In teger Dim vycet$, cislo%

Typové přípony se používají především u konstant. U proměnných jsou dnes již chápány jako zastaralý způsob, a navíc nejsou k dispozici pro všechny datové typy.

' vyvolá chybu p ř i kompilaci MsgBox jmeno& " " & př í jmení

Deklarace konstant a jejich t y p

Vlastní konstanty je vždy nutné deklarovat (jak jinak by překladač poznal, že něco chcete používat jako konstantu?). Deklarace symbolických (vlastních) konstant se nijak zásadně neliší od deklarace proměnných, jen se tu namísto příkazu Dim používá příkaz Const.

V příkazu Const určujete jméno konstanty a za rovnítkem uvedete hodnotu, kterou bude konstanta představovat:

Const pozdrav = "Nazdar!" ' deklarace ve ře jné konstanty Public Const poce t_s t r an = 10

Existence typových přípon je příčinou toho, že pn psaní kódu nesmíte zapsat spojovací operátor & (znak ampersand) za název proměnné nebo číslo bez mezery, protože překladač bude tento znak v tomto případě považovat za typovou příponu!

5. Začínáme psát vlastní makra

Page 73: 00-vba1 - Kopie

Odlišné je však určeni datového typu, jak už jsme si řekli. Když sami nezadáte datový typ, použije překladač ten, který nejlépe vyhovuje výrazu vpravo od rovnítka.

' překladač p ř i ř a d í konstantě typ Double Const PI = 3.1415 1 t a t o konstanta bude typu In teger Const poce t_s t r an = 3

Pokud byste chtěli datový typ explicitně určit, musíte ho přidat před rovnítko:

Const poce t_s t ran As Long = 3

5 . 1 3 Praktické ukázky deklarací proměnných, jejich platností a životnosti

Výklad předchozích dvou částí nyní procvičíme na několika jednoduchých příkladech.

Kód v této části předpokládá, že nemáte zapnutou volbu Require Variable Declaration, pokucl není řečeno jinak.

Platnost proměnných

Vytvořte v prázdném modulu dvě procedury s názvy První a Druha (názvy si pochopi-telně můžete upravit):

Public Sub Prvni() Dim jméno As S t r ing jméno = "Helena Obříkové" Druha

End Sub

Public Sub Druha() MsgBox jméno

End Sub

Obr. 5.5: Proměnná je prázdná

Na konci procedury Prvni voláme proceduru Druha, ve které se pokusíme vestavěným příkazem MsgBox zobrazit obsah proměnné jméno. Jak spustíte proceduru Prvni? Bud napíšete její název do okna Immediate a stisknete ENTER, nebo umístíte kurzor do někte-rého řádku této procedury přímo v modulu a stisknete klávesu F5.

Okno hlášení, které zobrazí příkaz MsgBox, bude prázdné, protože jméno je deklarováno jako lokální proměnná v proceduře Prvni, a proto v proceduře Druha neplatí. Vzhledem k tomu, že lokální proměnné se deklarovat nemusí, je v proceduře Druha vytvořena další lokální proměnná jméno, která je však prázdná, protože jsme do ní nic nepřiřadili.

Nyní tento příklad upravíme a použijeme modulovou proměnnou. Deklaraci Dim jmenoAs S t r ing vyberte, přesuňte ji do schránky (CTRL+X), V levém rozvíracím seznamu u horního

Page 74: 00-vba1 - Kopie

okraje modulu vyberte General, v pravém Declara t ions , a nakonec vložte deklaraci ze schránky (CTRL+V). Modul kódu nyní vypadá takto:

Dim jméno As S t r ing

Publ ic Sub Prvni() jméno = "Helena Obříková" Druha

End Sub

Publ ic Sub Druha() MsgBox jméno

End Sub

Když nyní znovu spustíte proceduru Prvni, zobrazí se v okně hlášeni zadané jméno. Zkuste poté ještě spustit samostatně proceduru Druha - jméno se opět zobrazí. Modu-lová proměnná je po své inicializaci (zadáni první hodnoty) k dispozici neustále (až do uzavřeni sešitu).

Na druhém příkladu si ukážeme globální proměnnou a konstantu. Do modulu s předchozím příkladem přidejte tuto deklaraci:

Publ ic Const koeficient = 1.5 ' s tečkou, ne čárkou! Publ ic zaklad As Long

Dále v nabídce Tools vyberte položku Options a na kartě Editor zapněte volbu Require Va-riable Declaration (pokud jste to ještě neudělali). Poté vytvořte nový modul a do něj vložte tuto proceduru, ve které poprvé použijete již zmíněnou pomocnou metodu Debug.

P r i n t :

Publ ic Sub Globalni() zaklad = 100 Debug. P r in t zaklad * koeficient

End Sub

Tuto proceduru spusťte. Do okna Immediate bude zapsáno číslo 150. Proměnná zaklad je globální, protože je deklarována příkazem Public, a proto se její deklarace může nacházet v jiném modulu. Lokální proměnná to být nemůže, protože po zapnutí volby Require Variable Declaration byl do nového modulu vložen příkaz Option Exp l i c i t , a ten nedovolí použít lokální proměnnou bez deklarace. Schválně si do modulu s procedurou Globalni zkuste přidat ještě tuto proceduru:

Publ ic Sub LokalniPromennaBezDeklarace() a = 5 b = 10

Debug.Print a + b End Sub

Při pokusu o spuštění této procedury ohlásí překladač chybu „Variable not definedčili nedeklarovanou proměnnou.

Statické proměnné

V posledním příkladu si ukážeme, jak fungují statické proměnné. V libovolném modulu vytvořte tuto proceduru:

Page 75: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 77 Pub l i c Sub Stat ickaPromenna()

S t a t i c p o č i t a d l o As Long p o č i t a d l o = p o č i t a d l o + 1 Debug.Pr in t p o č i t a d l o

End Sub

Zkuste tuto proceduru spustit několikrát po sobě a uvidíte, že do okna Immediate se vždy vypíše hodnota o jedničku vyšší. Poté klíčové slovo S t a t i c nahraďte klíčovým slovem Dim a znovu několikrát po sobě spusťte proceduru. Tentokrát bude do okna Immediate vypsáno vždy číslo 1, protože nestatické lokální proměnné jsou po dokončení procedury „zahozeny" a jejich hodnota zaniká.

5 . 1 4 Způsoby zápisu hodnot do proměnné V této části kapitoly se podíváme na velmi důležitou věc, totiž na všechny možné způsoby, jak uložit (přiřadit) do proměnné nějakou hodnotu.

T e x t o v é údaje

Textové údaje zadávané „natvrdo" v kódu (tzv. literály) se do proměnné vkládají uzavřené do Livozovek. Naopak text, který je zapsán třeba v buňce nebo na popiskLi ve formuláři, si do proměnné uložíte přímo odkazem na příslušnou vlastnost.

jméno = "Fran ta" p r i j m e n i = "Novák" pobočka = Ac t iveCe l l .Va lue

Pro spojování několika textových řetězců používejte zásadně jen operátor & (ampersand), nikoli operátor +:

c lovek = jméno & " " & p r i j m e n i

V proměnné clovek bude uložen text Franta Novák, který vznikne spojením proměnných jméno a p r i jmen i , mezi něž je doplněna mezera (zadaná jako mezera v uvozovkách).

Operátor & používejte i pro spojení řetězce s jiným typem Lidaje: 1 výs ledek "Na 1 .mí s t ě " p o r a d i = 1 t i t u l e k = "Na " & porad i & " . mí s t ě"

Pokud je nutné uvnitř textového řetězce vyjádřit uvozovky, používá se funkce Chr, která vrací znak, jehož číslo ASCII zadáte jako parametr. Pro uvozovky vypadá volání funkce takto: Chr(34).

název = "Obchody firmy " & Chr (34) & "Tesco" & Chr (34)

V tomto případě jde o „rouně" uvozovky, v českém prostředí se však mají používat uvozovky „oblé". Ty získáte voláním Chr(0132) a Chr(014 7).

Pro vkládání dalších speciálních znaků (konec řádku, tabulátor) do textových řetězců můžete používat bud funkci Chr nebo - což je lepší - vestavěné konstanty VBA.

zápisu hodnot do proměnné ÉI8

Page 76: 00-vba1 - Kopie

' t a b u l á t o r nadpis = "První sloupec" & vbTab & "Druhý sloupec" nadpis = "První sloupec" & Chr(9) & "Druhý sloupec" 'konec řádku nadpis = "Text v prvním řádku" & vbCrLf & "Text ve druhém řádku"

Číselné údaje

Číselné hodnoty proměnných se zapisuji bez uvozovek, přímo. U desetinných čísel je nutné i v českém národním prostředí používat desetinnou tečku, nikoli čárku!

n = 200 ' p ř i ř a z e n í celého č í s l a n = 55.15 ' p ř i ř a z e n í deset inného č í s l a

Pokud však do proměnné nepřiřazujete hodnotu přímo, ale odkážete se např. na desetinné číslo zapsané v buňce listu, bude se VBA řídit místním nastavením Windows, a desetinný oddělovač (v českém prostředí čárku) přečte správně. To samé platí i v případě, kdy číslo zadáváte jako textovou hodnotu, tedy uzavřené do uvozovek.

Dim x As Double x = "12,35" ' v pořádku!

x = "12.35" ' vyvolá chybu za běhu programu

Datum a čas

Datum nebo čas se zapisují různým způsobem. Jestliže jste zvyklí na český formát, řadící jednotlivé části do posloupnosti den-měsíc-rok, uzavírejte hodnoty do uvozovek. U ang-lického formátu měsíc-den-rok je nutné namísto uvozovek použít znak #. Pro zápis data a času se také využívají převodní funkce. Jestliže datum zapisujete v uvozovkách, můžete použít všechny tvary, které Excel nabízí pro zápis kalendářního data do buněk (ovšem pozor - proměnná musí být deklarována jako typ Date, případně uložený řetězec převedete na datum funkcí CDate): Dim počátek As Date 1 anglický formát zápisu počátek - #4/25/2007# ' datum 24. 5. 2007 ' český zápis pomocí uvozovek s tečkami počátek = "24.5.2007" ' český zápis pomocí lomítek počátek = "24/5/2007" 1 český zápis pomocí pomlček počátek = "24-5-07" počátek = DateSería l (2007, 5, 24) ' datum 24. 5. 2007 cas = "11:35" ' zápis časového údaje (11 h 35 m) Proměnné typu Date zobrazují datum podle krátkého formátu data nastaveného ve vašem systému. Čas se bude zobrazovat také podle formátu času nastaveného v systému (bud 12 nebo 24hodinový systém). Tato systémová nastavení můžete změnit pomocí dialogového okna Místní nastavení v Ovládacích panelech Windows.

Logické údaje

Do logických proměnných můžete hodnotu Ano/Ne uložit bud přímým přiřazením, nebo vyhodnocením nějakého výrazu.

Page 77: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 79 Dim hotovo as Boolean, zisk_dosazen As Boolean hotovo = True zisk_dosazen = naklady < t r zby

5 . 1 5 Další poznámky k datovým typům

D a t o v ý t y p V a r i a n t

Tento datový typ může obsahovat jakékoli údaje - text, číslo, datum, čas, logickoLi hodnotu, odkaz na objekt. Navíc má tento typ definovány ještě speciální hodnoty Empty, Error, Nothing a Null, se kterými se u jiných typů nesetkáte.

HodnotLi Empty má každá deklarovaná proměnná typu Variant , do níž ještě nebyla při-řazena žádná hodnota. Pro ověření tohoto faktu použijte funkci IsEmpty:

Dim pokus ' n e u r č i t e - l i typ, j e použ i t Variant Debug.Print IsEmpty(pokus) 1 vypsána bude hodnota True pokus = "bia b ia b ia" 1 p ř i ř a z e n í hodnoty Debug.Print IsEmpty(pokus) 1 x bude mít hodnotu Falše

Hodnota Null se využívá pro vyjádření neznámých nebo chybějících dat (hlavně v data-bázích) a vyznačuje se určitými specifickými vlastnostmi, na jejichž rozbor tu bohužel není místo. Hodnotu Null lze do proměnné přiřadit přímým zápisem.

Z = Null

Pro testování obsahu proměnné typu Variant na hodnotu Null musíte použít funkci IsNull . Pozor, hodnotu Null není možné vkládat do běžného porovnávacího výrazu!

If Null = nejaka_promenna Then 1 výraz j e VŽDY neplatný! If IsNull(nejaka_promenna) Then ! t ak to j e to správně!

D a t o v ý t y p String

Tento typ proměnné používáme pro textové hodnoty. Může být deklarován bud s pro-měnlivou, nebo s fixní (pevnou) délkou:

Dim Ostrov As S t r ing 1 proměnlivá délka Dim Zachrance As S t r i ng * 20 ' pevná délka 20 znaků

V pivním případě se délka proměnné může měnit, ve druhém nikoli. Pokusíte-li se do proměnné typu S t r ing s fixní délkoLi přiřadit delší řetězec, bude zkrácen na patřičnou délku. Naopak při přiřazení kratšího řetězce se zbylá místa v proměnné doplní mezerami. K odstranění těchto mezer lze v kódu využít funkce Trim, LTrim a RTrim.

Pro běžnou práci jsou lepší řetězce s proměnlivou délkou, protože lépe využívají paměť počítače. Pevná délka je vhodná jen ve speciálních případech, popř. při práci s API funk-cemi (což není tématem této knihy).

Logický t y p Boolean

Logické hodnoty True a Falše ¡SOLI odvozeny z číselného typu In teger , a lze je tedy poLižívat i v číselných výrazech. Logická pravda (True) má číselnori hodnotu minus 1, ne-

poznámky k datovým typům WSm

Page 78: 00-vba1 - Kopie

pravda (Falše) hodnotu 0. Pokud je logické proměnné přiřazeno jakékoli nenulové číslo, zkonvertuje se na True. Počáteční hodnota proměnné typu Boolean je vždy Falše.

Dim x As Boolean x = 6 Debug.Print x ' vypsáno bude True

P ř e v o d y mezi jednotlivými t y p y hodnot

VBA disponuje množstvím funkcí pro vynucený (explicitní) převod hodnoty proměnné jednoho typu na typ jiný. U datového typu Variant zabezpečuje sám jazyk i tzv. auto-matické konverze, které se sice někdy hodí, ale někdy mohou být i velmi nebezpečné. S automatickými převody se však setkáte i v mnoha dalších situacích, ukázku jsme viděli před chvílí:

' automatický převod tex tu na č í s l o Dim x As Double x = "12,35"

Většina převodních funkcí začíná písmenem „C", např. CByte, CCur, CDate, CDec, CDbl, CInt, CLng, CSng, CStr. Za písmenem „C" následuje zkrácené označení datového typu, na který je zadaná hodnota převedena. Sami tedy odhadnete, že funkce CInt převede zadaný výraz či proměnnou na číslo typu Integer , funkce CLng zase na číslo typu Long.

Dim c e l e c i s l o As Long, c i s l o As Double c i s l o = 12.25 c e l e c i s l o = CLng(cislo)

Z dalších převodních funkcí uvedu alespoň funkce Str (převod na řetězec) a Val (převod na číslo), u kteiých je však třeba dávat pozor na oddělovač desetinných čísel - obě funkce dokážou rozpoznat jako oddělovač pouze tečku. Proto si spise navykněte na funkce CStr (převod na řetězec), případně CSng nebo CDbl (převod na číslo typu Single či Double).

Podrobný popis všech funkcí najdete v nápovědě.

5 . 1 6 Pole proměnných Pole proměnných (array) je skupina prvků stejného datového typu, které mají stejný název, přičemž na konkrétní prvek pole se odkazujete pomocí názvu pole a čísla indexu. Vytvořit můžete např. pole šesti řetězcových proměnných, kde každá proměnná odpoví-dá názvu jedné pobočky vašeho podniku. Když toto pole pojmenujete Pobočky, budete odkazovat na první prvek tohoto pole zápisem Pobocky(O), na druhý prvek zápisem Pobocky(l) a na poslední Pobocky(5).

Praktické použití vyplývá již z definice - všechny hodnoty, které spolu nějakým způsobem souvisí a tvoří jednu skupinu, je možné zpracovávat pomocí polí. Výhodou je např. snadná manipulace se všemi prvky pole v tzv. cyklech.

Každé pole musí být deklarováno příkazem Dim nebo Public. Pro rozsah pole platí stejná pravidla jako pro rozsah proměnné.

VBA dovoluje používat dva základní druhy polí:

V Statická - počet prvků pole je určen předem a nelze ho měnit.

S Dynamická - počet prvků pole lze měnit za běhu programu.

5. Začínáme psát vlastní mal 391

Page 79: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Pole proměnných s řetězcovými indexy (tzv. asociativní pole) ve VBA neexistuje, namísto něj se používají vlastní kolekce.

Statická pole

Při deklaraci statických poli se udává v závorkách velikost pole (rozsah indexů pole):

Dim Osoba(15) 1 indexy jsou v rozmezí 0 až 15 Dim Pro jek t (20) ' indexy jsou v rozsahu 0 až 20 Dim Udrzba(l To 20) ' indexy jsou v rozsahu 1 až 20 Dim Teplo (-100 To 100) ' indexy jsou v rozsahu - 100 až 100

VBA má implicitně nastaven dolní index polí na nulu. Nechcete-li začínat od nuly, musíte bud zadat rozsah indexů pomocí klauzule To (jako ve třetím či čtvrtém případě), nebo v deklarační sekci modulu použít příkaz Option Base 1; ten nastaví implicitní dolní index na jedničku. Deklarujete-li pole pomocí klauzule To, může být index i záporný.

Povolené rozmezí indexů je od -231 do 231 (datový typ Long).

Dynamická pole

U dynamických polí se při deklaraci neuvádí velikost:

Dim DynamickePole()

Takto deklarované pole však nelze hned používat, je nutné příkazem Re Dim vymezit konkrétní rozsah indexů. U příkazu Re Dim lze zadat rozsah i prostřednictvím nějaké již známé proměnné.

ReDim DynamickePole(1 To 100) ReDim DynamickePole(zacatek To konec)

Příkaz ReDim lze zavolat kdykoli (avšak jen v podprogramu, nikoli v deklarační části - jde o výkonný příkaz!), rozsah indexů lze měnit vícekrát, podle potřeby.

Při každém použití příkazu ReDim se všechny proměnné v poli nastaví na hodnotu Empty (popř. nula nebo prázdný řetězec). Chcete-li, aby hodnoty proměnných zůstaly zachovány, musíte použít klauzuli Preserve:

ReDim Preserve DynamickePole (60)

V takovém případě však můžete měnit jen horní hranici posledního rozměru pole, jinak dojde k chybě za běhu programu.

Vícerozměrné pole

Pole mohou mít více dimenzí - lze tedy používat dvojrozměrné či vícerozměrné pole. Deklarace takového pole pak může vypadat takto:

Dim ViceRozmeru(-20 To 20, 1 To 15, 1 To 30)

a v kódu by pak odkaz na prvek tohoto pole mohl být: ViceRozmeru(10, 10, 28).

Page 80: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Přiřazení hodnoty do prvku pole

Nejde o nic složitého, na konkrétní prvek pole odkážete názvem pole a uvedením indexu pivku:

Udrzba(4) = "Horák"

Pro naplněni všech prvků pole hodnotami se většinou používají cykly, ve kterých můžete horní i dolní hranici rozsahu pole testovat funkcemi LBound (nejnižší index pivku pole) a UBound (nejvyšší index prvku pole).

For i = LBound(Udrzba) To UBound(Udrzba) Udrzba(i) = nějaká_hodnota

Next i

Pole proměnných v proměnné typu Variant - funkce Array

V některých případech lze vytvořit proměnnou typu Variant a do ní umístit pole. Přístup k jednotlivým prvkům pole je pak stejný jako u běžných polí.

Pro naplnění takových proměnných lze velmi dobře využít funkci Array, která vrací zadané argumenty jako pole proměnných. K testování, zda se v proměnné typu Variant nachází pole proměnných, lze využít funkci IsArray.

Dim hodnoty, jména hodnoty = Array(10,20,30,40,50,60) ' naplnění pole jména = Array("Pavel Karas", " J i ř í Pechár", " J i ř í Novotný") Debug.Print hodnoty(0) ' zobrazí 10

5 . 1 7 Parametry a jejich druhy Parametr představuje v programovacím jazyku konstanta, proměnná nebo výraz, který je předáván do procedury nebo funkce. U parametrů mohou rovněž být určeny jejich datové typy.

Obecně si můžeme uvést všechny možné situace, které vás mohou v souvislosti s para-metry potkat:

S Procedura (funkce) nemusí vyžadovat žádné parametry.

S Procedura může přebírat pevně stanovený počet parametrů.

V Procedura může přebírat předem neurčený počet parametrů.

v' Procedura může některé parametry vyžadovat, a jiné zase mohou být nepovinné.

v Procedura může mít všechny parametry nepovinné.

Editor jazyka Visual Basic vám při psaní kódu nabízí tzv. rychlou nápovědu. Po napsání názvu příkazu nebo názvu funkce (a levé závorky za jejím názvem) se u kurzoru objeví žlutý rámeček se jmény parametrů a jejich datovým typem. Parametr, který v daném oka-mžiku máte napsat, je v rychlé nápovědě zobrazen tučně.

Slib Vypočet O d a t u m - D a t e S e r i a l c |

E n d S u b PateSerial(year As toteger, MonthAs ínteger, DayAs ínteget) [

Obr. 5.6: Rychlá nápověda se seznamem parametrů a jejich datovými typy

5. Začínáme psát

Page 81: 00-vba1 - Kopie

Jestliže je v okně rychlé nápovědy některý parametr uzavřen do hranatých závorek, zna-mená to, že je nepovinný. Pokud je parametrů více, oddělují se od sebe čárkami.

Při zadávání parametrů máte dvě základní možnosti:

V Budete přesně dodržovat pořadí parametrů, jak je dáno syntaxí konkrétního příkazu či funkce. Pokud je některý parametr nepovinný, můžete ho vynechat, musíte však za tímto vynechaným místem napsat také čárku.

V Využijete možnost zapisovat parametry „na přeskáčku", kterou nabízí tzv. pojmeno-vané parametry. Tyto parametry se vyskytují u těch procedur, které jsou definovány v objektových knihovnách, kde má každý parametr svůj přesný název. Pojmenované parametry zadáváte včetně jejich názvu, který je od vlastní hodnoty oddělen zvláštním operátorem : = (dvojtečka plus rovnítko).

Zápis s využitím pojmenovaných parametrů se hodí v těch případech, kdy vynecháváte nepovinné parametry. Pořadí pojmenovaných parametrů totiž může být libovolné:

' k l a s i cké volání funkce DateSer ia l datum = DateSerial(2007, 2, 20) 1 vo lán í funkce DateSer ia l s pojmenovanými parametry datum = DateSeria l (day:=20, month:=2, year:=2007) 1 k l a s i cké volání metody InputBox počet = Appl icat ion. InputBox("Zadej č í s l o " , , , , , , , 1 ) ' vo lán í metody InputBox s pojmenovanými parametry počet = Appl ica t ion . InputBox( type:=1, prompt:="Zadej č í s lo" )

V druhém příkazu je otočené pořadí parametrů (ve funkci DateSer ia l normálně zadá-váte postupně rok, měsíc a datum, zde je nejdříve den, rok je až na konci). Ve čtvrtém příkazu je rovněž přehozeno pořadí parametrů a většina nepovinných parametrů je prostě vynechána.

Parametry v e vlastních procedurách ci funkcích

Budete-li psát vlastní procedury či funkce, které budou provádět kód v závislosti na určitých vstupních parametrech, musíte tyto parametiy deklarovat v hlavičce procedury. K tomuto účelu jsou určeny závorky za názvem procedury či funkce:

Publ ic Sub Vypočet(koef As Double, zacatek As Date, konec As Date)

V ukázce zároveň vidíte, že u parametrů můžete určit datové typy. Pokud je nezadáte, bude použit typ Variant .

Parametry uvedené v deklarační hlavičce jsou považovány za formální. Při volání funk-ce jí totiž budete předávat skutečné parametry, jejichž názvy budou odpovídat názvům konstant či proměnných. Takže fiktivní funkci Vypočet z předchozího příkladu budete v praxi volat např. takto:

koeficient = 5.45 od = "11.1.2007" do = "15.1.2007" nejaka proměnna = Vypočet (koeficient, od, do)

V tomto případě jsou skutečnými parametry proměnné koeficient, od a do. Procedura Vypočet použije proměnnou koeficient všude tam, kde má ve svém kódu formální

5 . 1 7 Parametry a jejich druhy

Page 82: 00-vba1 - Kopie

parametr koef, proměnnou od v místech, kde zpracovává formální parametr zacatek. . . a tak dále.

Co všechno můžete předávat jako parametr? Jsou to proměnné, konstanty, pole proměn-ných, odkazy na objekty, textové řetězce. 1 p ředávání ř e t ě z c e a ves tavěné kons tan ty soubor = D i r ( " * . t x t " , vbHidden) ' p ředáván í č í s e l barva = RGB(255, 0, 0)

Předávání o d k a z e m či hodnotou

Parametry můžete proceduře předat dvěma základními způsoby: odkazem a hodnotou. Výchozí je předávání odkazem, kdy VBA předá do procedury adresu proměnné v paměti počítače. Volaná procedura pak může parametr nejen číst, ale také ho měnit. Při předávání parametru hodnotou procedura obdrží pouze kopii původní proměnné, která nemůže být volanou procedurou nijak ovlivněna.

Z toho vyplývá, že předávání hodnotou je nutné použít v těch případech, kdy uvnitř procedury provedete nějaké změny hodnoty parametru, ale po ukončení proceduiy musí parametr mít zase svou původní hodnotu.

Protože se připředávání hodnotou předává jen kopie hodnoty, nemu-síte v některých případech dodržet datový typ parametru, specifikova-ný v hlavičce volaného podprogramu. (Pokud je formální parametr deklarován jako typ Variant, provede interpretr VBA sám převod, a k žádné chybě nedojde.)

Předání parametru hodnotou zajistíte tak, že před jeho název do hlavičky procedury za-píšete ByVal:

Pub l i c Sub Přepočet(ByVal zaklad As Double)

Ukážeme si nyní pár příkladů, na kterých uvidíte možné chyby při předávání parametrů:

Sub Prvn i ( ) Dim x As Var i an t x — 50 ' v o l á n í procedury Druha, k t e r é předáme parametr x Druha x

End Sub

Sub Druha(x As In t ege r ) ' t ady by by l ně jaký kód, k t e r ý v našem p ř í k l a d u ' není pods t a tný

End Sub

V tomto případě je parametr předáván odkazem, ale protože není dodržen stanovený datový typ, skončí pokus o spuštění proceduiy Druha okamžitě chybou (viz obrázek).

y&otorné^

5. Začínáme psát

Page 83: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Microsoft Visual Basic

Compile error:

ByRef argument type mismatch

"OK ÍJ Nápověda

Upravená varianta bude parametr předávat hodnotou, a pak nebudou rozdílné datové typy na závadu:

Sub Prvni() Dim x As Var iant x — 50 Druha x

End Sub

Sub Druha(ByVal x As Integer) ' tady by byl nějaký kód, k te rý v našem př ík ladu ' není pods ta tný

End Sub

Pokud bude v proceduře Druha formální parametr x deklarován jako Variant, proběhne kód rovněž bez závad:

Sub Prvni() Dim x As In tege r x = 50 Druha x ' vo lán í proběhne bez chyby

End Sub

Sub Druha(x) ' tady by byl nějaký kód, k te rý v našem př ík ladu 1 není pods ta tný

End Sub

Některé typy proměnných nemůžete předávat hodnotou (uživatelsky definované typy - ale na ty v této knize nedojde).

Uproměnných, které zabírají více místa v paměti, trvá předání hod-notou mnohem déle. Proto byste neměli předávat hodnotou proměnné typu Variant a String.

Ve druhém díle knihy se dovíte, jak vytvořit proceduru s nepovinnými parametry a jak napsat proceduru, která může přijímat neurčitý (různý) počet parametrů.

5 . 1 8 Rozhodovací bloky V mnoha případech je nutné vykonávat v kódu různé věci v závislosti na určité podmínce. Příkladů je možné uvést mnoho, počínaje klasickou potřebou provést dvě různé operace v závislosti na hodnotě určité buňky, nebo zpracováním určitého souboru ve složce a nutností

5 . 1 8 Roz m i f t n M É i

Page 84: 00-vba1 - Kopie

vyzvat uživatele k zadáni názvu či umístěni souboru, pokud soubor nebude mít očekávané jméno nebo bude uložen jinde, než kde ho makro hledá.

Jde o jednu z nejobvyklejších situací, s nimiž se setkáte, proto si ji také pořádně objasní-me. Jakmile se kód musí větvit podle toho, zda nějaká podmínka je nebo není splněna, přicházejí ke slovu řídicí struktury, kterým se běžně říká rozhodovací bloky.

Jazyk VBA poskytuje tyto dvě řídicí struktury, I f . . .Then. . .Else a Selec t Case. Druhá z nich nabízí jednodušší zápis jednotlivých větví, proto si ji předvedeme jako pivní.

Příkaz Select Case

V tomto příkazu vyhodnotíte určitý výraz a v závislosti na jeho hodnotě poté spustíte jednu z několika možných větví kódu. Velkou výhodou příkazu Selec t Case je fakt, že u jed-notlivých větví můžete zadat několik možných hodnot nebo rozmezí výsledných hodnot výrazu.

První příklad vás uvede do syntaxe tohoto příkazu:

' procedura s 1 vstupním parametrem Public Sub Vypočet(x As In teger)

Se lec t Case x Case 0, 1, 2 ' první větev

' zde bude jedna skupina př íkazů Case 3 ' druhá větev

' zde bude d a l š í skupina př íkazů Case Else ' t ř e t í větev

1 zde bude poslední skupina př íkazů End Se lec t

End Sub

Výraz, který testujeme, píšeme do prvního řádku bloku, přímo za klíčová slova Se lec t Case. Může zde být porovnání hodnot, výpočet nebo jen proměnná, jako je tomu v tom-to případě. Proměnná x může nabývat různých hodnot, takže větví programu může být rovněž neurčitý počet.

Se lec t Case a > b 1 výraz v r a c e j í c í True nebo Falše Se lec t Case Left( jméno, 1) 1 výraz v r a c e j í c í znak Se lec t Case a 1 proměnná

Jednotlivé větve jsou uvozeny klíčovým slovem Case, za ním se nacházejí možné hodnoty testovaného výrazu (proměnné). V ukázce bude první větev vykonána pro hodnoty 0, 1 a 2, druhá větev pro hodnotu 3-

Větev Case Else bude provedena v těch případech, kdy hodnota proměnné x neodpovídá žádné jiné větvi - slova Case Else si tedy přeložte do češtiny jako „ve všech ostatních případech". V kódu ji uvádět nemusíte, je nepovinná.

Konkrétní počet bloků Case závisí samozřejmě na konkrétní situaci. Navíc je možné hod-noty výrazu zadávat v určitém rozsahu či skupině:

' pro hodnoty v rozsahu 1 až 14 Case 7 To 14

1 pro textové hodnoty ' ("Dveře" vyhovuje, "E lek t ř ina" j i ž ne)

Page 85: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Case "A" To "Dz il

' p ro hodnoty v ě t š í než 20 Case I s > 20

Při porovnání typu „větší než", „ menší než" musíte použít nejen znak > (<), ale i operátor Is. Pokud ho nenapíšete, editor ho naštěstí doplní za vás.

Zkuste tedy sami analyzovat další ukázku kódu:

Pub l i c Sub Vypočet(x As I n t e g e r ) S e l e c t Case x

Case I s < 0 p rvn í vě tev ' zde bude jedna skupina p ř íkazů

Case 0, 1, 5 To 10 ' druhá vě tev 1 zde bude d a l š í skupina p ř íkazů

Case I s > 10 1 t ř e t í vě tev ' zde bude p o s l e d n í skupina p ř íkazů

End Se l ec t End Sub

Nic těžkého to nebylo, že? První větev bude provedena, pokud x bude menši než nula, druhá větev bude pro čísla 0, 1, 5, 6, 7, 8, 9 a 10, a konečně třetí pro čísla větší než 10. Jestliže proměnná x bude mít hodnotu 2, 3 nebo 4, žádný kód proveden nebude.

Ukážeme si ještě jeden příklad, kdy testovací podmínkou bude porovnávací výraz:

' dvě v s tupn í proměnné Pub l i c Sub Vypočet(x As I n t e g e r , y As In tege r )

V tomto případě testovací podmínka porovnává dvě proměnné, předané do procedury jako vstupní parametry. Porovnání může dopadnoLit jen dvojím způsobem: x bude větší než y, nebo větší nebude. Výsledkem porovnání je logická hodnota, kterou Livádím v jednotlivých

Rozhodovací blok lf. . .Then—Else

Blok I f . . .Then. . .E l se je historicky starší než Se l ec t Case. Oproti struktuře S e l e c t Case má jednu zásadní výhodu a jednu zásadní nevýhodu. Podle toho si také vždy roz-myslete, který příkaz použijete.

U příkazu I f . . .Then. . .E l se se vždy testuje, zda podmínka platí nebo neplatí. Není tu tedy možné větvení podle různých možných hodnot výrazu či proměnné - pro každou p o d m í n k L i jsou větve vždy jen dvě. Na druhé straně uvnitř jediného příkazu I f . . . Then. . . E l se můžete testovat více různých podmínek, což Se l ec t Case neumí.

S e l e c t Case x < y Case True 1 p r v n í vě tev (x < y)

' zde bude jedna skupina p ř íkazů Case Fa l še ' druhá vě tev (x >= y)

' zde bude d a l š í skupina p ř íkazů End S e l e c t

End Sub

větvích příkazu.

Page 86: 00-vba1 - Kopie

Nejjednodušší podoba tohoto příkazu má jen jediný řádek:

If ně jaký_výraz_pla t í Then něco_provedu _ [Else provedu něco_jiného]

Tato varianta otestuje nějaký výraz a je-li platný, provede určitý (jediný!) příkaz. Pokud výraz neplatí, můžete volitelně provést to, co je uvedeno v části Else.

If x > 5 Then x = 5 Else x = 0

Výjimečně (ale nezvykejte si na to) se dá i v této podobě zapsat několik příkazů za sebou pomocí dvojtečky:

If x > 5 Then x = 5: y = x * 5 Else x = 0: y = 0

Víceřádková podoba příkazu I f . . .Then. . .Else se hodí jednak v případech, kdy chcete provést v některé z větví více řádků kódu, jednak v případech, kdy potřebujete testovat více podmínek. Předchozí nepřehledný řádek je možné přepsat do této podoby:

If x > 5 Then x — 5 y = x * 5

Else x = 0 y = 0

End If

Uznejte sami, že to hned vypadá lépe. Navíc tu přibyl jen řádek End If čili uzavírací řá-dek celého rozhodovacího bloku. U víceřádkových bloků I f . . .Then. . .Else ho musíte vždy uvést.

Jestliže testujete několik podmínek, dá se celý rozhodovací blok vyjádřit tímto schéma-tem:

If nějaký_výraz Then ' když p l a t í A blok_příkazů__l ' tak provedeme B

[Elself j iný_výraz ' nebo když p l a t í C blok_příkazů_2] ' tak provedeme D

[Else j e š t ě_ j í ný_vý raz 1 ve všech o s t a tn í ch případech blok_příkazů_3] 1 provedeme E

End If

Části E l se l f a Else jsou uzavřeny v hranatých závorkách - jsou tedy nepovinné. Opět si vše vysvětlíme na několika příkladech:

If x > 5 Then ' první blok př íkazů

E l se l f x < 0 Then 1 druhý blok př íkazů

Else 1 t ř e t í blok př íkazů

End If

Toto je vlastně obdoba příkazu Selec t Case. Testujeme proměnnou x na různé hodnoty, a podle toho se provedou různé bloky kódu.

5. Začínáme psát vlastní mal 391

Page 87: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 89 Jakmile je splněna některá z uvedených podmínek, nejsou již dal-ší podmínky testovány a kód pokračuje až řádkem následujícím za řádkem End I f .

Pokud by tedy proměnná x byla větší než 5, provede se první blok příkazů a další pod-mínky už testovány nebudou. Na toto nesmíte zapomenout i v případech, kdy testujete různé výrazy:

If x > 5 Then 1 první blok př íkazů

E l se l f zacatek < konec Then ' druhý blok př íkazů

Else ' t ř e t í blok př íkazů

End If

V tomto případě bude kód probíhat takto: jestliže proměnná x bude větší než 5, provede se pivní blok a další podmínky už testovány nebudou. Pokud x bude menší nebo rovno 5, otestuje VBA druhou podmínku. Když bude splněna, provede se druhý blok příkazů a třetí bude vynechán. Jedině v případě, kdy nebude splněna ani jedna z podmínek, dojde na třetí blok příkazů.

5 . 1 9 Cykly Potřebujeme-li určitou část kódu provádět opakovaně, uděláme to nejlépe pomocí cyklu. Příkazy pro cyklus mají svou hlavičku a ukončení (podobně jako I f . . .Then. . .Else). Mezi ně se píše blok příkazů, které se budou opakovat.

Ve VBA můžete použít dva typy cyklů - u jednoho znáte počet opakování, u druhého ne. Ve druhém případě místo přesného počtu iterací (opakování) zadáváte podmínku, která se bude při každém opakování testovat - bud před, nebo po provedení bloku příkazů.

Cyklus F o r . . . N e x t

Známe-li počet požadovaných opakování, použijeme příkaz For. . .Next:

For poč í t ad lo = od To do [Step p ř í r ů s t e k _ j e - l i _ j i n ý _ n e ž _ l ] 'b lok př íkazů

Next poč í t ad lo

Jako počitadlo vystupuje pomocná proměnná, která se při každém opakování automa-ticky zvětšuje o jedničku (nezadáte-li za klauzulí Step jiný přírůstek, třeba i záporný). Příklad vypadá např. takto:

For i = 1 To počet 1 počet j e č í s e lná proměnná 1 zde budou př íkazy

Next i

Cykly je možné vnořovat, neboli v rámci jednoho cyklu můžete spouštět další cyklus.

For sloupec = 5 To 1 Step -1 For radek = 0 To 10 ' vnořený cyklus

i !

5 . 1 9 Cykly

Page 88: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

' zde bude kód, k t e r ý se bude opakovat 50 k r á t Next radek ' ukončení vnořeného cyklu

1 zde bude d a l š í kód, k t e r ý se zopakuje p ě t k r á t Next s loupec , ukončení prvního cyklu

V následujícím příkladu budou do bLiněk AI až A20 na aktivním listu zapsána kalendářní" data 1. 5. 2007 až 20. 5. 2007.

For i = 1 To 20 C e l l s ( i , 1) = Da teSer ia l (2007 , 5, i )

Next i

Velmi často se cykly For...Next používají při zpracování polí, příklad byl uveden v části 5.16.

Cyklus Do.. .While I Until

Pokud počet opakování neznáme předem a nelze ho určit ani nějakou proměnnou, po-užijeme jiné druhy cyklů. Základním je Do. . .While (Do. . .Unt i l ) , který se dá popsat následujícím způsobem:

Do {While | Until} p o d m í n k a _ _ o p a k o v á n í _ c y k l u [blok p ř íkazů] [Exi t Do] [blok p ř íkazů]

Loop nebo

[blok p ř íkazů] [Exit Do] [blok p ř íkazů]

Loop {While | Until} p o d m í n k a _ o p a k o v á n í _ c y k l u

Podmínka opakování může být uvedena bud v hlavičce (za klíčovým slovem Do), nebo na posledním ř á d k L i (za klíčovým slovem Loop). V pivním případě je podmínka testována ještě před provedením cyklu - nebude-li splněna, cyklus se neprovede vůbec. Ve druhém případě proběhne test podmínky až po provedení bloku příkazů, blok příkazů uvnitř cyklu tedy bude spLištěn minimálně jednou. Jako podmínku lze uvést jakýkoli výraz, jehož výslednou hodnotou je True či Falše .

Klíčová slova While a U n t i l stanoví, zda bude cyklus vykonán, dokud podmínka bLide platit (While), nebo naopak, dokud platit nezačne (Unti l) . Z toho vyplývá, že U n t i l = While Not (logické opaky). Následující příklad zapíše do buněk AI až A20 kalendářní data 1. 5. 2007 až 20. 5. 2007. (Dělá tedy to samé, co příklad uvedený v předchozí části 0 cyklu For. . .Next.)

1 = 1 Do While i <= 20

C e l l s ( i , 1) = Da teSer ia l (2007 , 5, i ) i - i + 1

Loop

Při využití Un t i l by stejný cyklus vypadal takto:

5. Začínáme psát vlastní mal 391

Page 89: 00-vba1 - Kopie

i = 1 Do Unt i l i > 20

Ce l l s ( i , 1) = DateSerial(2007, 5, i ) i = i + 1

Loop

Cyklus lze předčasně ukončit příkazem Exit Do. Tento příkaz je povinný, pokud v cyklu nezadáte podmínku a klauzuli While/Unti l . V takovém případě jde o nekonečný cyklus (někdy velmi užitečný); musíte jej však pomocí nějaké vnořené podmínky ukončit.

Cyklus For E a c h . . . N e x t

U kolekcí objektů a polí proměnných lze použít ještě cyklus For Each. . .Next. Tento příkaz provede nějaké činnosti se všemi členy kolekce, nezávisle na jejich počtu. Namísto počítadla, jako u příkazu For. . .Next, je tu proměnná typu Variant (nebo objektového typu), kterou používáme jako odkaz na jednoho člena kolekce:

Dim x ' nebo Dim x As Workbook For Each x In Application.Workbooks

Debug.Print x.Name Next

V tomto případě se postupně do okna Immediate vypíšou názvy právě otevřených sešitů. Pomocí proměnné x můžete pracovat s jednotlivými sešity.

Druhá ukázka je trochu praktičtější a ukazuje, jak můžete najednou uložit kopie všech otevřených sešitů:

Sub Ulozi tKopieSesi tu() For Each Seš i t In WorkBooks

Sešit.SaveCopyAs "Záloha " & Sešit.Name Next S e š i t

End Sub

5 . 2 0 Jak se spouští procedury (shrnutí) Než budeme pokračovat dále, shrneme si ještě to, co byste měli vědět o spouštění maker. Něco bude nové, něco již z předchozího výkladu znáte.

Spouštění procedur přímo v modulu

Jestliže je procedura zobrazena v okně kódu a kurzor je kdekoli „uvnitř", můžete makro spustit klávesou F5. Ekvivalent této klávesy v nabídce editoru vidíte na vedlejším obrázku. Pokud se při stisku klávesy F5 kurzor nenachází uvnitř žádné procedury, zobrazí editor své dialogové okno Makra, a zde si můžete vybrat proceduru, kterou si přejete provést.

Tento postup se nedá použít u funkcí a procedur s povinnými parametry.

Tools Add-!ns Window Run P- Run Sub/UserForm F5 1 Break a Reset ^ Design Mode

Ctrl-Break

m O

E w •a E

1 J M >

e spouští procedury (shrnutí)

Page 90: 00-vba1 - Kopie

92 E X C E L 2 0 0 0 - 2 0 0 7

Spouštění procedur z jiných procedur či funkcí

Jcle o jeden z nejběžnéjších případů, protože v praxi byste neměli psát příliš dlouhé proce-dury či funkce. Mnohem lepši je kód rozdělit tak, abyste určité pasáže nemuseli zbytečně opakovat na více místech jednoho podprogramu.

Celkem existují tři možnosti, jak z jedné procedury zavolat jinou:

S Zapište název procedury, za kterým následují případné parametry oddělené čárkami bez závorek.

V Použijte příkaz Cal l , následovaný názvem procedury a případnými parametry zapsanými v závorkách a oddělenými pomocí čárek.

v' Použijte metodu Run objektu Appl ica t ion . Tuto metodu můžete použít také pro spuštění maker uložených v jiném sešitu nebo napsaných v prastarém jazyku XLM. Metoda Run je také užitečná, potřebLijete-li spustit proceduru, jejíž název je obsažen v proměnné. Potom můžete metodě Run tuto proměnnou předat jako parametr.

Druhý způsob se v praxi moc nepoužívá, ale jeho výhodou je vyšší srozumitelnost kódu - je jasné, že jde o volání jiné procedury, a ne o volání nějakého vestavěného příkazu VBA.

' k l a s i c k é v o l á n í procedury VypocetRocnichSplatek parametr1 , parametr2 ' v o l á n í příkazem Cal l Ca l l VypocetRocnichSpla tek(parametr l , parametr2) ' v o l á n í makra v jiném s e š i t u Appl ica t ion .Run "makro.xls¡Vypočet" 1 s p u š t ě n í předem neurčeného makra procedura = InputBox("Zade j te název makra") Appl ica t ion .Run procedura

Spouštění maker z panelů nástrojů

Panely nástrojů jsoLi dnes zcela běžným rysem uživatelského rozhraní a všichni milovníci myší s nimi pracují velmi rádi. Samotné vytvoření nového tlačítka a přiřazení makra není nic složitého.

Celý text této i následující části se vztahuje k Excelu 2003 a starším verzím. V Excelu 2007 byly panely nástrojů i nabídky nahrazeny kartami, a k dispozici zůstal jediný panel Rychlý přístup. Ten se dá přizpůsobit v případě potřeby také.

Nejdříve musíte zobrazit dialogové okno pro přidání nového tlačítka do panelu nástrojů. Uděláte to tak, že na libovolném panelu nástrojů klepnete pravým tlačítkem myši a z místní nabídky vyberete příkaz Vlastní. Objeví se dialogové okno, ve kterém se přepnete na kartu Příkazy a v levém seznamu označíte kategorii Makra.

V pravém panelu pak Lividíte řádek Vlastní tlačítko. Tento řádek uchopíte myší, přesLinete ho clo některého panelu nástrojů, a jakmile se svislý kurzor dostane na místo, kam chcete tlačítko zařadit, tlačítko myši uvolníte.

5. Začínáme psát vlastní makra

Page 91: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 93

Obr. 5.6: Dialogové okno Vlastní s označenou kategorií Makra

Pro tlačítko dále musíte zadat název makra, které se pomoci něj bude spouštět, a také pří-padně upravit jeho vlastnosti - především změnit ikonu, protože výchozí žluté sluníčko vám asi vyhovovat nebude. Místo ikony je také možné zapsat určitý text, např. název makra.

Všechny tyto volby lze velmi pohodlně provést přes místní nabídku tlačítka, musíte ovšem mít stále zobrazeno dialogové okno Vlastní (jinak pravým tlačítkem myši otevřete místní nabídku pro zobrazování panelů). Jednotlivé příkazy místní nabídky pro tlačítko vidíte na obrázku a jejich význam je jasný:

Původní

Odstranit

Název: V&lastní tíačitrko

Kopírovat vzhled tlačítka

Vložit vzhled tlačítka

Původní vzhled tlačítka

Upravit vshled tlačítka...

Změnit vzhled tlačítka

• Výchozí styl

Pouze text (vždy)

Pouze text (v nabídkách)

Ikona a text

Začátek skupiny

Přiřadit hypertextový odkaz •

Přiřadit makro...

M Z

S Název - umožňuje zadat text popisku na tlačítku.

V Výchozí styl, Pouze text, Ikona a text - mění podobu tlačítka. Výchozí styl zna-mená „jen ikona".

i '-:0fÁ spouští procedury (shrnutí)

Page 92: 00-vba1 - Kopie

V Změnit vzhled tlačítka - otevře vedlejší seznam dalších možných ikon, ze kterých si můžete vybrat.

S Upravit vzhled tlačítka - pokud vám nevyhovuje žádná z vestavěných ikon, můžete si přes tento příkaz vyvolat Editor tlačítek a v něm ikonu upravit bod po bodu. V jeho střední části najdete paletu 16 barev, v dolní části jsou tlačítka pro posun celého obrázku a podobu tlačítka po dokončeni. Více není třeba vědět, protože tento editor je jednoduchý.

S Začátek skupiny - po zapnutí bude vlevo od tlačítka přidán svislý pruh jako oddělovač nové skupiny tlačítek s příbuzným významem.

v Přiřadit makro - význam je jasný. Makro si vyberete v dialogovém okně, které se po zadání tohoto příkazu zobrazí.

V Přiřadit hypertextový odkaz - netýká se sice programování, ale stojí za zmínku, že díky tomuto příkazu si můžete k tlačítku přiřadit odkaz na jiný soubor, určité místo v jiném souboru nebo na webovou stránku.

Podotýkám ještě, že dialogové okno Vlastní můžete použít i pro vytváření zcela nových panelů nástrojů a jejich úpravu. Tlačítka z panelů nástrojů lze mazat dvěma možnými způsoby - bud máte zobrazeno dialogové okno Vlastní, a pak stačí myší tlačítko uchopit, stáhnout ho někam mimo panel (nad buňky) a upustit. Nebo dialogové okno Vlastní zob-razeno není, pak je nutné nejdříve přidržet klávesu ALT a poté tlačítko stejným způsobem myší odstranit.

Spouštění maker z nabídky Excelu

Systém nabídek je jedním ze základních součástí uživatelského rozhraní a setkáte se s ním téměř ve všech aplikacích pro Windows. Přidávání nových příkazů do nabídek se nijak neliší od přidávání nových tlačítek do panelů nástrojů. (Ve starších verzích je to trochu horší, s výjimkou nabídky Nástroje.)

V dialogovém okně Vlastní stačí vybrat kategorii Makro v levém seznamu a v pravém panelu to je tentokrát řádek Vlastní položka nabídky. Tento řádek myší přetáhnete na požadované místo v nabídce a tam upustíte. Poté už zbývá jen změnit zobrazený text a přiřadit nové po-ložce makro, což provedete v místní nabídce, která vypadá stejně jako u tlačítek na panelech (a proto ji tu opakovat nebudu). Jen upozorním na možné nastavení stylu Ikona a text, takže se v nabídce vlevo od řádku objeví i obrázek, který si můžete v místní nabídce vybrat.

Spouštění maker pomocí příkazových tlačítek v listech

Jedná se o velmi vděčný způsob, hlavně pro méně zkušené uživatele. Přímo na listu jsou tlačítka, na která stačí klepnout myší, aby se provedla nějaká procedura. Výhodou je snadná přístupnost tlačítek a jejich textový popis, ze kterého uživatel rychle pozná, k čemu daný pivek slouží.

Nejdříve je nutné tlačítko do listu nakreslit. Kde ho najdete? Libovolným způsobem zobrazte panel nástrojů Formuláře, který vidíte na dalším obrázku. V tomto panelu nástrojů jsou ikony různých ovladačů, které můžete po jejich vybrání myší vykreslit přímo do listu.

Na obrázku je panel nástrojů v upravené podobě, obvykle je orientován na výšku. Pro-tože nepatří mezi standardně zobrazené panely, musíte ho nejdříve vyvolat (Zobrazit —> Panely nástrojů —> Formuláře).

5. Začínáme psát vlastní mal 391

Page 93: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

iFormuláře w x| Aa ,it LI) _J LFL ®1 -B JI fliil ž ^ Tlačítko | [ n 1 •-! 1

V Excelu 2007 tento panel nabídky není k dispozici, ale tlačítko najdete Tip v seznámit vložitelných ovládacích prvků na kartě Vývojář (příkaz Vložit v rámečku Ovládací prvky).

Myši klepněte na ikonu tlačítka a poté nakreslete (se stisknutým tlačítkem myši) někam clo volného prostoru na listu ovladač. Na tlačítku uvidíte úchyty, pomocí kterých můžete měnit jeho velikost. Protože se jedná o grafický objekt, stejně jako např. čáry nebo části grafů, můžete ho myší také přesouvat do jiných pozic.

Po nakreslení tlačítka se automaticky zobrazí dialogové okno Přiřadit makro, ve kterém vyberete požadovanou proceduru, a jste hotovi.

Pozor, nepleťte si panely nástrojů Formuláře a Ovládací prvky. Na obou jsou ikony ovladačů, které sice vypadají stejně, ale funkčně se přece jen liší. Panel nástrojů Ovládací prvky se používá při tvorbě UserForms (formulářů- jeden zpříkladů toho, že terminologieMicro-softu rozhodně není bez chyby), můžete je však umísťovat i do listů.

Jestliže jste ještě k tlačítku nepřiřadili žádné makro, bude tlačítko po klepnutí myši vybráno a můžete upravovat jeho vlastnosti, případně přepsat jeho popisek. Jakmile však makro přiřadíte, není možné pro výběr tlačítka použít levé tlačítko myši (tím spustíte makro), ale pravé. Poté je opět možné měnit vlastnosti tlačítka.

^ozorn^

Page 94: 00-vba1 - Kopie
Page 95: 00-vba1 - Kopie

Casto používané příkazy, funkce a konstrukce

V této části si představíme některé příkazy a konstrukce, které se používají velmi často. Zároveň si na praktických ukázkách procvičíte techniku psaní kódu.

6.1 Funkce pracovního listu v kódu V B A Mnoho výpočtů si můžete značně zjednodušit, využijete-li to, co nabízí sám programovací jazyk. V kódu VBA můžete například používat většinu funkcí (ale ne všechny!) pracovních listů Excelu. Jejich volání se provádí pomocí objektu WorksheetFunction. Ten obsahuje všechny funkce pro pracovní listy, které můžete volat přímo ze svého kódu VBA.

Určitý problém pro vás asi bude představovat fakt, že ve Visual Basicu musíte používat anglické názvy těchto funkcí - místo funkce SUMA to bude Sum, místo POZVYHLEDAT budete volat funkci Match atp. S tím se ovšem bohužel nedá nic dělat. Jako nápovědu pro převod českých jmen na anglická vám poradím jednoduchý prostředek - nahrajte si makro, ve kterém vložíte do buňky funkci pracovního listu, a v kódu makra uvidíte anglický název této funkce. •5 ^

unkce pracovního listu v kódu V B A i i 'Mm

Page 96: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

V kódu nemůžete používat funkce pracovních listů, které mají ekvi-valentní funkci ve VB A. Jazyk VB A např. nemůže pracovat s funkcí Excelu SQRT, protože VBA má svoji vlastní verzi této funkce - Sqr. Seznam všech použitelných funkcí najdete v nápovědě Visual Basic for Applications pod heslem „List of Worksheet Functions Available to Visual Basic" případně je získáte přímo v kódu po napsání tečky za názvem objektu WorksheetFunction. Základní přehled používání funkcí pracovních listů najdete v hesle „ Using Microsoft Excel Work-sheet Functions in Visual Basic

Takže např. sečteni několika hodnot se dá provést dvojím způsobem:

a = 10 b = 15 c = 20 1 s eč t en i t ř e c h č i š e l pomoci funkce pracovního l i s t u d = Application.WorksheetFunction.Sum(a, b, c) 1 p ros tý součet t ř ech č i š e l pomoci operátoru + d = a + b + c

Maximální hodnotu z určité oblasti buněk lze získat pomoci funkce Max:

' ob l a s t buněk j e nutné zadat jako objek t Range maximum = Application.WorksheetFunction.Max(Range("A2:B5")) A druhou n e j v y š š i hodnotu v r á t i funkce Large: druha_nejvyss i = Application.WorksheetFunction.Large(Range("a2:a8") , 2)

6.2 Vestavěné příkazy a funkce obecně Vestavěné příkazy a funkce jsou přímo součástí jazyka VBA a jsou nezávislé na objektech (zatímco metody a vlastnosti lze volat pouze na objektech). Protože vestavěných příkazů není příliš mnoho, je někdy třeba sáhnout i po jiném programovacím arzenálu, který nabízí přímo operační systém Windows.

VBA má také k dispozici celou paletu vestavěných funkcí. Mnohé z nich se podobají funk-cím pracovních listů Excelu (nebo jsou jejich ekvivalentem). Např. funkce VBA Date, která vrátí aktuální datum, je významově shodná s funkcí pracovního listu v Excelu DNES.

Kde najdete úplný přehled vestavěných příkazů a funkcí? Když v editoru VBA otevřete nápovědu a poté její obsah, hledejte knihu „ Visual Basic for Applications Language Reference Uvnitř ní najdete knihu spodobným názvem „ Visual Basic Language Reference", a ta již obsahuje seznam vestavěných pňkazů (Statements) a funkcí (Functions).

6. Často používané příka] • W W p í M

MMËÊèàÊà WÊÊÊÊSSBBSÊÊ

Page 97: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

6.3 Jak z kódu informovat uživatele - příkaz a funkce MsgBox

S příkazem MsgBox jste se již v předchozích příkladech setkali. Jeho účelem je zobrazit okno s určitým textem, který si uživatel přečte a poté okno hlášeni uzavře. Příkaz MsgBox můžete používat také při laděni aplikace (ale není to moc pohodlné řešení).

Funkce MsgBox se od příkazu liší tím, že vrací hodnotu, která udává, kterým tlačítkem uži-vatel okno uzavřel. (Zatím jste viděli jen okno hlášení s jedním tlačítkem, ale celkem mohou být až čtyři.) V tomto případě se již MsgBox dá použít i pro řízení průběhu kódu:

Můžete např. uživatele upozornit na neočekávanou nebo scházející vstupní hodnotu a požádat ho, aby určil, zda má makro předčasně skončit, vynechat část operace, nebo zda hodnotu zadá uživatel sám.

Je možné se uživatele dotázat, zda chce nebo nechce provést nějakou nepovinnou operaci (např. tisk sestavy).

Obecně lze funkci MsgBox použít ve všech případech, kdy chcete, aby uživatel stanovil, co se bude dále dít. Tento výběr dalšího směrování kódu uživatel provádí stiskem tlačítka. Funkce MsgBox nabízí tyto kombinace tlačítek:

v' OK

S OK, Storno

y Ano, Ne

V Ano, Ne, Storno

v Přerušit, Opakovat, Přeskočit

S Opakovat, Storno

Chcete-li během provádění kódu pouze sdělit uživateli nějaké infor-mace, můžete je pomocí vlastnosti Application. StatusBar vypsat do stavového řádku Excelu. Nevýhodou je fakt, že text ve stavovém řádku sleduje jen málokdo.

Další možnost představuje vlastní formulář s hlášením, který se po určité době sám zavře. Formulářům je věnována samostatná kapitola v druhém dílu knihy.

Funkce MsgBox má celkem pět parametrů, z toho jen jeden povinný:

MsgBox(prompt [, bu t t ons ] [ , t i t l e ] [ , HelpFile, Context ])

V následující tabulce je popsán význam všech parametrů:

Parametr Význam prompt (povinný) Zpráva zobrazená v okně hlášení (textový řetězec). but tons (volitelný) Jedna či více vestavěných konstant, které stanoví druh a počet

tlačítek v okně, doplňkové ikony a chování okna hlášení.

Page 98: 00-vba1 - Kopie

100 E X C E L 2 0 0 0 - 2 0 0 7

Parametr Význam t i t l e (volitelný) Text v titulkovém pruhu. Nezadáte-li ho, je použit standardní

text Microsoft Excel. HelpFile (volitelný) Název souboru nápovědy, který je přidružen oknu hlášení

(v této knize se uvedená problematika neprobírá). Zadává se spolu s následujícím parametrem.

Context (volitelný) Identifikátor kontextového tématu nápovědy.

V základním tvaru vypadá voláni příkazu takto:

MsgBox "Nelze vypočí ta t"

Nelze vypočítat

C I I l l I Z l

Kromě záhlaví okna můžete ovlivnit p o d o b L i okna ještě vhodnou volbou parametru but -tons. Vestavěné konstanty, které vám při zápisu příkazu budou nabídnuty, umožňuji do okna hlášení přidat barevnou ikonu nebo určit, jaká tlačítka se v okně objeví (to má ale vyznám jen u funkce MsgBox). Jednotlivé konstanty lze v tomto parametru sčítat - což je nLitné např. v případě, kdy chcete v okně zobrazit ikonu, a zároveň přidat další tlačítka. V následujícím řádku je vyvoláno okno hlášení s ikonou Stop a vlastním titulkem:

MsgBox "Nelze vypočí ta t" , v b C r i t i c a l , "Přehled za rok 2007"

Alespoň stručně si vysvětlíme základní vestavěné konstanty, které se mohou objevit v pa-rametru buttons:

Skupina konstant Hodnoty a význam Tlačítka v okně hlášení vbOKOnly, vbOKCancel, v b A b o r t R e t r y l g n o r e , vb-

YesNoCancel, vbYesNo, vbRetryCancel

Kombinují tlačítka OK, Ne (No), Storno (Cancel), Přerušit (Abort), Opakovat (Retry), Ignorovat (Ignore). Například funkce MsgBox ("Makro nemůže zapsat údaje" , vbAbortRetrylgnore) zobrazí toto okno hlášení:

Tlačítka v okně hlášení

í Microsoft Excel

Tlačítka v okně hlášení

Makro nemůže zapsat údaje

j| Přerušit jj Opakovat | Přeskočit j

Tlačítka v okně hlášení

6. Často používané příkazy, (ui

Page 99: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Skupina konstant Hodnoty a význam Zobrazeni ikony v okně hlášeni

Možné hodnoty jsou: vbCrit ical , vbExclamation, vblnfor-mation, vbQuestion. Odpovídající ikony vidíte na obrázku.

Q v v Výchozí tlačítko Jestliže pomocí pivní skupiny konstant zobrazíte v okně hlá-

šení více tlačítek, pak můžete také určit, které z nich bude nastaveno jako výchozí (a uživatel ho tedy bude moci stisk-nout přímo klávesou ENTER). Možné hodnoty jsou vbDefaul-tButtonl až vbDefaultButton4.

Např. následující kód:

t ex t = "Operaci nelze p rovés t . " odp = MsgBox(text, vbRetryCancel+ _ vbDefaultButton2)

zobrazí okno hlášení, kde uživatel může stiskem klávesy ENTER

přímo operaci zrušit (fokus je umístěn na druhém tlačítku).

Operací nelze provést ,

O p a k o v a t I j Sto

Vliv na jiné spuštěné aplikace

Pomocí konstanty vbSystemModal můžete zobrazit okno hlá-šení jako „systémově modálnf. Okno se zobrazí i v okamžiku, kdy uživatel bude momentálně pracovat v jiné aplikaci. Teprve po jeho uzavření bude možné pokračovat v práci.

Konstanta vbApplicationModal určuje modalitu na úrovni aplikace: až do uzavření okna hlášení nebude moci uživatel dál pracovat v Excelu, jiné aplikace blokovány nebudou. Konstanta vbApplicationModal je výchozí, má hodnotu 0, a proto ji není nutné zadávat.

Nápověda Konstantou vbMsgBoxHelpButton přidáte do okna hlášení tlačítko nápovědy. V tomto případě je však nutné zadat i pa rametry helpf i l e a context.

Návratová hodnota funkce MsgBox určuje, které tlačítko uživatel zvolil. Každé tlačítko má přiřazenu svou konstantu, kterou funkce vrátí po jeho stisku. Možné návratové hodnoty jsou vbOK, vbYes, vbNo, vbCancel, vbRetry, vblgnore a vbAbort. V praxi tedy můžete např. větvit průběh makra podle toho, co si uživatel vybere:

If vbYes = MsgBox("Vytvořit tabulku pro nový měsic?", vbYesNo) Then f zde bude kód pro vytvořeni tabulky

End If V okně hlášení budou dvě tlačítka (Ano a Ne) určená konstantou vbYesNo. Pokud uživatel stiskne Ano, vrátí funkce konstantu vbYes, podmínka bloku If bude platit, a bude tedy proveden kód uvnitř rozhodovacího bloku.

Page 100: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3 ••••••••••• Závěrečná ukázka předvádí okno hlášeni s určenou ikonou a více tlačítky:

Odpoved = MsgBox("Chcete pokračovat?", vbYesNo + vbQuestion + vbDefaultButton2)

If Odpoved = vbNo Then Exit Sub

V tomto případě sečteme tři konstanty - pivní určuje tlačítka Ano a Ne, druhá určuje ikonu otazníku a třetí nastavuje jako výchozí druhé tlačítko. PodobLi okna hlášení vidíte na vedlejším obrázku.

Jestliže uživatel v tomto okně klepne na tlačítko Ne, vrátí funkce MsgBox hodnotu vbNo a kód by poté pokračoval příkazem Exit Sub, čili předčasným ukončením procedury.

j Chcete pokračovat?

Ano n Ne

6.4 Zadávání hodnot - funkce a metoda InputBox Funkce i metoda InputBox představují standardní způsob, jak uživatele Excelu požádat 0 zadání nějaké hodnoty, kterou makro vyžaduje pro svou činnost. Tak např. makro, které projde určitou oblast buněk a vynásobí jejich hodnoty určitým koeficientem, může tento koeficient získat z nějaké jiné buňky, kam ho uživatel zapíše, nebo uživatele vyzve, aby pří-slušnou hodnotu zapsal do dialogového okna InputBox. Až se naučíte clobře programovat, budete takový problém řešit zásadně pomocí formulářů.

Základní rozdíl mezi funkcí a metodou InputBox spočívá v tom, že metoda InputBox si dokáže vymítit typ zadávané hodnoty (parametr type). Možné hodnoty tohoto parametru najdete v nápovědě. Zbývá ještě dodat, že metodu InputBox spouštíte vždy na objektu Application. Až na poslední parametr type u metody InputBox je jejich syntaxe shodná, 1 když se liší názvy některých parametrů:

InputBox(prompt [, t i t l e ] [, de fau l t ] [, xpos] [, ypos] [ f helpfile] [, helpcontext id] [, type])

Application.InputBox(prompt [, t i t l e ] [, de fau l t ] [, l e f t ] [, top] [, h e l p f i l e ] [, helpcontext id] [, type])

Parametr Význam prompt (povinný) Zpráva zobrazená v okně hlášení (textový řetězec). t i t l e (volitelný) Titulek okna. Pokud ho nezadáte, bude použit standardní

text „Microsoft Excel". de fau l t (volitelný) Výchozí hodnota, která bude v dialogu zobrazena ihned

po jeho otevření a vybrána do bloku, aby ji uživatel mohl přímo přepsat.

l e f t , top (volitelné) Určují pozici okna InputBox. U funkce InputBox se tyto parametry jmenují xpos, ypos.

Page 101: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Parametr Význam he lp f i l e ,he lpcon tex t id (volitelné)

Název souboru nápovědy a identifikátor příslušného hesla.

type (volitelný) Jen u metody InputBox. Definuje typ zadané hodnoty, který musí být dodržen. Možné hodnoty jsou:

-Z 0 (vzorec)

S 1 (číslo)

S 2 (text; výchozí hodnota parametru)

S 4 (logická hodnota True nebo Falše)

S 8 (odkaz na buňku ve formě objektu Range)

S 16 (chybová hodnota, např. #N/A)

V 64 (pole hodnot)

Většinou se používají jen první tři parametry a poslední parametr type, na ukázkách si vysvětlíme, k čemu slouží.

' Type:=l znamená, že už iva t e l musi zadat č i s l o x = Application.InputBox("Zadej č i s l o " , Type:=l) x = InputBox ("Zadej koeficient růs tu" , "Přehledy", 1.25)

V pivním řádku vidíte ukázku volání metody, ve druhém volání funkce. Povinným para-metrem je v obou případech jen úvodní prompt, který určuje text zobrazený jako výzvu uživateli v dialogovém okně funkce. Ve druhém řádku vidíte často používaný druhý para-metr určující titulek a třetí parametr udávající výchozí hodnotu. Parametr type v pivním řádku je zadán jako pojmenovaný parametr, abyste nemuseli zapisovat místo vynechaných parametrů čárky (to jsme už probírali). Jak bude dialogové okno z druhého řádku vypadat ve skutečnosti, zachycuje obrázek 6.1.

P ř e h l e d y

Zadej koeficient růstu 1 0 K 1

Cancel j

1 I m i

Obr. 6.1: Dialogové okno zobrazené funkcí InputBox

Jestliže při volání metody InputBox použijete parametr type a nezapíšete do vstupního pole hodnotu, která odpovídá požadovanému typu, zobrazí Excel po stisku tlačítka OK výstražné hlášení a nutí vás k opětovnému zadání hodnoty. Díky parametru type je možné pomocí dialogového okna funkce zadávat i odkaz na oblast buněk (type: =8), která se potom ve vstupním poli dá vybrat myší (stejně jako např. v Průvodci funkcí).

Existuje ještě jeden podstatný rozdíl mezi funkcí a metodou InputBox, který spočívá v tom, jakou hodnotu dostanete po případném stisknutí tlačítka Storno (= uživatel se rozhodl prováděnou akci zrušit). Funkce InputBox v takovém případě vrací prázdný řetězec (""), zatímco metoda vrátí logickou hodnotu Falše.

Page 102: 00-vba1 - Kopie

104 c i s l o = InputBox("Zadejte název oddělení" , "Souhrny") If c i s l o = "" Then

MsgBox "Makro nemůže dále pokračovat" Exi t Sub

Else ' zde bude v l a s t n í kód pro p r á c i s daty

End If

V této ukázce voláni funkce InputBox je uživatel požádán o zadání názvu oddělení, pro které chce něco vypočítat. Stiskne-li namísto toho tlačítko Storno, makro skončí. Možná to vypadá jako zbytečnost, ale nikdy nemůžete vědět, co vlastně uživatel udělá nebo zda klávesu Esc nestiskne omylem.

6.5 Funkce pro práci s textovými hodnotami V mnoha případech budete potřebovat nějaké informace z textových proměnných. Jednou ze základních funkcí je Len, která vrací délku řetězce (u řetězcových proměnných) nebo počet bajtů, potřebných k uložení proměnné:

x = "Prakt ická ukázka" y = Len(x) ' y = 16

Funkci Len lze využít třeba ke kontrole, zda požadované heslo má minimální počet zna-ků:

Function ZadejHeslo() Dim hes lo As S t r ing , výzva As S t r i ng výzva = "Zadej te hes lo , dlouhé alespoň 5 znaků" Do

hes lo = InputBox(výzva) If hes lo = "" Then

MsgBox "Heslo musíte zadat" , vbExclamation E l se l f Len(heslo) < 5 Then

MsgBox "Heslo musí být d e l š í " , vbExclamation End If

Loop Unt i l Len(heslo) >= 5 ZadejHeslo = heslo

End Function

Ve funkci je cyklus Do. . .Loop, který zajišťuje, že okno InputBox se bude zobrazovat tak dlouho, dokud uživatel nezadá heslo se správnou délkou. Uvnitř cyklu kontrolujeme zadanou hodnotu v bloku I f . . .End If a upozorňujeme uživatele na chyby.

Funkce, které vrací část hodnoty proměnné

Potřebujete-li zjistit část proměnné, máte k dispozici několik možných funkcí. Končí-li jejich název znakem „$", vrací typ Str ing, bez tohoto znaku vrací typ Variant . Jak již víte z předchozí kapitoly, je lépe používat typ Str ing.

6. Často používané příkazy,

Page 103: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 1 0 5

Funkce Popis

Left$, Right$ Vrací zadaný počet znaků zleva či zprava,

x = "Pavel Jarý" 1 y obsahuje "Pavel" (5 znaků zleva)

y = Lef t$ (x , 5)

' z obsahuje "Jarý" (4 znaky zprava)

z = Right$(x, 4)

Pokud je druhý parametr větší než počet znaků v řetězci, je vrácen celý řetězec a nedojde k žádné chybě.

Mid, Mid$ Vrací zadaný počet znaků od určité výchozí pozice v řetězci. První parametr je prohledávaný řetězec, druhý je výchozí pozice, třetí délka vráceného řetězce.

x = "Pavel Jarý"

y = Mid$(x, 3, 3) ' y obsahuje "vel"

z = Mid$(x, 3) ' z obsahuje "vel Jarý"

Pokud je druhý parametr větší než počet znaků v řetězci, je vrácen prázdný řetězec a nedojde k žádné chybě. Jestliže vynecháte třetí parametr, je vrácen celý zbytek řetězce od výchozí pozice.

LTrim$, RTrim$, Trim$

Funkce pro ořezání mezer na začátku a konci řetězce. Funkce Trim ořeže obě strany řetězce, LTrim jen úvodní mezery, RTrim jen koncové.

x = " Pavel Jarý "

x = Trim$(x) ' x nyni obsahuje jen "Pavel Jarý"

Funkce pro hledání v t e x t u a porovnání řetězců

Ať už jsou vlastni procedury pro vyhledáváni v textových proměnných (ne v listu!) napsány jakkoli, vždy se v nich vyskytuje funkce InSt r nebo InStrRev. Obě funkce vrací pozici, na které se v řetězci nachází hledaný znak či skupina znaků. Druhá funkce prohledává řetězec v opačném směru, tedy zprava doleva.

Pivní parametr představuje pozici v prohledávaném řetězci, od níž funkce začíná hledat. Hledáte-li od začátku, zadáte jedničku. Druhým parametrem je prohledávaný řetězec, hle-daný text zadáváte jako třetí parametr. Volitelný čtvrtý parametr určuje, zda se při hledání bere ohled na velká/malá písmena (vbBinaryCompare) nebo ne (vbTextCompare).

Není-li hledaný řetězec v prohledávaném textu nalezen, vrací funkce nulu. Nula je ale vrácena i v případě, kdy má prohledávaný text nulovou délku (je prázdný) nebo když výchozí pozice pro hledání je větší než počet znaků v prohledávaném řetězci.

x = "Prakt ická ukázka" y = " C K "

MsgBox InSt r (1, x, y, vbBinaryCompare) ' zobrazi 0 MsgBox InS t r (1 , x, y, vbTextCompare) ' zobrazi 7

WĚĚSĚĚĚ

s textovými hodnotami

Page 104: 00-vba1 - Kopie

1 0 6 E X C E L 2 0 0 0 - 2 0 0 7

První okno hlášeni zobrazí nulu, protože při binárním porovnáváni se bere ohled na vel-ká a malá písmena. Ve druhém případě je hledáni úspěšné a číslo 7 je pozice znaku „C" (prvního znaku z hledaného řetězce „CK") v řetězci „Praktická ukázka".

Funkce InStrRev má jiné pořadí parametrů, asi proto, že hledání probíhá odzadu. Prvním parametrem je prohledávaný řetězec, druhým je hledaný -řetězec, výchozí pozice je až na třetím místě. Chcete-li prohledávat od úplného konce řetězce zpět, pak třetí parametr vynecháte.

x = "Prakt ická ukázka" y = "RA" MsgBox InStrRev(x, y, , vbBinaryCompare) ' zobrazí 0 MsgBox InStrRev(x, y, , vbTextCompare) ' zobrazí 2

2 ukázky je jasné, že funkce InStRev sice vyhledává zezadu, ale hledaný řetězec nemusíte zadávat v převráceném tvaru.

Pro porovnání obsahu dvou řetězců existuje v jazyce VBA funkce StrComp, která podobně jako InStr umožňuje při srovnávání brát nebo nebrat ohled na velká/malá písmena. Pokud jsou oba porovnávané řetězce shodné, vrací funkce nulu. Jestliže je pivní řetězec „větší", vrací jedničku, pokud je první řetězec „menší", vrací číslo minus jedna.

x = "Rada" y = "Petr" MsgBox StrComp(x, y, vbTextCompare)

x = "Kvíčala" y = "kvíčala" MsgBox StrComp(x,y, vbBinaryCompare) MsgBox StrComp(x, y, vbTextCompare)

V pivní ukázce bude výsledkem číslo 1, protože „Rada" je abecedně až za „Petr". Ve druhém případě uvidíte nejdříve číslo minus 1 (malé písmeno je před svým velkým protějškem, neboli „k" < „K") a poté nulu, protože parametr vbTextCompare nebere na malá a velká písmena ohled.

Převod na velká a malá písmena

Tady je to vcelku jednoduché - funkce LCase převede všechna písmena v řetězci na malá, funkce UCase na velká.

x = "Petr Novák" MsgBox LCase(x) ' zobrazí "pe t r novák" MsgBox UCase(x) ' zobrazí "PETR NOVÁK"

Sloučení a rozdělení řetězců

V případě, kdy máte řetězec složený z více částí, oddělených navzájem určitým znakem (mezerou, středníkem, čárkou apod.), který potřebujete rozdělit na jednotlivé části, použijte vestavěnou funkci Sp l i t , která vrátí pole s jednotlivými prvky. Jako pivní parametr pře-dáte funkci rozdělovaný řetězec, druhým parametrem je oddělovač (pokud ho vynecháte, funkce dělí řetězec na části podle v něm obsažených mezer).

Page 105: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

adresa = " Ja rn í 5;120 00;Praha 2" prvky_adresy = S p l i t ( a d r e s a , " ;") Debug.Print prvky_adresy(0) ' u l i c e Debug.Print prvky_adresy(1) ' PSČ Debug.Print prvky_adresy(2) ' město

Třetí nepovinný parametr funkce S p l i t s názvem l i m i t umožňuje stanovit počet prvků výsledného pole, použijete ho tedy v případě, kdy chcete z řetězce extrahovat jen několik prvků, ne všechny.

Opakem S p l i t je funkce Jo in, která spoji prvky pole do jednoho řetězce. Druhým pa-rametrem je oddělovač, v případě jeho vynechání je opět jako oddělovač brána mezera. Zadáte-li jako druhý parametr prázdný řetězec, jsou prvky pole spojeny bez oddělovače.

6.6 Funkce pro práci s číselnými hodnotami Základní operace (sčítání, násobení apod.) jsme si vysvětlili v části věnované operátorům. V následující podkapitole si stručně uvedeme základní funkce pro úpravu a převod čísel.

Zaokrouhlování desetinných čísel

Pro zaokrouhlování na celá čísla má jazyk VBA dvě funkce - CInt a CLng, které patří mezi funkce pro převod na jiný datový typ. Kromě toho můžete desetinná čísla na celá převádět i funkcemi Fix a Int , ty ovšem nezaokrouhlují, ale pouze uřezávají desetinnou část.

Funkce Fix a Int se od sebe liší při odřezávání desetinné části zápor-ných čísel, kdy Int vrací celé číslo menší než původní číslo, zatímco Fix vrací celé číslo větší.

Poloviny jsou u funkcí CInt a CLng zaokrouhlovány vždy na nejbližší SLiclé číslo.

x = - 2 . 5 MsgBox In t (x) MsgBox Fix(x) y = 10.7 MsgBox In t (y) MsgBox Fix(y) MsgBox CInt(y) z = 5.5 zz = 4.5 MsgBox CInt(z)

' zobraz í č í s l o ' zobraz í č í s l o

' zobraz í č í s l o 10 ' zobraz í č í s l o 10 ' zobraz í č í s l o 11

' zobraz í č í s l o 6 MsgBox Clnt(zz) ' zobraz í č í s l o 4

Page 106: 00-vba1 - Kopie

108 E X C E L 2 0 0 0 - 2 0 0 7

Trigonometrické, logaritmické a jiné funkce

U této skupiny funkci postačí jednoduchá tabulka:

Funkce Význam Sin, Cos, Tan, Atn

Vrací sinus, kosinus, tangens a arkustangens zadaného čísla.

Log, Exp Vrací přirozený logaritmus čísla, případně základ přirozeného logaritmu umocněný na zadané číslo.

Abs Vrací absolutní hodnotLi čísla.

6 . 7 Vlastní funkce, které můžete použít na pracovních listech

Jestliže chcete vlastni funkce používat nejen v procedurách VBA, ale i v klasických vzorcích uložených v buňkách, musíte tyto funkce umístit do standardních modulů VBA a funkce musí být veřejná (nesmíte ji tedy deklarovat jako Pr iváte) . Jinak při jejich tvorbě nejste žádným zásadním způsobem omezeni.

V pracovních listech samozřejmě většinou používáte funkce pro nějaké výpočty. Není to však povinné, můžete si vytvořit i vlastní funkce, které pracují s jazykem VBA a vkládají do listu různé informace.

Jako první příklad si uvedeme funkci, kterou jsme už viděli - RozdilMocnin:

Function RozdilMocnin(a as Double, b as Double) RozdilMocnin = a A 2 - b A 2

End Function

Pokud je tato funkce uložena ve standardním modulu, uvidíte ji v dialogovém okně Vložit funkci v kategorii Vlastní (viz obrázek 6.2).

Obr. 62: Vlastní funkce najdete v této kategorii

Pracovat s ní můžete jako s libovolnou jinou funkcí listu, jak vidíte v řádku vzorců na obrázku 6.3.

v ^ m ®

6. Často používané příkazy, funkc

Page 107: 00-vba1 - Kopie

A5 • fr =Rozdi lMocnin(A2;A3)

A I B C D E ; 1 2 55 3 25 4 5 24001 6

Obr. 63S vlastními funkcemi pracujete stejně jako s ostatními funkcemi pracovního listu

Druhý příklad bude jednodušší, a jeho další možné varianty si jistě vymyslíte sami. Bude to funkce JmenoListu, která do buňky vloží název listu, na němž se buňka používá. Prak-tické využití? Možná někdy při tisku, pokud byste potřebovali zobrazit název listu někde v tabulce (do záhlaví či zápatí ho dostanete i bez vlastní funkce).

Function JmenoListu() JmenoListu = ActiveSheet.Name

End Function

V tomto případě jde o funkci bez parametrů, což ví i průvodce vložením funkce:

A r g u m e n t y f u n k c e

Nápověda není k dispozici.

Tato funkce nevyžaduje žádné argumenty.

Výsledek = listí

Nápověda ktéto funkci

Jak může vlastní funkce vrátit chybovou hodnotu

U funkcí, které chcete používat v pracovních listech, se někdy hodí, aby taková funkce uměla vrátit chybovou hodnotu (#HODNOTA!, #NÁZEV? apocl.). Chybová hodnota může např. naznačit, že byl předán nesprávný parametr, nebo že výpočet z nějakých důvodů nelze provést.

Chybová hodnota se sice v buňce zobrazí jako textový řetězec, ale ve skutečnosti se o text nejedná, a proto pro přiřazení chybové hodnoty nemůžete použít zápis ve tvaru:

JmenoListu = "#N/A" ' t a k t o ne!

V těchto případech použijte funkci jazyka VBA CVErr, která převede číslo chyby na sku-tečnou chybu. Čísla chyby jsou vyjádřena vestavěnými konstantami xlErrDivO, xlErrNA, xlErrName, x lErrNul l , xlErrNum, xlErrRef a xlErrValue. Předchozí příklad by se tedy správně musel psát takto:

JmenoListu = CVErr(xlErrNA)

6.8 Další časté konstrukce

Příkaz W i t h . . . E n d With

Setkali jsme se s ním již v části věnované nahrávání maker, proto zde jen stručně připomenu, k čemu slouží - umožňuje provést několik příkazů pro jediný objekt. Jeho pivní výhodu

a <u J M 'CL. 2 e n

tJ» »-2

.8 Další časté konstrukce

Page 108: 00-vba1 - Kopie

jsme si již kdysi uváděli - píšete méně kódu, protože nemusíte opakovat v každém řádku název objektu nebo odkaz na něj.

Druhou výhodou je fakt, že objekt je jednoznačně určen již v pivním řádku příkazu a Visual Basic se tedy nemusí zdržovat opětovným vyhledáváním daného objektu. Co tím mám na mysli?

Worksheets("Leden").Range("D10") = InputBox("Zadejte počet zákazníků")

Worksheets("Leden").Range("Dli") = nejaka_promenna Worksheets("Leden").Range("D12") = nejaka_jina_promenna

V této ukázce musí interpretr VBA třikrát vyhledat v paměti list Leden (a v něm pak pří-slušnou buňku). Když tyto tři řádky přepíšete s použitím příkazu With. . .End With, je list Leden hledán jen jednou.

With Worksheets("Leden") .Range("D10") = InputBox("Zadejte počet zákazníků") .Range("Dli") = nejaka_promenna .Range("D12") = nejaka_jina_promenna

End With

Výsledek? Zrychlení kódu, hlavně u objektů z hlubších úrovní objektového modelu - na-příklad opakované vyhodnocování odkazu

Worksheets("Leden").Shapes("Rectangle 1") .TextFrame.Characters

by trvalo zbytečně dlouho.

O d k a z y na objekty pomocí proměnných

V části věnované úvodu do problematiky objektů jste se naučili, že na každý objekt nějakým způsobem odkazujeme, a to bud úplným odkazem podle postavení objektu v hierarchii modelu nebo odkazem zkráceným.

V delších procedurách, kde postupně pracujete s několika objekty, můžete kromě příkazu With. . .End With použít i proměnnou, do které přiřadíte odkaz na daný objekt. Nejpive si ukážeme, jak by se taková proměnná deklarovala a jak by se do ní přiřadil odkaz:

Dim wb As Workbook, ws As Worksheet, buňka As Range

V řádku vidíte deklaraci proměnných objektového typu. Název typu je stejný jako název třídy objektu, můžete tedy deklarovat proměnnou pro libovolnou třídu objektu, která se nachází v objektovém modelu (PageSetup, Chart apod.)

Objektové proměnné se od proměnných jiných typů zásadně odlišují tím, že se do nich odkaz na objekt přiřazuje příkazem Set, nemůžete 4b použít prosté přiřazení jako u klasické proměnné (x=4).

Set wb = Workbooks("Data2007.xls") Set ws = wb.Worksheets("List5") Set buňka - ws.Range("B1:BIO")

Uvedené tři řádky demonstrují právě inicializaci takových proměnných příkazem Set. Nej-dříve je do proměnné wb přiřazen odkaz na sešit Data2007.xls - ten musí být samozřejmě

§ | 1 § P | m

Page 109: 00-vba1 - Kopie

otevřen - a poté do proměnné ws přiřadíme odkaz na list List5 umístěný v tomto sešitu. Poslední řádek ukázky přiřadí odkaz na určitou oblast do proměnné buňka.

K čemu to všechno? Výhody objektových proměnných jsou stejné jako u příkazu With. . . End With: nemusíte psát tolik kódu, procedura je mnohem přehlednější a kód je rychlejší, protože v každé takové proměnné je uložen jednoznačný odkaz, a Visual Basic nemusí pokaždé prohledávat postupně celý objektový model, aby našel správný objekt. Další možné výhody naznačuje následující příklad:

Set wb = Workbooks("Data2007.xls") Se lec t Case mesic Case 1

Set ws = wb.Worksheets("Leden") Case 2

Set ws = wb.Worksheets("Unor") Case 3

Set ws = wb.Worksheets("Březen") Case 4

Set ws = wb.Worksheets("Duben") ' a t ak dále End Se lec t

ws.Range("AI") = nejaka_promenna

V tomto případě si do proměnné ws uložíte odkaz na nějaký list podle toho, jaká hodnota je právě uložena v proměnné mesic. Dále pak můžete pracovat s tímto listem pomocí proměnné ws. Předpokládá se, že potřebujete pracovat jen s některými listy, ne se všemi listy v sešitu (pak byste samozřejmě použili cyklus For Each. . .Next).

6.9 Cvičeni Ve složce Kap6 najdete sešit Cviceni.xls, který obsahuje několik příkladů na procvičení lát-ky probírané v této kapitole. Vyřešené procedury a funkce najdete v soubom Vysledky.txt. Připomínám, že moje řešení rozhodně není to jediné správné.

Page 110: 00-vba1 - Kopie
Page 111: 00-vba1 - Kopie

Pracujeme s objektem Range

Prvním z objektů Excelu, který je potřeba při programováni dokonale zvládnout, je Range, neboli oblast buněk (případně jediná buňka). I v pivních nahraných makrech jsme pracovali právě s tímto objektem. S buňkami - především s jejich obsahem - budete pracovat velmi často, proto objektu Range věnuji celou kapitolu.

7 . 1 Co všechno může být objektem typu Range? Postačí heslovitě vyjmenovat jednotlivé možnosti:

S Jediná buňka.

V Oblast buněk na jednom listu, složená z jedné či více částí. (Jednotlivé části by pak byly vyjádřeny kolekcí Areas. Pozor, tato kolekce neobsahuje objekty Area, ale opět objekty Range.)

Oblast buněk vybraná na více listech (prostorová oblast).

S Celý sloupec na listu, případně celý řádek (a také více sloupců či řádků).

•/ Všechny buňky na listu.

lili 7 . 1 Co všechno může být.

Page 112: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

7 . 2 Jak určit oblast buněk Už při nahráváni maker jsme si řekli, že pro práci s buňkami můžeme danou oblast ozna-čit před spuštěním makra (pak bucle použit odkaz na výběr - Select ion), nebo oblast vybereme až v makru.

Dále jsme se zmínili, že pro práci s buňkami není nutné je dopředu vybírat. Tento fakt je však tak zásadní, že ho pro jistotu zopakuji ještě jednou:

Metodu Select pro výběr objektů používejte jen tehdy, když je to skutečně nutné! Jinak pracujte pňmo s danými objekty.

V některých případech je třeba, aby oblast určil uživatel, a to až po spuštění makra. Tato situace nastává např. u maker pro automatické formátování tabulek, kdy nemáte dopředu zaručeno, že uživatel danou tabulku vybere. Pak je nutné uživatele k výběru vyzvat, a to např. pomocí metody InputBox, kterou jsme si již předvedli.

7 . 3 O d k a z y na objekt typu Range Na základě předchozího textu se možná domníváte, že na buňky se můžete v kódu od-kazovat jen zápisem:

Range("AI:B5")

nebo relativním odkazem (který jsme si ukázali v třetí kapitole):

A c t i v e C e l l . O f f s e t ( 2 , 2 )

případně zkratkovým odkazem:

Act iveCel l Se lec t ion

Ve skutečnosti existuje mnohem více výrazů, které představují odkaz na nějakou buňku nebo skupinu buněk. Protože se v makrech tyto odkazy vyskytují často, případně je tam můžete výhodně použít, začneme celou kapitolu právě popisem nejrůznějších možných typů odkazů. Teprve poté si ukážeme, co všechno se dá s buňkami provádět.

^yozorné0/ ye všech případech, kdy v odkazu není uveden list ani sešit, se tento odkaz vztahuje na aktivní list aktivního sešitu. Vpňpadě, že makro s ta-kovým odkazem na buňky spustíte v okamžiku, kdy je aktivní list grafu nebo není otevřen žádný sešit, dojde k chybě za běhu programu!

O d k a z y stylem A I - vlastnost Range

Toto je základní styl odkazu. V tomto případě je pro něj použita vlastnost Range, která vrací odkaz na objekt Range.

7 . Pracujeme s objektem Range

Page 113: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 1 1 5

a> •i. * s. <" g1

ä>

Range("C3:D5")

Odkaz na oblast je tu tedy vyjádřen přímo adresou levé horní a pravé dolní buňky v oblasti. Vlastnost Range může samozřejmě vracet odkaz i na jedinou buňku, případně na násobnou oblast, složenou z několika částí:

Range("D4") 1 násobná o b l a s t , jako oddělovač p o u ž í v e j t e čárku Range("D4,F5:F10,Gl")

Odkaz na násobnou oblast získáte i pomocí metody Union objektu Applicat ion:

Dim xl As Range, x2 As Range, vys ledna_oblas t As Range Set xl = Range("AI:A5") Set x2 = Range("D2:D10") ' vo lán í metody Union, uvést musíte nejméně dvě o b l a s t i Set vys ledna_oblas t = Applicat ion.Union (xl, x2)

Pokud chcete pracovat s buňkou na jiném než na aktivním listu nebo na listu v jiném sešitu, musíte uvést odkaz na daný list či sešit, případně použít syntaxi vám jistě známou ze vzorců, kde je název listu oddělen vykřičníkem:

Workbooks("pokus.xls").Worksheets("Prosinec").Range("A4") Workbooks("pokus.xls").Range("Prosinec!A4")

Zde je použit odkaz na buňku A4 v listu Prosinec, který se nachází v sešitu pokus.xls. Jestliže je makro umístěno přímo v tomto sešitu, můžete odkaz zkrátit:

Worksheets ("Prosinec") .Range("A4")Range("Prosinec!A4")

Vynechat odkaz na nadřízený objekt je stejné, jako kdybyste použili odkaz ActiveSheet (aktivní list):

Range("A4") ActiveSheet.Range("A4") 1 oba řádky znamenají t o t éž

Vždy pečlivě zvažte, co všechno musí být v odkazu uvedeno, jinak budou vaše makra nefunkční!

Kromě adresy buněk můžete oblast vyjádřit i dalšími způsoby. Jestliže na listu existuje pojmenovaná oblast buněk, stačí zapsat její název. Následující řádek kódu aktivuje oblast Norma:

Range("Norma").Activate

fednou z nejobtížnějších věcí pro začátečníky je pochopit rozdíl mezi objekty, vlastnostmi a metodami stejného názvu. V kódu totiž může ¡[| jedno slovo představovat více věcí najednou -jak vlastnost, tak objekt, na který vlastnost vrací odkaz. V praxi však většinou bereme v úvahu jen výsledný objekt.

»V- "O/

Nej jednodušší možnost tohoto zápisu jsme viděli hned v prvním nahraném makru:

O d k a z y na objekt typu Range

Page 114: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

>&oZOrnéQs Pojmenované názvy se hledají vždy jen v rámci listu, nikoli sešitu, předchozí příkaz tedy selže, pokud se oblast Norma nachází na jiném listu.

Úplný odkaz na oblast Norma samozřejmě můžete zapsat takto:

Workbooks("pokus .xls") .Worksheets("Pros inec") .Range("Norma")

Celý řádek nebo sloupec se pomoci vlastnosti Range rovněž určuje velmi snadno:

Range("B:B") 1 odkaz na ce lý s loupec Range("5:5") ' odkaz na pá tý řádek v l i s t u

Vzhledem k tomu, že odkazy na celé sloupce či řádky jsou uzavřeny do uvozovek, nemůže-te v nich používat proměnné. Následující kód by tedy vyvolal chybu za b ě h L i programu:

radek = 15 R a n g e ( " r a d e k : r a d e k " ) . S e l e c t 1 ne l ze R a n g e ( r a d e k : r a d e k ) . S e l e c t ' an i t a k t o to ne jde

Všechno se ovšem dá obejít, a tLito situaci vyřešíte následLijícím způsobem:

Range(radek & " : " & r a d e k ) . S e l e c t

O d k a z vlastností Celis

Vlastnost C e l l s představuje velmi snadný způsob, jak odkázat na Lirčitou buňku nebo skLipinu bLiněk. Na rozdíl od vlastnosti Range se zde nevyskytují uvozovky, což se hodí především v případě, kdy potřebujete pracovat postupně s jednotlivými buňkami v nějaké oblasti.

Vlastnost C e l l s má dva parametry, prvním je pořadové číslo řádku, druhým pořadové číslo sloupce dané buňky, např.:

Ce l l s (1, 1)

je odkaz na b L í ň k L i AI. Na b u ň k u E2 můžete v kódu odkázat takto:

C e l l s ( 2 , 5)

Stejně jako u vlastnosti Range znamená vynechání odkazu na nadřízený objekt odkaz na aktivní list:

C e l l s ( 1 , 1 ) A c t i v e S h e e t . C e l l s ( 1 , 1 ) ' oba řádky maj i s t e j n ý význam

Používání číselných indexů je velmi výhodné právě v cyklech, kdy potřebujete zpracovat všechny buňky v určité oblasti. Následující příklad kupříkladu změní barvu písma v těch buňkách, kde je hodnota vyšší než 30, na červenou (pozn. - to lze samozřejmě řešit i bez programování pomocí podmíněného formátování).

For i = 1 t o 10 If C e l l s ( i , 1) > 30 Then

C e l l s ( i , 1 ) .Fon t .Co lo r Index = 3 Next i

Page 115: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Příklad pracuje s oblasti AI:A10. Pokud byste ho chtěli zobecnit pro aktuální výběr, nebyla by vlastnost Cel l s vůbec nutná, postačí jen iterace všech prvků v kolekci buněk:

For Each buňka In Se lec t ion If buňka.Value > 30 Then buňka.Font.Colorlndex = 3

Next buňka

Vlastnost Cel l s má tři možné varianty syntaxe. Pivní jsme si představili. Druhou budete asi používat jen zřídka. V tomto případě totiž vlastnost používá jen jeden parametr, kte-rým je pořadové číslo buňky. Toto pořadové číslo se počítá po řádcích, takže na listu je Cel l s (1) buňkou AI, Cel l s (10) buňkou JI a Cel l s (257) buňkou A2. List má nejvíce 256 sloupců, proto 257. buňka je první buňkou zleva ve druhém řádku (neplatí pro Excel 2007, který má větší počet sloupců v listu).

Třetí možná syntaxe představuje odkaz na všechny buňky daného objektu:

Act iveShee t .Ce l l s Cel l s

Tyto zápisy vyjadřují všechny buňky na aktivním listu.

Vlastnosti Range a Cells, použité na jiných objektech Range

Zatím jsme předpokládali, že tyto vlastnosti voláme vždy vůči listu, tedy že určujeme nějakou oblast na nějakém listu. Ale to vás vůbec nemusí omezovat. Tyto vlastnosti totiž můžete volat i na jiných objektech Range!

S e l e c t i o n . C e l l s ( 1 , 3 )

Předchozí řádek je odkaz na buňku v prvním řádku a třetím sloupci aktuálního výběru (sa-mozřejmě za podmínky, že je právě vybrána oblast buněk). Stejně tak tedy můžete použít zápis:

Range("A2:D10") .Cel ls( l , 3)

V tomto případě jde o buňku v prvním řádku a třetím sloupci oblasti A2:D10, tedy o buňku C2.

Možná to vypadá jako zbytečnost, ale i takovéto zápisy se v mnoha případech hodí. Např. pro práci s jedinou buňkou aktuálního výběru apod.

O d k a z y na celé řádky a sloupce - vlastnosti Columns a R o w s

Vlastnosti Columns a Rows výtečně poslouží především v případech, kdy potřebujete praco-vat s určitými řádky či sloupci v oblasti buněk (zarovnání obsahu buňky, zaokrouhlení hod-not apod.). Obě vlastnosti vrací odkaz na objekt typu Range a mají také dvojí syntaxi:

' první syntaxe = odkaz na u r č i t ý sloupec č i řádek ' i = pořadové č í s l o nebol i index obj ekt.Columns(i) objekt .Rows(i) ' odkaz na všechny sloupce nebo řádky objekt.Columns objekt.Rows

Protože výsledný odkaz je vždy odkaz na objekt Range, vypadá příkaz pro zarovnání buněk ve druhém sloupci výběru takto:

Page 116: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Select ion.Columns(2) .HorizontalAlignment = xlRight

Výraz Columns (2) vrací druhý sloupec v nadřízené oblasti, kterou je Select ion, nebo-li aktuální výběr. U této oblasti měníme vlastnost HorizontalAlignment na hodnotu xlRight, čili zarovnání vpravo.

Příkaz pro automatické přizpůsobení šířky prvního sloupce ve výběru (nikoli v celém listu!) vypadá takto:

Select ion.Columns(1) .AutoFi t

V tomto případě je použita metoda AutoFit. Při automatickém zarovnání šířky sloupce však bude brán v úvahu jen obsah buněk v aktuálním výběru, nikoli v celém sloupci. Odkaz na celý sloupec (od prvního do posledního řádku) nebo na celý řádek (od prvního do posledního sloupce) se provádí jinak, pomocí odkazů EntireRow a EntireColumn.

Pomocí vlastností Columns a Rows se dá jednoduchým způsobem zjistit počet řádků a počet sloupců určité oblasti. Objekt Range má totiž vlastnost Count, která vrací počet prvků, v tomto případě počet sloupců nebo řádků: ' počet řádků ve vybrané o b l a s t i Selection.Rows.Count ' počet sloupců Selection.Columns.Count

Výraz Range ("AI: Cl 0 ") . Coun t vrací počet buněk v zadané oblasti.

EntireColumn a EntireRow

Klíčová slova EntireColumn a EntireRow vrací odkaz na celý sloupec nebo řádek, do něhož patří objekt, který je uveden před tímto odkazem. Zápis:

Range("C3").EntireRow

tedy reprezentuje celý třetí řádek aktivního listu. Obdobně:

Range("A2:D4").EntireColumn

představuje sloupce A:D, protože buňky v objektu Range leží ve sloupcích A, B, C a D.

Možné použití těchto odkazů je různé. Hodí se např. pro formátování, mazání a další operace, které je potřeba použít na celý řádek či sloupec.

O d k a z na vybranou oblast buněk - Selection

Také Se lec t ion vystupuje v úloze odkazu, který vrací aktuálně vybranou oblast. Pokud použijete Selec t ion bez odkazu na nadřízený objekt, jde o výběr v aktivním okně Excelu. Tuto vlastnost však můžete použít i v objektu Window (tedy na jakémkoli otevřeném okně Excelu), a pak je možné pracovat s výběrem i v okně, které není aktivní.

' ak tuá ln i s e š i t musi být otevřen nejméně ve 2 oknech ' (přikaž Okno Nové okno) ActiveWorkbook.Windows(2).Selection.Font.Bold = True

7 . Pracujeme s objektem Ran

Page 117: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 119 O d k a z pomocí vlastnosti Offset

S vlastnosti O f f s e t jsme se již setkali v třetí kapitole, kdy jsme si ukazovali nahrávání maker s použitím relativních odkazů. Vlastnost Of f se t určuje buňku nebo oblast posunutou o určitý počet řádků a sloupců vůči nadřízené oblasti. Příkaz:

R a n g e ( " A I " ) . O f f s e t ( 2 , 2).Select

vybere buňku C3 (dva řádky směrem dolů a dva sloupce směrem doprava). Obdobný zápis:

Range("AI :C2") .Of f se t (2 , 2 ) . S e l e c t

vybere oblast C3:E4, protože vlastnost dodržuje počet řádků a sloupců nadřízené oblasti. Další varianta:

Range ( "AI :C2" ) .Of f se t (2 , 2 ) . C e l l s ( 2 , 2 ) . S e l e c t

vybere buňku D4. Proč? Vlastnost O f f s e t je v tomto případě odkazem na oblast C3:E4, ovšem z této posunuté oblasti nás zajímá jen buňka určená odkazem Ce l l s (2, 2), což je buňka ve druhém řádku a druhém sloupci posunuté oblasti C3:E4, neboli D4.

Nesmíme zapomenout ani na fakt, že vlastnost O f f s e t přijímá i záporné parametry, takže posun lze provádět i směrem vlevo a nahoru.

Range ( "D5" ) .Of f se t ( -1 , -2)

Poslední řádek představuje odkaz na buňku B4.

O d k a z pomocí vlastnosti CurrentRegion a UsedRange

Tyto vlastnosti se hodí vždy, pokud máte pracovat s oblastí, jejíž rozsah přesně neznáte. Aktuální oblast (CurrentRegion) pro danou buňku je oblast ohraničená prázdnými řádky a sloupci, nebo kombinací prázdných řádků, sloupců a hran listu. Na obrázku 7.1 vidíte vybranou aktuální oblast pro buňku C3:

A | B I c ! I D I E I 1 2 Náklady

leden 15 Tržby |

8 5

10

3 Náklady

leden 15 Tržby |

8 5

10 4 únor

březen

Tržby | 8 5

10 5 únor březen

Tržby | 8 5

10 6

Obr. 7.1: Aktuální oblast je ohraničena prázdnými řádky a sloupci

Vlastnost CurrentRegion je výtečná např. pro formátování nebo pro zjištění čísla posled-ního zaplněného řádku či sloupce, případně počtu sloupců či řádků v aktuální oblasti.

Aktuální oblast můžete přímo v listu vybrat stiskem klávesové kom-binace CTRL + NUM* nebo z nabídky programu příkazem Úpravy —• Přejít na —> tlačítko Jinak —> Aktuální oblast.

Použitá oblast (UsedRange) je něco jiného. Nedá se použít vůči objektu Range, ale jen vůči objektu Worksheet. Použitá oblast vyjadřuje tu oblast listu, na níž se nacházejí data, a je tedy ohraničena vlevo nahoře neprázdnou buňkou, která je nejblíže buňce AI (může jít i o buňku AI), a nejvzdálenější neprázdnou buňkou vpravo dole na listu.

tazy na objekt typu Range

Page 118: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 •Iii ' výběr použ i té o b l a s t i na aktuálnim l i s t u ActiveSheet.UsedRange.Select

V závislosti na tom, vůči jaké buňce vlastnost CurrentRegion používáte, můžete dostat více aktuálních oblastí na jednom listu, použitá oblast je však na listu jen jedna.

Máte-li na listu více tabulek a nevíte-li, kde se nachází horní levá buňka pivní tabulky a kolik má tato tabulka řádků či sloupců, pak odkaz na první tabulku získáte jednoduše pomocí kombinace vlastností CurrentRegion a UsedRange:

ActiveSheet.UsedRange.Range("AI").CurrentRegion

A l B | C D I E | F I G I 1 2 3 První tabulka 4 Náklady Tržby 5 leden 15 8 6 únor 5 7 březen 10 8 9 10 11 12 Druhá tabulka 13 Náklady Tržby 14 leden 25 15 15 únor 12 8 16 březen 14 10 17

Obr. 72: Použitá oblast na listu, kde jsou dvě tabulky (zbylé buňky jsou prázdné)

O d k a z pomocí vlastnosti Areas

Vyskytuje-li se na listu výběr složený z více oblastí, pak k jednotlivým částem výběru mů-žete přistupovat pomocí vlastnosti Areas. Tato vlastnost vrací kolekci Areas, která ovšem neobsahuje objekty typu Area, ale objekty typu Range.

Celkový počet oblastí ve výběru zjistíme pomocí vlastnosti Count, stejně jako jsme si ukázali počet sloupců a řáclků v oblasti. Následující zlomek kódu můžete použít všude tam, kde je nutné zabránit nepovolené operaci pro výběr z více částí.

If Select ion.Areas .Count > 1 Then MsgBox "Operaci nelze provés t na bloku s v ice čás tmi . " Exit Sub

End If

Druhá ukázka předvádí formátování prvních sloupců v každé oblasti výběru:

For Each ob la s t In Se lec t ion .Areas oblas t .Columns(1) .Font .Bold = True

Next

V každé oblasti výběru by tedy byl pivní sloupec formátován tučným písmem. Proměnná ob las t představuje odkaz na objekt typu Range.

Page 119: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

O d k a z na buňky od pevné počáteční buňky do určitého místa

Nadpis možná vypadá nesrozumitelně, ale hned si ukážeme příklad. Chcete např. provést určitou operaci pro buňku a pro všechny neprázdné buňky pod ní (vpravo od ní apod.). V takovém případě použijte metodu End, jejíž jediný parametr určuje směr, kteiým se má výběr provést:

' výběr směrem doprava Range("AI", Range("Al") .End(xlToRight) ) .Select

Metoda End se hodí i v případě, kdy chcete zjistit číslo řádku poslední obsazené buňky v určitém sloupci:

Cells(Rows.Count, 2).End(xlUp).Row

Výraz Rows. Count vrací počet řádků v listu (ten je v různých verzích Excelu různý, proto nelze použít konstantní číslo). Výraz Cells(Rows. Count, 2) je tedy odkaz na poslední buňku ve druhém sloupci. Od této buňky metodou End „skočíme" směrem nahoru na poslední obsazenou buňku (je to to samé, jako kdybyste v posledním řádku stisknuli kombinaci CTRL + ŠIPKA NAHORU). Vlastnost Row vrátí číslo řádku.

O d k a z pomocí vlastností TopLeftCell a BottomRightCell

Tyto vlastnosti tu uvádím jen kvůli úplnosti, protože se používají u grafických objektů, nakreslených na pracovním listu (čáiy, grafy). Vrací odkaz na buňku, která leží pod levým horním (TopLeftCell) nebo pravým dolním (BottomRightCell) rohem objektu. Obě vlastnosti se hodí v případech, kdy chcete zjistit, zda se nakreslený objekt při vložení buněk do listu neposune.

7 . 4 Pracujeme s oblastmi buněk - základní vlastností a metody

Jestliže máte v kódu zpracovat všechny buňky v určité oblasti, použijte cyklus For Each. . . Next nebo Do.. . Loop, přičemž pivní varianta je vhodnější (ovšem ne vždy). Principy práce s oběma cykly jsme si již ukázali, proto přejděme rovnou k příkladům.

U cyklu For Each. . .Next zadáváte jako iterátor proměnnou, která reprezentuje člen v kolekci, u objektů Range tedy jednotlivou buňku:

Dim buňka As Range For Each buňka In Range("D10").CurrentRegion

' zde bude kód měnící buňky, např ík lad : buňka.HorizontalAlignment = xlRight

Next

Co tato ukázka provádí? V aktuální oblasti kolem buňky D10 změní vodorovné zarovnání obsahu buněk doprava.

V některých případech nemusí být použití cyklu For Each. . . Next vhodné. Pokud napříkladpň zpracování celé oblasti dochází ke změ-ně počtu buněk (mazání), použijte cyklus Do... Loop.

Page 120: 00-vba1 - Kopie

Nejdůležitější vlastnosti objektu Range

V následující tabulce jsou vyjmenovány nejdůležitější (a také nejpoužívanější) vlastnosti objektu Range. Vlastnosti určené jen ke čteni nemůžete měnit, lze je pouze cist:

Vlastnost Popis Address Vrací adresu buňky jako textový řetězec.

Pomocí prvních dvou parametrů lze určit, zda v řetězci bude i symbol dolaru (jako absolutní odkaz) či ne.

AddressLocal Vrací adresu buňky v jazyku dané jazykové verze Excelu.

ColumnWidth Vrací nebo nastavuje šířku sloupce (jednot-kou je šířka znaku).

Comment Vrací odkaz na objekt Comment, neboli ko-mentář připojený k buňce (levé horní buňce v oblasti). Je určen pouze ke čtení.

CurrentRegion Vrací odkaz na aktuální oblast kolem dané buňky.

EntireColumn,EntireRow Odkazy na celý sloupec nebo celý řádek. Font Vlastnost vracející odkaz na objekt Font, který

se používá pro formátování písma v buňce. FormatConditions Vrací kolekci FormatCondi t ions , která

představuje všechny podmínečné formáty pro danou buňku. Jen ke čtení.

Formula Vrací nebo nastavuje vzorec v buňce. Název funkce musí být anglicky, odkaz na buňky ve stylu AI.

FormulaLocal Vrací nebo nastavuje vzorec v buňce. Ná-zev funkce musí být v jazyku verze Excelu (v české verzi Excelu tedy česky), odkaz na buňky ve stylu AI.

FormulaRlCl Vrací nebo nastavuje vzorec v buňce. Název funkce musí být anglicky, odkaz na buňky ve stylu R1C1.

FormulaRlCILocal Vrací nebo nastavuje vzorec v buňce. Název funkce musí být v jazyku verze Excelu (v čes-ké verzi Excelu tedy česky), odkaz na buňky ve stylu R1C1.

HorizontalAlignment,Vert icalAlign-ment

Zarovnání obsahu buňky, vodorovně či svis-le. Jako hodnoty se zadávají konstanty ze seznamu možných hodnot.

Characters Vrací kolekci Characters , neboli všechny znaky textu uvnitř buňky. Dá se použít pro formátování textu.

7 . Pracujeme s objektem Raní

Page 121: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Vlastnost Popis I n t e r i o r Vlastnost vracející odkaz na objekt I n t e r i -

or, představující vnitřek buňky (má důležité formátovací vlastnosti).

NumberFormat Nastavuje nebo vrací kód formátu pro dané buňky.

O r i e n t a t i o n Směr textu v buňce. Může mít hodnoty xlHo-r i z o n t a l , x l V e r t i c a l , xlUpward nebo xlDownward.

PageBreak Udává, zda se na dané buňce nachází konec stránky, a to bud automatický (xlAutoma-t i c ) nebo ruční (xlManual). Neleží-li buň-ka na konci stránky, má vlastnost hodnotu xlNone. Tuto vlastnost můžete nastavit jen na hodnoty xlNone a xlManual.

RowHeight Vrací nebo nastavuje výšku sloupce (jednot-k o L i je bod - 1/72 palce).

S ty l e Vlastnost vracející odkaz na objekt Style , který představuje styl použitý pro formáto-vání buňky. Jen ke čtení.

Text Text, který je v buňce vidět. Pokud je buňka formátována, může se hodnota této vlast-nosti lišit od vlastnosti Value. Je Lirčena jen ke čtení.

Value Hodnota obsažená v buňce. Pokucl je bLíňka prázdná, vrací hodnotu Empty (její přítom-nost se dá testovat funkcí IsEmpty).

WrapText Určuje, zda je text v buňce zalomen (True) či ne (Falše).

Další tabLilka obsahuje vlastnosti objektu Range, které maji význam v případě, že je tento objekt tvořen více buňkami.

Vlastnost Popis HasFormula Obsahují-li všechny bLíňky v oblasti vzorec, vrací hodnotu

True. Pokud není vzorec v žádné z buněk, vrací hodnotu Falše . V ostatních případech vrací hodnotu Null.

Next Vrací další buňku v oblasti (napodobuje vlastně stisk klá-vesy TAB). Je-li list Lizamčen proti změnám, vrací další ne-uzamčenou buňku, jinak vždy buňku vpravo od zadané buňky.

Previous Vrací předchozí buňku v oblasti (napodobuje stisk kláves SHIFT+TAB). Je-li list uzamčen proti změnám, vrací předchozí neuzamčenoLi buňku, jinak vždy buňku vlevo od zadané buňky

Další tabulka shrnuje nejpoužívanější metody pro objekt Range:

Pracujeme s oblastmi buněk.

Page 122: 00-vba1 - Kopie

124 E X C E L 2 0 0 0 - 2 0 0 7

Metoda Vlastnost Act iva te Aktivuje buňku, která se musí nalézat v aktuálně vybrané

oblasti. AddComment Přidá do buňky komentář:

Range("D5").AddComment "Vždy z k o n t r o l u j ! " AutoFi l l Vyplní oblast buněk podle zadaného vzoru. Clear Smaže obsah buněk. C lea rConten t s , C lea r -Formats , C l e a r N o t e s , ClearComments

Smaže vzorce v buňce (ClearContents), formát buňky (ClearFormats) či komentáře (ClearComments).

Copy Kopíruje oblast do jiné oblasti nebo do schránky Windows. Cut Přesune oblast do jiné oblasti nebo do schránky Win-

dows. NoteText Nastavuje nebo vrací text komentáře v buňce:

Act iveCel l .NoteText "Skutečně p l a t í ? " Se lec t Vybere buňku nebo oblast. Spec ia lCe l l s Vrátí odkaz na skupinu buněk určitého typu v oblasti (buň-

ky obsahující vzorce, prázdné buňky, buňky s ověřováním hodnot).

7 . 5 Příklady různých technik pro prácí s buňkami V této části si ukážeme některé základní techniky, které se vám budou hodit.

Kopírování buněk Pro kopírováni buněk se používá metoda Copy, jejímž parametrem je cílová oblast:

' kopírování buňky A2 na aktivním l i s t u do buňky B2 Range("A2").Copy Range("B2")

Kopírování buněk do jiného listu či sešitu je rovněž jednoduché: ! z A2 do B2 na jiném l i s t u Ce l l s (2, 1).Copy Worksheets("Leden") .Ce l l s (2 , 2) ' z A2 do B2 na jiném l i s t u v jiném s e š i t u Ce l l s (1 , 1).Copy _

Workbooks("Pardubice") .Worksheets("Leden") .Cel ls{2, 2)

Jako parametr tedy vždy zadáte cílovou oblast kopírování buňky. Jestliže nezadáte žádný parametr, je buňka zkopírována do schránky Windows.

Kopírovat samozřejmě můžete i více buněk najednou, platný je jakýkoli odkaz na buňky, který jsme si ukázali na začátku této části (s výjimkou nesouvislých oblastí). Tak např. aktuální oblast buňky AI zkopírujete na jiné místo takto:

Ce l l s (1 , 1) .CurrentRegion.Copy Ce l l s (5, 5)

7 . Pracujeme s ob

Page 123: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

V tomto případě by byla celá aktuální oblast zkopírována o čtyři řádky níž a o čtyři sloup-ce doprava. Protože však nevíme, jak velká je aktuální oblast, mohlo by dojít k přepsání části oblasti, kterou kopírujete. Takže např. pro zkopírování nějaké oblasti směrem vpravo tak, aby mezi původní a novou oblastí byla mezera jednoho sloupce, byste použili tento kód (z prostorových důvodů jsou tu použity odkazy pomocí objektové proměnné, aby byl zápis kratší):

Dim buňka As Range Set buňka = C e l l s ( 1 , 1) .CurrentRegion buňka.Copy C e l l s ( l , l ) . 0 f f s e t ( l , buňka.Columns.Count + 1)

Takže pokud by aktuální oblast kolem buňky AI měla pět sloupců, bude výraz buňka. Columns .Count + 1 obsahovat číslo 6 a zápis O f f s e t (1, 6) vrátí odkaz na buňku posLi-nutou o šest sloupců vpravo vůči buňce AI, tedy na buňku Gl.

Metoda Copy neumožňuje zkopírovat buňky s propojením, provede vždy jen zkopírování hodnoty. Propojení buněk dosáhnete metodou Paste, kterou si ukážeme upráce s listy.

Přesun buněk na jiné místo

PostLip při přesunu buněk na jiné místo je stejný, jenom metoda je jiná Cut.

Range("AI:D10").Cut Range("El")

Vkládání ze schránky jinak - metoda PasteSpecial

Na rozdíl od metody Pas te (prosté vložení ze schránky) třídy Worksheet se metoda Pas-t e S p e c i a l (vložit jinak) dá použít i na objektu Range. Kdy ji použít? Ve všech případech „zvláštního" vkládání ze schránky, které jsou názorně vidět na obrázku 7.3.

Vložit jinak 0 B Vložit

Ojkšej O E°užít zdrojový motiv u všech

O Vzorce O Vše kromě ohraničení

O Hodnoty O Šířky sloupců

O Formáty O Vzorce formáty čísla

O Komentáře O Hodnoty a formáty čísla

O Ověření

Operace

0 Žádná O Násobit

O Přičíst O Dělit O Odečíst

O Vynechat prázdné [~1 Transponovat

| Vložit propojení | | OK ] [ Storno ]

Obr. 73: Dialogové okno Vložit jinak pro vkládání obsahu buněk

V dialogovém okně Vložit jinak jsou vidět dvě skupiny přepínačů a dvě zaškrtávací po-líčka, kterým odpovídají i čtyři parametry metody Pas teSpec ia l :

y&ozorné^

a jmenuje se

Page 124: 00-vba1 - Kopie

P a s t e S p e c i a l ( [ P a s t e ] , [Operation], [SkipBlanks], [Transpose])

Hodnoty parametrů zadáváte pomoci vestavěných konstant, které jsou popsány v nápovědě k metodě. Ukážeme si alespoň jeden praktický příklad - kód, který ve vybrané oblasti nahradí vzorce jejich výslednými hodnotami:

Select ion.Copy Se l ec t i on .Pas t eSpec i a l pas te :=xlPasteValues Application.CutCopyMode = Falše

Proč je tu poslední řádek? Jestliže použijete metodu Copy bez parametrů, tedy jen zko-pírujete buňky do schránky, zůstane po vložení ze schránky i nadále původní oblast ve schránce, což se projeví vám jistě známým blikajícím rámečkem kolem oblasti. Proto je tu poslední řádek, který schránku vyprázdní. Je to stejné, jako kdybyste po ručním vložení ze schránky stiskli klávesu Esc.

M a z á n í obsahu či formátu buněk

Jak víte, v buňkách je možné mazat bud úplně všechno, nebo jen jejich formát, případně hodnotu bez formátu. A nesmím zapomenout na poznámky čili komentáře buňky, ty je možné smazat také. Pro mazání buněk vám Visual Basic nabízí čtyři metody: Clear, ClearContents, ClearFormats a ClearComments, které jsou popsány v předchozí tabulce nejdůležitějších metod, takže si tu uvedeme už jen příklady:

' smaže formáty buněk ve vybrané o b l a s t i Se lec t ion .ClearFormats ' vymaže všechny buňky na druhém pracovním l i s t u Workshee t s (2) .Ce l l s .Clear

Vkládání buněk do listu a jejich odstraňování

Pro vkládání a odstraňování buněk má objekt Range přiděleny metody I n s e r t a Delete, jejichž jediný nepovinný parametr s h i f t určuje, kterým směrem se odsunou buňky, na jejichž místo vkládáte buňky nové, případně ze kterého směru budou přisunuty buňky na místo buněk smazaných.

' původní o b l a s t AI:Cl se posune vpravo Range("AI :Cl" ) . Inse r t x lShif tToRight ' v ložení celého řádku (parametr j e zbytečný) Rows(10) . Inser t 1 buňka D5 a d a l š í pod ní se posunou nahoru Range("D4").Delete x lShif tUp

Při vkládání má parametr dvě možné hodnoty (xlShiftToRight nebo xlShiftDown, tedy doprava nebo dolů), při mazání také jen dvě hodnoty, ale opačné (x lShi f tToLef t nebo xlShiftUp, tedy doleva či nahoru).

Vkládání vzorců do buněk

Pro vkládání vzorců jsou k dispozici celkem čtyři vlastnosti objektu Range - Formula, FormulaLocal, FormulaRlCl a FormulaRlCILocal. Navzájem se liší jazykem vzorce a způsobem notace (AI nebo R1C1):

Základní rozdíly mezi nimi jsou popsány v předchozí tabulce nejdůležitějších vlastností, zde si ještě uvedeme další základní pravidla, která platí pro všechny tři vlastnosti:

Page 125: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Vzorec zadáváte jako textový řetězec a všechny vlastnosti rovněž vrací vzorec jako textovou hodnotu.

V Jestliže buňka obsahuje konstantu, vrátí vlastnost konstantu.

V Jestliže v buňce není vzorec, obsahuje vlastnost prázdný řetězec.

Všechny čtyři funkce si prakticky předvedeme na příkladu. Ve všech případech bude do buňky vložen vzorec pro vypočet průměru z oblasti C1:C10.

Ce l l s (1 , 1).Formula = "=AVERAGE(Cl :C10)" Ce l l s (2 , 1).FormulaRlCl = "=AVERAGE(R1C3:R10C3)" Ce l l s (3 , 1) .FormulaLocal = "=PRŮMĚR(Cl :C10)" Cel l s [2, 1) .FormulaRlCILocal = "=PRŮMĚR(R1C3:R10C3)"

V některých speciálních případech je nutné za běhu makra vyzvat uživatele, aby do určité buňky doplnil vzorec sám. Metoda FunctionWizard spustí Průvodce funkcí pro určitou buňku, takže uživatel pak už jen vybere konkrétní funkci a doplní případné parametry. 1 metoda sama žádné parametry nemá Cel ls (2, 2).FunctionWizard

Práce s komentáři v buňce

Pro přidání komentáře (poznámky) do buňky je k dispozici metoda AddComment. Příklady byly uvedeny v tabulce nejdůležitějších metod.

Mazání komentářů (poznámek) se provádí metodou ClearNotes, případně ClearCom-ments.

Automatické vyplnění určité oblasti

Jak jistě víte, Excel vám v uživatelském prostředí umožňuje automaticky doplnit určitou oblast v závislosti na hodnotách v jedné nebo několika buňkách. Tuto činnost můžete provádět i programově metodou AutoFi l l .

Uvedenou metodu vždy spouštíte na zdrojové oblasti, která určuje počáteční hodnotu řady. Zdrojovou oblastí může být jedna nebo dvě buňky. Jako povinný parametr d e s t i n a t i o n zadáte cílovou oblast, která se má vyplnit dalšími hodnotami z řady.

Druhý nepovinný parametr type stanoví typ vyplnění, je-li ovšem jasně určen zdrojovou oblastí, zadávat ho nemusíte.

Range("A7:A8").AutoFill Destination:=Range("A7:A15")

Tato ukázka doplní do buněk A9:A15 řadu hodnot podle hodnot z buněk A7:A8. Na ob-rázku vidíte výsledek v případě, že zdrojové buňky obsahují čísla 1 a 5.

Druhý příklad kódu si již prakticky vyzkoušejte sami. Jestliže v buňce A7 bude datum, vyplní kód buňky A8:A15 řadou pracovních dnů.

Range("A7").AutoFill Dest inat ion:=Range("A7:al5") , Type:=xlFillWeekdays

Cílová oblast musí vždy obsahovat i zdrojovou oblast.

Page 126: 00-vba1 - Kopie

128

A I 6 7 1 B 5 9 9 10 13 11 1 7 12 21 13 25 14 29 15 33

O d k a z na speciální oblasti buněk

V mnoha případech je potřeba provést nějakou operaci jen s určitými buňkami v oblasti (vyplnit prázdné apod.). V takovém případě přijde ke slovu např. metoda Specia lCel ls , která vrací odkaz na objekt Range, složený ze „zvláštních" buněk.

Specia lCel ls (Type, Value)

První parametr stanoví, o jaké buňky půjde, druhý upřesňuje typ hodnoty u dvou hodnot parametru prvního (xlCellTypeConstants nebo xlTypeFormulas). V případě, že me-toda nenajde žádné buňky vyhovující zadaným kritériím, vyvolá chybu za běhu programu č. 1004, kterou je třeba ošetřit (podrobnosti se dozvíte v kapitole Jak řešit chyby").

Význam jednotlivých konstant je popsán v další tabulce:

Konstanta Význam xlCellTypeAUFormatConditions Buňky s nastaveným podmíněným formá-

továním. xlCel lTypeAUValidat ion Buňky s nastavenými pravidly pro ověřo-

vání. xlCellTypeBlanks Prázdné buňky (pracuje jen s použitou

oblastí listu!). xlCellTypeComments Buňky obsahující poznámky. xlCellTypeConstants Buňky obsahující konstantní hodnotu. xlCellTypeFormulas Buňky obsahující vzorce. xlCellTypeLastCell Poslední buňka v použité oblasti listu. xlCellTypeSameFormatConditions Buňky se shodným podmíněným formá-

továním. xlCellTypeSameValidation Buňky se stejnými pravidly pro ověřování. x lCel lTypeVisible Všechny viditelné buňky.

Následující ukázka kódu má dvě části - první vybarví všechny prázdné buňky v použité oblasti jinou barvou, druhá převede všechny vzorce v buňkách aktivního listu na kon-stantní hodnoty.

Ac t iveShee t .Ce l l s .Spec i a lCe l l s ( x lCe l lTypeBlanks ) . In te r io r .Co lor lndex = 7

For Each buňka In Act iveSheet .Cel ls .Specia lCel ls (x lCel lTypeFormulas) buňka.Copy

7 . Pracujeme s objektem Ran

Page 127: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

buňka .Pas teSpecia l Pas te :=xlPasteValues Next Application.CutCopyMode = Falše

Převod vzorců na hodnoty je třeba provádět po jednotlivých buňkách, protože nesouvislý výběr nelze kopírovat do schránky.

Prohledávání a zaměňování obsahu buněk

Jde o dvě činnosti, které jsou hodně příbuzné (i v prostředí Excelu máte z dialogového okna Najít přímý přístup k oknu Nahradit), ovšem metody používané pro obě činnosti se svou syntaxí liší velmi zásadně. Příčinou je fakt, že při nahrazování prostě projdete určitou oblast, zatímco při hledání je nějaká oblast buněk metodou Find vrácena. A pozor, při hledání není vrácena oblast obsahující všechny buňky odpovídající kritériu pro hledání, ale jen první buňka.

Metoda Find (hledání) má několik parametrů, povinný je jen první z nich:

oblas t .Find(What , [Af t e r ] , [Lookln], [LookAt], [SearchOrder], [SearchDirec t ion] , [MatchCase], [MatchByte])

Protože tato metoda vrací oblast buněk, musíte ji v kódu vždy použít s příkazem Set:

Set prvni_nalezena_bunka = prohledavana_oblas t .F ind(" text_který_hledám")

V předchozím řádku vidíte, že metodu Find spouštíte vždy na oblasti, kterou chcete prohledat.

Protože metoda Find vrací odkaz jen na první nalezenou buňku, je hledání nutné zopako-vat v cyklu, dokud neprojdete celou prohledávanou oblast. A tady narážíme na další past - hledání nezačíná od první buňky prohledávané oblasti, ale až od druhé! Parametr Af te r umožňuje v případě potřeby zadat jinou buňku, za kterou prohledávání začne. (Pokud tento parametr vynecháte, začne prohledávání až za pivní buňkou.)

Hledání dalších hodnot provádějte metodou FindNext (pro hledání opačným směrem FindPrevious). Tyto dvě metody pokračují v hledání započatém metodou Find a jejich jediným parametrem je buňka, od které mají hledat; touto bLíňkou bude buňka vrácená předchozím voláním metodou Find nebo FindNext.

Díky tomu je pro úplné prohledání určité oblasti buněk nutné použít cyklus. V následu-jící ukázce vidíte proceduru, které předáte prohledávanou oblast a hodnotu, již hledáte. Procedura postupně všechny odpovídající buňky přiřadí do oblasti nalezeno a tu nakonec vybere:

Sub Proh leda tOblas t (p roh lede j As Range, hled_hodnota As Str ing) Dim nalezeno As Range, vyhov As Range Dim prvni_adresa As S t r ing

' h ledáni prvni buňky Set vyhov = prohledej .F ind(hled_hodnota) ' j e s t l i ž e byla prvni buňka nalezena If Not vyhov Is Nothing Then

E o

i .

o> O E

' uložime s i j e j i adresu prvni_adresa = vyhov.Address ' a př i řadíme buňku do c i lové o b l a s t i Set nalezeno = vyhov

Page 128: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

' zde začne cyklus Do

' hledáme d a l š í hodnoty Set vyhov = prohledej.FindNext(vyhov) If Not vyhov Is Nothing Then

Set nalezeno = _ Appl icat ion.Union(nalezeno, vyhov)

End If 1 cyklus opakujeme až do t é doby, ' kdy metoda j i ž n ic nenajde, nebo 1 dokud se nevrátíme k první nalezené buňce

Loop While Not vyhov Is Nothing And _ vyhov.Address <> prvni_adresa

End If

1 vybereme ob la s t buněk, ve kterých jsou hledané hodnoty, ' pokud nějaké buňky nalezeny byly If Not nalezeno Is Nothing Then na lezeno .Se lec t

End Sub

V případě, že metoda Find nic nenajde, vrátí hodnotu Nothing. Tato speciální hodnota ruší konkrétní odkaz na nějaký objekt a v tomto případě znamená, že žádný podobný objekt (buňka obsahující vyhledávaný text) neexistuje. Protože však stále jde o objektovou proměnnou, nemůžete použít prosté porovnání nalez = Nothing, ale porovnání objektů (nalez I s Nothing).

Další nepovinné parametry metody Find si přiblížíme v souhrnné tabulce:

Parametr Popis Lookln Umožňuje zadat, zda budou prohledávány hodnoty, vzor-

ce, nebo komentáře. LookAt Určuje, zda hledaný řetězec musí přesně odpovídat hod-

notě buňky (xlWhole) nebo zda může být jen částí hod-noty (xlPart) .

SearchOrder Určuje pořadí hledání - po sloupcích (xlByColumns) nebo po řádcích (xlByRows).

SearchDirect ion Určuje, zda hledání probíhá směrem dopředu (xlNext) či dozadu (xlPrevious).

MatchCase Citlivost na velká/malá písmena. Výchozí hodnota Falše nedělá rozdíl mezi malými a velkými písmeny.

SearchFormat Formát prohledávaných buněk.

Dejte pozor na to, že použité hodnoty parametrů Lookln, LookAt a SearchOrder se ukládají a jsou použity při příštím hledání! Jestliže tedy dočasně změníte výchozí hodnotu některého z nich pň hledání, musíte ji pň dalším volání znovu vrátit na původní hodnotu.

Zaměňování obsahu buněk je mnohem jednodušší, protože metoda Replace nevyžaduje žádné cykly a podobné neočekávané záležitosti - prostě se chová „slušně".

Page 129: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

oblast .Replace(What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat])

Prohledáni oblasti buněk se dá provést i pomoci funkce pracovního listu Match (POZVY-HLEDAT), která má tři parametry: co hledám, kde hledám, a třetí parametr stanoví, jakým způsobem je prohledávaná oblast seřazena. Funkce vrací číslo řádku v prohledávané oblasti, v němž leží první buňka obsahující hledaný text.

FLinkce pracovního listu Match má jednu zásadní nevýhodu: prohledávat můžete jen jeden sloupec nebo řádek. Naopak výhodou je vyšší rychlost prohledávání oproti metodě Find.

Nenajcle-li funkce Match žádnou vyhovující buňku, vrátí chybovou hodnotu, jejíž existenci můžete testovat pomocí funkce Visual Basicu IsError . Konkrétní ukázka použití funkce Match tedy vypadá takto:

Set p roh leda t = Worksheets("Přehled").Range("A2:A50") c is lo_radku = Appl ica t ion.Match("dluh" , p roh leda t , 1) ' v př ipadě neúspěchu skončíme If I sEr ro r (c i s lo_radku) Then Exi t Sub

Podrobnosti o třetím parametru funkce Match najdete v nápovědě k funkci pracovního listu PO Z VYHLEDAT.

Význam parametrů je stejný jako u metody Find, použité hodnoty parametrů LookAt, SearchOrder a MatchCase se také ukládají a jsou použity při příštím volání. Chybí tu však parametr Af t e r , metodu tedy stačí zavolat jen jednoLi a ta projde celou oblast a zamění původní text (What) za nový řetězec (Replacement).

Se lec t ion .Replace What:="15", Replacement:="44", LookAt:=xlPart

Setřídění určité oblasti

Pro setřídění určité oblasti (ale i kontingenční tabulky) podle zadaného klíče slouží me-toda Sort.

'všechny parametry jsou nepovinné ob l a s t .So r t (Key l , Orderl , Key2, Type, 0rder2, Key3,

Order3, Header, OrderCustom, MatchCase, Or ien ta t ion , SortMethod, DataOptionl, DataOption2, DataOption3)

První skupina parametrů určuje sloupec, podle kterého se bude třídit (Key) a pořadí řazení (Order, vzestupně = xlAscending, sestLipně = xlDescending). Parametr Header umož-ňuje zadat, zda oblast bLiněk má záhlaví nebo ne (xlYes, xlNo a další hodnota xlGuess, kdy rozhodnutí necháváte na Excelu). Parametr MatchCase zapíná rozlišování velkých a malých písmen, parametr Or ien ta t ion určuje, zda se bude třídit shora dolů (po řádcích, výchozí nastavenO nebo zleva doprava (po sloupcích).

' ř azeni tabulky podle sloupce B, prvni sloupec t v o ř i záhlavi Range("AI") .CurrentRegion.Sort keyl:=Range("B1"),

order l :=xlDescending, header:=xlYes ' druhý možný způsob řazen i podle sloupce B Range("Al") .CurrentRegion.Sort keyl:=Columns(2),

order l :=xlDescending, header:=xlYes

Při seřazení oblasti na jiném než aktivním listu imisíte odkaz na list uvést rovněž v pa-rametru keyl (případně key2, key3). Pokud má tabulka záhlaví, můžete jako klíč zadat i buňku ze záhlaví, jde především o to, ve kterém sloupci je.

Page 130: 00-vba1 - Kopie

Worksheets ("Lis t5") .Range("Al") .Sor t keyl:=Worksheets("List5").Columns(2)

Vynecháte-li CurrentRegion, bude automaticky doplněn.

7 . 6 Formátování obsahu buněk Vzhled tabulek je záležitost, které mnozí uživatelé přikládají zbytečný význam a věnuji spoustu času pokusům o co nejdokonalejší podobu sešitu. Příliš mnoho formátu sice škodí, ovšem v žádném případě nemůžeme tuto oblast vynechat - to by prostě nešlo. Nejdříve si stručně probereme ty formátovací volby, které najdete v dialogovém okně Formát buněk.

Formát zobrazené hodnoty

Formát hodnoty zobrazené v buňce určuje vlastnost NumberFormat, která má na starosti nejen formát čísla, ale jakékoli hodnoty, kterou v buňce vidíte. Formát buňky můžete zjišťovat i nastavovat. V případě, že zjišťujete formát více buněk, které jsou formátovány různě, obsahuje vlastnost NumberFormat zvláštní hodnotu Null. 1 t e s t na hodnotu Null If IsNull(Range("Cl:C20").NumberFormat) Then

Jestliže funkce IsNul l v tomto případě vrátí True, pak mají buňky různé číselné formáty (nejméně dva).

Jaké hodnoty může tato vlastnost mít? Ty, které vidíte v dialogovém okně Formát buňky, když si v kategorii formátů čísel vyberete Vlastní. Několik ukázek pro českou verzi Excelu vidíte v dalších řádcích: 1 č í s l o , 2 d e s e t , místa Selection.NumberFormat = "#,##0.00" ' měna, 2 d e s e t , místa Selection.NumberFormat = "#,##0.00 $" ' datum Selection.NumberFormat = "d. mmmm yyyy" 1 datum + čas Selection.NumberFormat = "d/m/yy h:mm dop . /odp ." ' p rocenta na 2 des. místa Selection.NumberFormat = "0.00%" ' zlomky Selection.NumberFormat = "#"" ""???/???" ' t e x t Selection.NumberFormat = "@" ' t e l e f o n n í č í s l o Selection.NumberFormat = "[<=99999]### ##;## ## ##"

Bližší podrobnosti o možných hodnotách najdete v nápovědě Excelu (hesla „ Vlastní for-máty čísel pro text a mezery", „ Vlastní formáty čísel pro měnu, procenta a exponenciální zápis"a další).

Pokud nechcete hodnoty zadávat v anglické syntaxi, používejte vlastnost NumberFor-matLocal:

ActiveCell.NumberFormatLocal = "0,00 Kč"

Page 131: 00-vba1 - Kopie

Zarovnání obsahu buněk

Volby z druhé karty dialogového okna Formát buněk se z kódu VB A nastavuji několika vlastnostmi objektu Range - HorizontalAlignment (vodorovné zarovnáni), V e r t i c a l -Alignment (svislé zarovnáni), WrapText (zalomit text v buňce), Or ien ta t ion (orientace textu), Addlndent (přidat odsazeni - logická hodnota ano/ne), IndentLevel (úroveň odsazeni), ShrinkToFit (přizpůsobit obsahu buňky), MergeCells (sloučit buňky). Možné hodnoty si otestujte nahranými makry.

Vlastnosti písma

V objektovém modelu Excelu se na mnoha místech vyskytuje objekt Font, který před-stavuje vlastnosti písma, ať už pro buňky, části grafu, grafické objekty nebo jakýkoli jiný objekt, kde je možné vlastnosti písma nastavit. Koneckonců jsme na něj narazili už při nahrávání maker, že?

With Se lec t ion .Fon t .Name = "Aria l CE" .FontStyle = "tučné" .Size = 10 .S t r ike th rough = False .Supe r sc r ip t = False .Subscr ip t = False .Underl ine = xlNone .Colorlndex = 10

End With

jméno fontu tučné, kurziva, tučná kurziva v e l i k o s t p ř e š k r t n u t i horni index dolni index podt rženi barva

Vzpomínáte? Jestli ano, tak to je dobře. Jednotlivé vlastnosti si opět nastudujte z nahraných maker, není na tom nic těžkého.

Ohraničení písma

Tady se setkáváme s další kolekcí Visual Basicu - Bor der s. Když v dialogovém okně Formát písma prozkoumáte kartu Ohraničení, zjistíte, že oblast buněk může mít cel-kem osm různých zvýrazňovacích čar: čtyři na obvodu, jednu svislou a jednu vodorovnou uvnitř oblasti a dvě šikmé. Těchto osm možností je v kódu vyjádřeno osmi členy kolekce Borders.

Pro jednotlivé okraje můžete nastavit jejich vlastnosti, ze kterých si v příkladu uvedeme jen ty, které ovlivňují podobu ohraničení:

' změna v l a s t n o s t i levého okra je With Se lec t ion .Borders (x lEdgeLef t )

.LineStyle = xlContinuous 1 s t y l čáry

.Weight = xlThin ' t loušťka čáry

.Colorlndex = xlAutomatic 1 barva End With

Výplně buňky

Pro výplň buněk má objekt Range v sobě obsažen další objekt - I n t e r i o r („vnitřek"). Jeho základní vlastnosti si opět ukážeme na příkladu:

Page 132: 00-vba1 - Kopie

1 3 4 E X C E L 2 0 0 0 - 2 0 0 7

With S e l e c t i o n . I n t e r i o r .Colorlndex = 0 . P a t t e r n = xlDown

barva výplně vzorek

.Pat ternColor lndex = xlAutomatic ' barva vzorku End With

Automatický formát buňky

Jednou z často používaných formátovacích voleb - patři mezi nejrychlejší-je Automatic-ky formát, kdy si uživatel vybere přímo z předvolených formátů tabulek. V kódu Visual Basicu se automatický formát nastavuje metodou AutoFormat:

AutoFormat([Formát], [Number], [Font], [Alignment], [Border], [Pa t t e rn ] , [Width])

První parametr (není povinný, Excel může použít výchozí hodnotu) určuje název použité-ho formátu, další parametry jsou také volitelné a s jejich pomocí ovlivníte, které součásti příslušného formátu se uplatní.

Selection.AutoFormat Formát:=xlRangeAutoFormatLocalFormatl

Styly buněk

Upřímné řečeno nevím, zda styly někdo používá (většina lidí o nich neví, znají je pouze z Wordu), takže jen pro doplnění: pro formátování buněk se styly dají používat i v Excelu, teorii tu vysvětlovat nebudu, ukážeme si jen příklad ve VBA:

S e l e c t i o n . S t y l e = "Zelený"

Styly jsou v rámci sešitu uloženy v kolekci Styles, jednotlivé styly je možné přizpůsobovat nebo přidávat:

' nový s t y l ActiveWorkbook.Styles.Add Name:="Modrý" ' změna v l a s t n o s t í s ty lu With ActiveWorkbook.Styles("Modrý").Font

.Name = "Arial CE"

.Size = 10

.Bold = Falše End With

Formátování sloupců a řádků

Příkazy ovlivňující formátování sloupců a řádků (Formát —» Sloupec nebo Formát —» Řádek) jsou v objektovém modelu rozptýleny do různých vlastností.

Šířka sloupce a výška řádku jsou obsaženy ve vlastnostech ColumnWidth a RowHeight, ale kupodivu mají rozdílné jednotky. Šířka sloupce je vyjádřena počtem znaků, které se do ní vejdou, zatímco výška řádku je dána v bodech, což jsou stejné jednotky, s nimiž se potkáte u velikosti písma.

Zbylé formátovací vlastnosti si ukážeme na příkladu:

Select ion.Columns.AutoFit ' úprava š í řky č i výšky Selection.EntireColumn.Hidden = Falše 1 s k r y t í sloupce ActiveSheet.StandardWidth = 20 1 s tandardní š í řka sloupce

Page 133: 00-vba1 - Kopie

u éÂ' '

E X C E L 2 0 0 0 - 2 0 0 7 135 U metody AutoFit je třeba dát pozor na to, že ji musíte spouštět na celém řádku nebo sloupci, voláni ve tvaru Range ("Cl :C3") .AutoFit skonči chybou, zatímco zápis Ran-ge ("C1:C3") .EntireRow.AutoFit bude v pořádku. Rovněž skryti a zobrazeni sloupce či řádku se provádí na celém sloupci nebo řádku. Poslední vlastnost určující standardní šířku sloupce (StandardWidth) je vlastností celého listu.

7 . 7 Cvičení Ve složce Kap7 najdete sešit CvicenLxls, který obsahuje několik příkladů na procvičení lát-ky, probírané v této kapitole. Vyřešené procedury a funkce najdete v souboru Vysledky.txt. Připomínám, že moje řešení rozhodně není to jediné správné.

7 . 7 Cvičení

Page 134: 00-vba1 - Kopie
Page 135: 00-vba1 - Kopie

Pracujeme s objekty Workbook a Worksheet

Další čtyři objekty, které v makrech velmi často použijete, jsou Workbook (sešit) a kolekce Workbooks, dále Worksheet (pracovní list) a kolekce Worksheets. Z předchozích části knihy už znáte některá základní pravidla pro odkazy na tyto objekty, proto se (skoro) hned pustíme do konkrétních příkladů.

J a k jsou listy v sešitu vyjádřeny objektově?

Uvnitř objektu Workbook existuje několik kolekcí, které jsou objektovým vyjádřením listů uvnitř sešitu:

V Sheets - kolekce všech listů v sešitu. Možné použití: zjištění počtu listů v sešitu, tisk celého sešitu.

-Z Worksheets - kolekce všech pracovních listů v sešitu. Možné použití: práce s ob-lastmi buněk, výpočty, tvorba grafů, tisk různých oblastí apod.

V Charts - kolekce všech listů typu graf. Možné použití: práce s grafy.

U všech kolekcí můžete na jednotlivé členy odkazovat jejich názvem nebo pořadovým číslem.

9. 8. Pracujeme s objekty Workbook <

Page 136: 00-vba1 - Kopie

138 E X C E L 2 0 0 0 - 2 0 0 7

O d k a z y na aktivní sešit ci list

VBA obsahLije několik klíčových slov, která můžete použít jako přímý odkaz na aktivní sešit či list:

S ActiveWorkbook - odkaz na aktivní sešit. Můžete ho použít vždy, když pracujete s vlastnostmi či metodami aktivního sešitu.

v' Act iveSheet - odkaz na aktivní list, nezávisle na tom, zda jde o pracovní list nebo list typu graf.

Pozor, neexistuje žádné klíčové slovo ActiveWorksheetf J i <m V Act iveChar t - odkaz na aktivní graf, nezávisle na tom, zda jde o list typu graf

nebo graf vložený v pracovním listu.

-Z ThisWorkbook - odkaz na sešit, ve kterém běží dané makro. Zde ho uvádím jen pro úplnost, protože se používá při výrobě doplňků (doplněk nikdy nemůže být aktiv-ním sešitem). Lze jej však použít i tehdy, když sešit obsaliLijící makro je z nějakého důvodu skrytý (příkazem Okno —> Skrýt).

8.1 Pracovní listy V této části se podíváme na základní postupy, covními listy. Nejdříve se zaměříme na celou listy (Worksheet).

Kolekce Worksheets

které se vám budou hodit při práci s pra-kolekci Worksheets a poté je jednotlivé

Jak jsme si již řekli v úvodní pasáži, kolekce jsou výhodné ve všech případech, kdy chcete pracovat se všemi objekty stejného typu, případně když chcete některý z nich přidat nebo smazat. Kolekce nemívají mnoho metod ani vlastností, takže nebudete mít problém naučit se s nimi pracovat.

Kolekce Worksheets obsahuje všechny pracovní listy uvnitř sešitu. Začneme popisem vlastností, protože v tomto případě má význam jen jediná vlastnost Count, která vrací počet pracovních listů v sešitu (Worksheets . Count).

Přidávání pracovních listů

Pro přidání nového pracovního listu clo sešitu slouží metoda Add, která umožňuje určit místo v sešitu, kam bude nový list přidán (parametry Before nebo After) , dále si můžete zvolit počet listů (parametr Count; dá se tedy přidat více listů najednou), a dokonce je tu i parametr type, pomocí něhož volíte typ listu. Typ listu, když pracujeme jen s pracovními listy? Ano, je to tak, ty další možné typy jsou ovšem zachovány jen z ohledu na zpětnou slu-čitelnost se staršími verzemi Excelu, kde bylo zvykem pracovat s listy maker jazyka XLM.

Worksheets .Add([Before] , [ A f t e r ] , [Count], [Type])

V dalším řádku si všimněte, že list, za kteiý nebo před který bude nový list přidán, musí být vyjádřen objektově (nestačí pouze jeho název):

Page 137: 00-vba1 - Kopie

1 p ř i d á n í nového l i s t u za L i s t l l Worksheets.Add a f t e r : = W o r k s h e e t s ( " L i s t l l " )

Metoda Add vrací odkaz na nově přidaný list, proto se velmi často používá ve spojení s objektovou proměnnou, pomocí které můžete s novým listem ihned pracovat. To je ovšem možné i bez této proměnné, protože nově přidaný list se stane listem aktivním.

Dim ws As Worksheet Set ws = Worksheets. Add (before -.^Worksheets ( "Lis t í " ) ) ws.Name = "WWWW"

Worksheets.Add before :^Workshee t s ("Lis t l " ) ActiveSheet.Name = "WWWW"

Obě předchozí ukázky kódu mají stejný význam. Přidáte nový list a změníte jeho jméno. Jde to ovšem i jinak - když si uvědomíte, že metoda Add vrací odkaz na přidaný list, pak je možné s tímto novým listem pracovat rovnou ve stejném řádku!

Worksheets.Add(before:=Worksheets("Unor")).Name = "Leden"

Co tento řádek kódu provede? Přidá před list Unor nový list a přímo ho přejmenuje na Leden. Zdá se to příliš složité? Dobrá, ale ještě vám ukážu další často používanou zkratku, která se hodí:

With Worksheets.Add(before:=Worksheets("Leden")) .Name = "Rok 2007" .PageSetup.Or ienta t ion = xlLandscape .PageSetup.PrintArea = "A1:D20" .Range("Al") - "nějaká_hodnota"

Tady vidíte, jak současně s přidáním nového listu lze rychle nastavit více vlastností najed-nou. Význam jednotlivých vlastností si vysvětlíme za chvíli.

Odstraňování listů bude vysvětleno až u objektu Worksheet.

Další metody kolekce Worksheets

Všechny pracovní listy sešitu se dají zkopírovat do jiného nebo nového sešitu:

' v prvním př ípadě je vytvořen nový s e š i t Worksheets.Copy ' kopírování do j iného s e š i t u Worksheets.Copy af ter :=Workbooks("Seši t3") .Worksheets(1)

Obdobně se dá smazat i celá kolekce pracovních listů (Worksheets. Delete), pak by ovšem v sešitu musel být ještě alespoň jeden list jiného typu (graf, list maker XLM), protože jinak Excel oznámí chybu za běhu programu.

Zajímavější je metoda Fi l lAcrossSheets , která umožňuje „propsat" nějakou oblast na určitém listu do všech dalších pracovních listů.

Worksheets .Fi l lAcrossSheets Worksheets("Leden").Range("Al:C5")

V tomto případě se hodnoty z oblasti A1:C5 na listu Leden zkopírují do stejných oblastí na všech zbylých pracovních listech. Neobjeví se žádné varování. Druhý parametr type této metody umožňuje ovlivnit, co všechno se bude kopírovat (jen hodnoty, jen vzorce, obojí).

End With

Page 138: 00-vba1 - Kopie

Základní vlastnosti objektu Worksheet

V předchozí části jsme se věnovali kolekci, nyní se podíváme na jednotlivé listy. Jeho základní vlastnosti jsou vyjmenovány v následující tabulce:

Vlastnost Význam Cel ls Vrací odkaz na všechny buňky listu. Columns Vrací odkaz na všechny sloupce v listu. Rows Vrací odkaz na všechny řádky v listu. Next, Previous Vrací odkazy na další, resp. předchozí list v sešitu (včet-

ně listů typu graf!). ScrollArea Nastavuje oblast, kterou je možné procházet pomocí

posuvníků. Jiné buňky není možné vybrat. Nastavením na prázdný řetězec se znovu povolí procházení celým listem.

PageSetup Vrací odkaz na objekt PageSetup, který slouží pro nasta-vení vzhledu stránky.

DisplayPageBreaks Přepíná zobrazení konců stránky (automatických i ruč-ních).

HPageBreaks Vrací odkaz na kolekci vodorovných konců stránky. VPageBreaks Vrací odkaz na kolekci svislých konců stránky. StandardWidth, StandardHeight

Standardní šířka sloupců a výška řádků.

Pro tec tContents , P ro tec tScenar ios , ProtectDrawingObj e c t s

Logické hodnoty pro zjištění případného uzamčení listu.

Vi s ib le Zobrazí nebo skiyje list.

' s k r y t i l i s t u Act iveShee t .Vis ib le = Falše

Page 139: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Základní metody objektu Worksheet

Metoda Význam Act iva te Aktivuje daný list. Metodu je nutné použít jen v někte-

rých případech - např. pro vložení obsahu schránky s propojením.

Calcula te Přepočítá všechny vzorce na daném listu. Copy Zkopíruje list na jiné místo v sešitu nebo do jiného (no-

vého) sešitu. Move Přesune list na jiné místo v sešitu nebo do jiného (nového)

sešitu. Delete Odstraní list. Paste Vloží obsah schránky na aktivní list. Je možné určit mís-

to vložení nebo vytvořit propojení na původní data. Pas teSpecia l Vloží obsah schránky na aktivní list v určitém formátu. SaveAs Uloží celý list jako jiný soubor. P r in tou t Vytiskne daný list. PrintPreview Zobrazí list v náhledu. P ro tec t , Unprotect

Uzamkne list. Odpovídá příkazu nabídky Nástroje —> Zámek —» Zamknout list.

Zbylé metody si probereme v dalším dílu knihy. Ukázkám základních praktik pro práci s listy je věnován zbytek této části.

Odstranění listu

Excel se vás při ručním pokusu o smazání listu zeptá, jestli tuto akci skutečně chcete pro-vést. Vy toto okno hlášení musíte potvrdit tlačítkem OK, jinak list smazán nebude.

Microsoft Office Excel Ë 9

JÈS V listech vybraných k odstranění mohou existovat data. Chcete-li data trvale odstranit, stisknete klávesu Odstranit.

t lodiranj t J | Storno

Obr. 8.1: Jedno z výstražných oken hlášení Excelu

Protože však výstražná hlášení tohoto typu jsou často rušivá, přidávají se ještě v těchto případech další řádky kódu, které pomocí vlastnosti DisplayAlerts objektu Application potlačí veškerá varovná okna. Mazání listu by tedy v kódu mělo vypadat takto:

Appl i ca t ion .Disp layAle r t s = Falše Worksheets("Rok 2000") .Dele te Appl i ca t ion .Disp layAle r t s = True ' v l a s t n o s t j e nutné zapnout!!

Zkopírování nebo přesun celého listu

Potřebujete-li zkopírovat nebo přesunout celý list, použijete na požadovaném listu metodu Copy či Move. Metoda má jeden nepovinný parametr before nebo a f t e r (lze uvést vždy

8.1 Pracovní list

Page 140: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

jen jeden z nich, obdobně jako při přidáváni nového listu). Jestliže parametr vynecháte, je list zkopírován nebo přesunut do nového sešitu, kteiý Excel vytvoří. Pokud parametr uvedete, pak je list zkopírován či přesunut před (before) nebo za ( a f t e r ) list, jehož jméno udáte jako hodnotu parametru. Při kopírování nebo přesunu listu do jiného sešitu uvedete jeho název rovněž v tomto parametru:

ActiveSheet.Copy Worksheets("Leden").Copy before:^Worksheets("Celkem") Worksheets("Leden").Move after:^Worksheets("Celkem") Worksheets("Leden").Copy _

af ter :=Workbooks("data .xls") .Worksheets("Celkem")

První řádek zkopíruje aktivní list do nového sešitu, který Excel vytvoří. Ve druhém řádku máte příklad kopírování listu Leden před list Celkem ve stejném sešitLi. Třetí řádek pro-vede přesun listu Leden za list Celkem. A poslední řádek Likázky zkopíruje list Leden do sešitu data.xls, a to za list Celkem.

Vložení obsahu schránky na list

Příklad jsme si již Likazovali u objektu Range, nyní si jen doplníme další možné varianty s použitím metody Paste.

Prosté vložení obsahu schránky se zachováním formátu dat provedete metodou Paste. Metoda má dva parametry, v prvním (Destination) můžete zadat oblast, do níž bude obsah schránky vložen (když ho nezadáte, je použita aktuální oblast na cílovém listu). Druhým parametrem je logická hodnota, při jeho „zapnutí' vytvoříte propojení mezi zdrojovou a cílovou oblastí. PoLižít můžete vždy pouze jeden z parametrů, ne oba dva najednou.

Worksheets("Leden").Range("b7:b8").Copy Worksheets("Souhrn") .Paste _

Destination:=Worksheets("Souhrn").Range("Dl:D2")

Tyto dva řádky zkopírují obsah buněk B7 a B8 z listu Leden do buněk Dl a D2 na listu Souhrn. Kód můžete spoLištět nezávisle na tom, který list sešitu je právě aktivní.

Pozor - v parametru Destination musíte uvést i odkaz na cílový list. Pokud ho vynecháte, bude obsah schránky vložen do buněk Dl a D2 na aktivním listu (i když metodu Paste voláte z listu Souhrn)!

' n á s l e d u j í c í řádek v lož i obsah schránky vždy do akt ivního l i s t u Worksheets("Souhrn") .Paste Destination:=Range("Dl:D2")

Další příklad ukazuje propojení cílové a zdrojové oblasti:

Worksheets("Leden").Range("b7:b8").Copy Worksheets("Souhrn") .Range("dl") .Selec t Worksheets ("Souhrn") .Pas te Link:=True

V tomto případě je obsah buněk B7 a B8 na listu Leden vložen do buněk Dl a D2 na listu Souhrn s propojením obsahu. Jak bude toto propojení vypadat? Ti, kdo si myslí, že se vloží vzorce, se nemýlí1. Excel skutečně vloží do cílových buněk jen vzorce odkazující na původní zdrojovou oblast (=Leden! B7 a td . ) . Pokud by v ukázce byl vynechán druhý řádek, kteiý vybírá levou horní buňku cílové oblasti, byl by obsah schránky vložen do právě aktivní buňky a do buňky pod ní. Znovu připomínám, že v případě použití parametru Link není možné použít parametr Dest inat ion.

8. Pracujeme s objekty Workbook

Page 141: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Vložení obsahu schránky na list v určitém formátu

Pro případ, že chcete vložit obsah schránky v určitém formátu (pochopitelně jiném než výchozím, jinak vám stačí metoda Paste) je ve VBA metoda PasteSpecial . Tu jsme si již ukazovali u objektu Range, jenže zde má zcela jinou syntaxi. Od metody Paste se liší svými parametry. Konkrétní formát zadáváte jako textový řetězec v parametru Formát.

Worksheets ("Pracovní") .Pas teSpecia l Formát:="Text", l ink:=True

Tento řádek vloží obsah schránky do aktuální buňky na listu Pracovní jako obyčejný text a vytvoří propojeni na původní zdroj dat. Parametr Formát je tedy textový, parametr Link má logickou hodnotu. 2 dalších parametrů metody Pas teSpec ia l se zmíním alespoň o parametru DisplayAsIcon, což je opět logická hodnota, určující, zda se obsah schránky vloží jako ikona (True) nebo ne.

Vytištění listu a t i s k o v ý náhled

Metodu PrintOut můžete použít pro tisk jediného listu i pro tisk celého sešitu. Parametry jsou v obou případech shodné.

Parametr Význam From, To Tisk od určité stránky (From) do určité stránky (To). Copies Počet kopií. Preview Logická hodnota, má-li hodnotu True, zobrazí Excel před

tiskem ještě náhled. Ac t i veP r in t e r Jméno použité tiskárny. Co l l a t e Logická hodnota, umožňující zapnout kompletaci vytiště-

ných listů.

Všechny parametiy jsou nepovinné. Ukážeme si několik příkladů:

Act iveSheet .Pr in tOut Act iveSheet .Pr in tOut Copies:=3 Col la te :=True Worksheets("Souhrn") .PrintOut From:=2

První řádek kódu vytiskne jednou celý aktivní list. Ve druhém řádku jsou vytištěny tři kopie aktivního listu a ty jsou kompletovány. Ve třetím řádku vidíte příkaz pro tisk listu Souhrn počínaje druhou stránkou, první je tedy vynechána.

Pro pouhé zobrazení tiskového náhledu na list slouží metoda PrintPreview, která nemá žádné parametry.

Uložení listu do souboru jiného typu

Jde o výjimečnou situaci, ale může se stát, že s daty uloženými v sešitu musí pracovat někdo, kdo nemá k dispozici Excel, případně se vyskytnou jiné důvody pro uložení listu v jiném formátu.

Excel dokáže velmi obstojně otevírat či ukládat soubory ve formátu DBF, DB, WK1, WK3 apod. Jedním z univerzálních formátů pro přenos dat je formát CSV, kdy jsou jednotlivé hodnoty od sebe odděleny středníky. Do souboru CSV je vždy možné uložit jen jeden list ze sešitu.

Page 142: 00-vba1 - Kopie

144 ActiveSheet.SaveAs Filename:="odkaz.csv", FileFormat:=xlCSV

Tento řádek kódu uloží aktuální list do souboru odkaz.csv. Metoda SaveAs zde používá dva základní parametry: FileName je název souboru (včetně cesty k němu), FileFormat je vestavěná konstanta Excelu, která určuje formát souboru. Seznam možných hodnot parametru FileFormat najdete v nápovědě k metodě SaveAs.

Ochrana listu proti změnám

Jak asi víte z běžné práce s Excelem, list nebo sešit můžete uzamknout, a chránit tak proti neoprávněným změnám. U listu si při zamknutí můžete vybrat, zda budou chráněny jen buňky (a grafy na listech typu graf), nebo také jiné grafické objekty (obrázky) či scénáře. Všechny tyto volby jsou u metody Protéc t vyjádřeny v podobě parametrů. U posledních verzí Excelu byl jejich seznam značně rozšířen, všechny parametry přitom odpovídají tomu, co lze vybrat v dialogovém okně Uzamknout list, jehož podobu pro Excel 2007 vidíte na obrázku.

Uzamknout list

0 Uzamknout list a obsah uzamčených buněk

Heslo k odemknutí listu:

[ O K ) [ Storno |

Parametr Význam Password Nepovinné heslo. DrawingObj ec t s Při nastavení na True budou zamknuty nakreslené gra-

fické objekty. Výchozí hodnotou je Falše. Contents Při nastavení na True budou zamknuty všechny uzamče-

né buňky na pracovních listech nebo celý graf na listu typu graf. Výchozí hodnotou je True.

Scenarios V případě nastavení na True budou zamknuty scénáře. Ne-lze použít u listů typu graf. Výchozí hodnotou je True.

UserInterfaceOnly Při nastavení na True bude zamknuto uživatelské roz-hraní s výjimkou maker. Při vynechání tohoto parametru jsou chráněna i makra.

AllowFormattingCells Při nastavení na True bude možné formátovat zamknuté buňky. Výchozí hodnotou je Falše.

8. Pracujeme s objekty Workbook <

Page 143: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Parametr Význam AllowFormattingColumns V případě nastavení na True bude možné formátovat

sloupce. Výchozí hodnotou je Falše. AllowFormattingRows Při nastavení na True bude možné formátovat řádky.

Výchozí hodnotou je Falše. AllowlnsertingColumns Při nastavení na True bude možné vkládat do zamčené-

ho listu nové sloupce. Výchozí hodnotou je Falše.

AllowlnsertingRows V případě nastavení na True bude možné vkládat do za-mčeného listu nové řádky. Výchozí hodnotou je Falše.

AllowlnsertingHyperlinks Při nastavení na True bude možné vkládat do zamčeného listu hypertextové odkazy. Výchozí hodnotou je Falše.

AllowDeletingColumns Při nastavení na True bude možné odstraňovat ze zam-čeného listu sloupce, ve kterých jsou všechny buňky odemknuté. Výchozí hodnotou je Falše.

AllowDeletingRows V případě nastavení na True bude možné odstraňovat ze zamčeného listu sloupce, ve kterých jsou všechny řádky odemknuté. Výchozí hodnotou je Falše.

AllowSorting Při nastavení na True bude možné řadit odemknuté buňky v zamčeném listu. Výchozí hodnotou je Falše.

Al lowFil ter ing Při nastavení na True bude možné měnit kritéria au-tomatického filtru (ale nebude možné ho zapnout či vypnout). Výchozí hodnotou je Falše.

AllowUsingPivotTables V případě nastavení na True bude možné v zamčeném listu používat kontingenční tabulky.

Následující řádek kódu uzamkne aktuální list a chrání ho před změnami v buňkách i scé-nářích.

Act iveSheet .Protéct Password:="karel", Contents:=True, Scenarios:=True

Zrušení ochrany zajistí metoda Unprotect, u které jako parametr zadáváte jen heslo (po-kud jste ho při zamykání použili). V případě, že heslo existuje a vy ho při rušení ochrany vynecháte, budete vyzváni k jeho zadání. (Pozor, při odemykání celého sešitu je to trochu jinak, tam při vynechání hesla metoda Unprotect selže!)

ActiveSheet.Unprotect Password:="karel"

Stav uzamčení listu se dá testovat především pomocí vlastností ProtectContents, Pro-tectScenarios , ProtectDrawingObjects a ProtectionMode, které vrací hodnotu True v případě, že list je chráněn proti daným typům změn. Takže kód pro bezpečné vložení obsahu schránky by mohl vypadat třeba takto:

If Not Act iveSheet .ProtectContents Then ActiveSheet .Paste

End If

Obsah schránky bude vložen jen v případě, že není zapnuta ochrana obsahu listu. V tomto případě ovšem nevložíte obsah schránky ani do buněk, které by zůstaly odemčeny (příkaz

8 . 1 Pracovní listy

Page 144: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

Formát buněk —> Zámek, zrušit poličko Zamknout buňky), protože provádíte jen test uza-mčeni celého listu. Kontrola uzamčeni jednotlivých buněk proti změně by vypadala jinak:

' když není l i s t uzamčen If Not Act iveSheet .Pro tec tContents Then

Act iveShee t .Pas te ' j e možné v l o ž i t ' když j e l i s t zamčen, a le buňka ne, E l se l f Not ActiveCell .Locked Then

Act iveShee t .Pas te ' rovněž lze v l o ž i t Else

MsgBox "Obsah schránky nelze do l i s t u v l o ž i t " End If

Nejdříve ověříme, zda je celý list chráněn či ne. Neni-li, vložíme obsah schránky. Jestliže je list chráněn, pokračuje kód řádkem Else l f Not. . ., kde ověříme, zda buňka, do které chceme obsah schránky vložit, není uzamčena. V případě, že je, kód zobrazí okno hlá-šeni a pokračuje dále. Zde ovšem testujeme jedinou buňku, v praxi byste si kód museli upravit.

Nejnovějši verze Excelu, které maji rozšířené volby pro uzamykáni listu, přidávají k objektu Worksheet také vlastnost Protec t ion , která vrací objekt Protec t ion , jehož vlastnosti dovoluji zjistit, které operace jsou v uzamčeném listu povoleny. V následující ukázce vidíte, jak v proceduře zkontrolovat, zda je možné formátovat buňky. Jestliže není list uzamčen (Not Act iveSheet . ProtectContents) nebo je-li možné v zamčeném listu formátovat buňky (AllowFormattingCells = True), proběhne jistá formátovací operace. Poznáte už sami, jaká? (Odpověď na hádanku najdete na konci kapitoly.)

If Not Act iveShee t .Pro tec tConten ts Then Range("al") .CurrentRegion.Columns(1) .Font .Bold = True

E l se l f Act iveSheet .Pro tec t ion .Al lowFormat t ingCel ls Then Range("al") .CurrentRegion.Columns(1) .Font .Bold = True

End If

8.2 Práce s objektem PageSetup a tisk listů Objekt PageSetup je obsažen v každém objektu Worksheet, a reprezentuje nastavení vzhledu stránky. Odkaz na něj získáte pomocí stejnojmenné vlastnosti PageSetup, kterou mimochodem má i objekt Chart.

Vlastnosti tohoto objektu jsou souhrnně uvedeny v další tabulce:

Vlastnost Popis LeftMargin, RightMargin, TopMargin, BottomMargin

Okraje stránky (levý, pravý, horní, dolní).

HeaderMargin, FooterMargin

Vzdálenost mezi hranou papíru a okrajem záhlaví.

Or i en ta t ion Orientace papíru (na výšku, na šířku). PrintArea Tisková oblast (způsob zadávání probereme dále).

V C 8. Pracujeme s objekty Wor!

Page 145: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 147

Vlastnost Popis CenterHor izonta l ly , Cen te rVer t i ca l l y

Nastavuje centrování listu na vytištěné stránce (vodo-rovné a svislé).

LeftHeader, CenterHeader, RightHeader

Nastavení jednotlivých částí záhlaví (levá část, střed, pravá část).

Lef tFoo te r , CenterFooter , RightFooter

Totéž pro zápatí.

Zoom Nastavuje zvětšení/zmenšení listu při tisku v pro-centech.

FitToPagesWide Nastavuje přesný počet stránek na šířku pro tisk listu (odpovídá volbě Přizpůsobit na... v okně Vzhled stránky).

FitToPagesTall Nastavuje přesný počet stránek na výšku pro tisk listu. BlackAndWhite Má-li hodnotu True, bude tisk probíhat černobíle (tj.

barvy budou převedeny na odstíny šedé už Excelem). Draf t Má-li hodnotu True, nebudou se tisknout grafické

objekty. PrintHeadings Přepínač tisku záhlaví řádků a sloupců. Pr intTi t leColumns, PrintTit leRows

Umožňují nastavit číslo řádku nebo písmeno sloupce, které se budou tisknout na každé stránce.

FirstPageNumber Nastavuje číslo pivní stránky.

Z m ě n a orientace papíru

Vlastnost Or i en t a t i on se vyskytuje u více objektů, nicméně u objektu PageSetup je její vyznám jasný. Listy tisknete bud „nastojato" nebo „naležato" a konkrétní podobu můžete nastavit právě touto vlastností, která může nabývat dvou hodnot: x l P o r t r a i t a xlLand-scape:

' t i s k na leža to Workshee t s ( "L i s t í " ) .PageSe tup .Or ien ta t ion = xlLandscape

J a k nastavit okraje stránky

Ani zde nepůjde o nic těžkého, jen je třeba dát pozor na měrné jednotky. Vlastnosti LeftMargin, RightMargin, TopMargin a BottomMargin nastavujete ve VBA na body (points), ne na centimetry, jak jste zvyklí z dialogového okna Vzhled stránky. Abyste si nemLiseli pamatovat, kolik bodů se vejde do jednoho centimetru, nabízí vám Excel me-todu CentimetersToPoints, která příslušný převod provede. Tato metoda se spouští na objektu Appl icat ion:

Sub ZmenHorniOkrajStránky() dim výzva, ok ra j výzva = "Zadej v e l i k o s t horní okra j s t ránky"

8 . 2 Práce s objektem PageSetup ...

Page 146: 00-vba1 - Kopie

148 E X C E L 2 0 0 0 - 2 0 0 7

okra j = Applicat ion.InputBox(výzva, Type:=l) ActiveSheet.PageSetup.TopMargin = _

Appl ica t ion .Cent imetersToPoin ts (okra j ) End Sub

V proceduře nejdříve uživatele vyzvete k zadáni nové hodnoty pro horní okraj stránky (v centimetrech). Metodu InputBox jsme již probrali dříve. V druhém řádku pak metoda CentimetersToPoints provede převod zadaných centimetrů na body a ty pak přiřadíte vlastnosti TopMargin.

Body jako jednotky velikosti musíte poLižít LI všech vlastností pro okraje, včetně Header-Margin a FooterMargin.

J a k v y m e z i t tiskovou oblast listu

Nachází-li se na jednom listu více tabulek a chcete pokaždé tisknout jen některou z nich, můžete do listu umístit tlačítka a každému přiřadit makro pro tisk dané tabulky.

Act iveSheet .PageSetup.Pr intArea = "C5:H20" Act iveSheet .Pr in tOut Copies:=5

První řádek nastaví tiskovou oblast stránky, druhý vytiskne daný list v pěti kopiích.

Zvětšení ci zmenšení obsahu listu při tisku

Hned zpočátku upozorňuji, že tyto změny nastavení vzhledu stránky není příliš vhodné provádět pomocí makra, protože se můžete dočkat nežádoucích výsledků (rozdělené tabulky apod.). Pokud však někdy tuto činnost provádět budete, pak vlastní kód není nijak složitý.

Vlastnost Zoom nastavuje zvětšení či zmenšení listu v procentech. Následující řádek kódu zmenší při tisku aktivní list na 70 %:

ActiveSheet.PageSetup.Zoom = 70

Jestliže vlastnost Zoom nastavíte na hodnotu Falše, můžete pro řízení zvětšení či zmenšení použít vlastnosti FitToPagesWide a FitToPagesTall . Následující kód nastaví list tak, že bude tisknut na tři stránky vodorovně a dvě stránky svisle.

With Worksheets("Souhrny roku").PageSetup .Zoom = Falše ' v l a s t n o s t Zoom je t řeba vypnout .Fi tToPagesTall = 2 ' počet s t r a n s v i s l e .FitToPagesWide = 3 ' počet s t r a n vodorovně

End With

Vložení ručního konce stránky

Chcete-li do listu vložit ruční zalomení konce stránky, použijte následující kód:

ActiveSheet.HPageBreaks.Add Before:=Range("A20") Worksheets("Souhrn").VPageBreaks.Add Before:=ActiveCell

První řádek kódu vloží vodorovný konec stránky mezi 19. a 20. řádek aktivního listu. Druhý řádek kódLi vloží na list Souhrn svislý konec stránky vlevo od aktuální buňky.

V obou řádcích používáme vlastnosti HPageBreaks a VPageBreaks, které vrací odkaz na kolekci konců stránek (vodorovných nebo svislých). V těchto kolekcích je použita

8 . Pracujeme s objekty Workbook a

Page 147: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 1 4 9

jejich jediná metoda Add s parametr Before, který udává buňku, před kterou bude konec stránky vložen.

Odstraněni ručních konců stránek se dá nejrychleji provést zavoláním metody ResetAl l -PageBreaks na objektu Worksheet:

Worksheets("Souhrn").ResetAllPageBreaks

Jak zjistíte celkový počet stran, na které bude list vytištěn? To je velmi jednoduché:

Function PocetLis tu(x As Worksheet) PocetListu = _

(x.HPageBreaks.Count + 1 ) * (x.VPageBreaks.Count + 1 End Function

Vzhledem k tomu, že jednotlivé objekty HPageBreak a VPageBreak spolupracují s tiskovým ovladačem, může jejich používání v kódu výrazně zpomalit rychlost provádění procedury.

8 . 3 Pracujeme se sešity Pokud se vám zdá, že se sešity příliš často pracovat nebudete, nenechte se mýlit. Přidáni a otevřeni sešitu je možné v jazyku VBA jen pomoci kolekce Workbooks. Jednotlivé sešity budete muset někdy ukládat, odesílat elektronickou poštou, chránit proti změnám... Je toho dost. Stejně jako u pracovních listů začneme i nyní ukázkami využiti celé kolekce.

Kolekce sešitů Workbooks

Tato kolekce představuje všechny sešity otevřené uvnitř Excelu (s výjimkou doplňků, ty maji svou kolekci Addlns). Počet sešitů zjistíte pomoci vlastnosti Count, další vlastnosti jsou nevýznamné.

Debug.Print Workbooks.Count ' počet otevřených s e š i t ů

M e t o d y kolekce Workbooks

Je jich celkem osm, nejčastěji používané jsou asi čtyři: pro přidáni sešitu (Add), pro ote-vřeni sešitu (Open), pro uzavřeni všech sešitů (Close) a pro převod textového souboru s oddělovači do sešitu Excelu (OpenText).

U nového sešitu si můžete v metodě Add určit šablonu, jejíž obsah se do nového doku-mentu zkopíruje, případně můžete určit, že v novém sešitu bude jen jeden list určitého typu. Šablonou může být libovolný sešit, nemusí to být přímo soubor s příponou XLT (šablony Excelu).

' nový s e š i t , šablonou j e e x i s t u j í c í soubor Workbooks.Add "h : \makro .x ls" 1 nový prázdný s e š i t s jedním pracovním l i s tem Workbooks.Add xlWBATWorksheet

Druhý řádek kódu používá jednu z vestavěných konstant, které určují, jaký list bude v novém sešitu přítomen. Seznam těchto konstant najdete v heslu nápovědy „Microsoft Excel Constants".

118 8.3 Pracujeme se sešity

Page 148: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Jestliže nezadáte žádný parametr, vytvoří Excel nový sešit s několika pracovními listy (jejich počet je dán hodnotou vlastnosti Application.SheetsInNewWorkbook).

Otevření sešitu je také jednoduché, i když metoda Open má parametrů více než dost. Podstatné jsou však jen tyto: FileName (jméno sešitu, jediný povinný parametr), Update-Links (aktualizace propojení do jiných sešitů), Password (heslo pro otevření souboru), WriteResPassword (heslo pro zápis do souboru), ReadOnly (v případě, že chcete sešit otevřít jen pro čtení), Not i fy (pokud nelze soubor otevřít pro zápis, Excel vás automa-ticky uvědomí, až jiný Liživatel práci ukončí) a AddToMRU (přidat či nepřidat do seznamu naposled otevřených souborů v nabídce Soubor).

Workbooks.Open "H:\makro.xls" , upda te l inks : no t i fy :=True , password:="XXXXX", addtomru:=False

Tento příkaz otevře sešit makro.xls, uložený na disku H:. Sešit nebude přidán do seznamu naposled otevřených souborů. Je nutné zadat heslo pro jeho otevření.

V případě, že by uživatel měl otevřít sešit sám - jeho jméno dopředu neznáte - použijete metodu GetOpenFilename objektu Applicat ion:

'metoda v r a c í název i s cestou jmeno_souboru = _

Application.GetOpenFileName("Sešity Excelu, * . t x t " ) Workbooks.Open jmeno_souboru

Co říci o uzavírání souboru? Metoda Close použitá na kolekci Workbooks nemá žádný parametr, ale Excel vás samozřejmě vyzve k případnému uložení změn. Trochu jinak je to při uzavírání jednotlivého sešitu, protože si jednak můžete zvolit, zda uložit či neuložit provedené změny (parametr SaveChanges), jednak můžete sešit uložit pod jiným jménem (FileName):

Workbooks(1).Close SaveChanges:=True ' u ložení změn

Poslední metodu OpenText probereme až v druhém díle knihy.

Vlastnosti a metody objektu Workbook

Jaké nejčastější operace s jednotlivými sešity provádíte? Můžete je ukládat, odesílat poštou, tisknout... V následující tabulce jsou vyjmenovány základní vlastnosti objektu Workbook.

Vlastnost Popis Buil t inDocumentPropert ies Vrací odkaz na kolekci DocumentProperties, která

představuje všechny vestavěné vlastnosti sešitu (au-tor, klíčová slova, počet slov, čas posledního uložení apod.).

ConflictResolution Nastavuje způsob řešení konfliktů ve sdílených se-šitech.

DisplayDrawingObj ec t s Nastavuje způsob zobrazení tvarů (Shapes). FullName, Name FullName vrací úplný název souboru (včetně cesty

k němu), Name vrací jen název souboru. HasPassword Umožní zjistit, zda je sešit chráněn heslem. HasRoutingSlip Umožní zjistit, zda je sešit směrován pomocí elektro-

nické pošty.

Page 149: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 151

Vlastnost Popis KeepChangeHistory Umožni zjistit, zda je ve sdíleném sešitu zapnuté sdí-

leni změn (nastavením na True ho zapne). Mult iUserEdi t ing Vrací True, sešit je otevřen jako sdílený. Names Vrací kolekci názvů (pojmenovaných oblasti). Password, WritePassword

Nastavuje nebo vrací heslo, potřebné pro otevřeni se-šitu (Password) nebo zápis změn (WritePassword). (Při čtení se zobrazují hvězdičky, takže heslo je chrá-něno proti nepovolaným osobám.)

Path Vrací název složky (adresáře), ve které je sešit uložen. PrecisionAsDisplayed Má-li hodnotu True, jsou všechny výpočty prováděny

jen s přesností danou zapsanými hodnotami. P r o t e c t S t r u c t u r e , ProtectWindows

Umožňuje zjistit, zda je zapnuta ochrana sešitu.

Readonly Má-li hodnotu True, je sešit otevřen jen ke čtení. RoutingSlip Vrací odkaz na objekt RoutingSlip, který obsahuje

informace o směrování sešitu. Saved Má-li hodnotu Falše, nebyl sešit ještě po poslední

provedené změně uložen. SaveLinkValues Umožňuje uložit hodnoty externích propojení v se-

šitu. UserStatus Vrací pole ůdajů o všech uživatelích, kteří daný sešit

otevřeli jako sdílený.

V další tabulce najdete nejdůležitější metody objektu Workbook.

Metoda Popis AcceptAllChanges, Rej ectAUChanges

Schválí, resp. zamítne všechny změny ve sdíleném sešitu.

Act iva te Aktivuje daný sešit (= sešit se stane aktivním). AddToFavorites Přidá zástupce sešitu do složky Oblíbené. Close Uzavře sešit, viz kolekce Workbooks. FollowHyperlink Zobrazí určitý dokument. Pokud se nenachází na vašem po-

čítači, Excel sám zabezpečí jeho stažení. Lze využít i pro sou-bory na lokálním počítači.

LinkSources Vrací pole proměnných, v nichž jsou propojení (typu Excel, OLE a DDE).

MergeWorkbook Sloučí změny z nějakého sešitu do otevřeného sešitu. NewWindow Otevře nové okno sešitu. OpenLinks Otevře některý zdroj ůdajů, které jsou propojeny do daného

sešitu.

118 8.3 Pracujeme se sešity

Page 150: 00-vba1 - Kopie

Metoda Popis P r i n t o u t , Pr intPreview

Vytiskne sešit nebo zobrazí tiskový náhled.

P ro tec t Zapíná ochranu sešitu. Pozor, má jinou syntaxi pro listy a jinou pro sešity.

Pro tec tShar ing Uzamkne sešit jako sdílený se sledováním změn. RefreshAll Znovu načte hodnoty všech externích propojení a aktualizuje

kontingenční tabulky. Route Odešle dopis podle nastaveného směrování. Save Uloží sešit. Nepoužívejte ji pro první uložení nového sešitu

(neumožňuje zadat název souboru). SaveAs Uloží sešit pod zadaným názvem. SaveAsXMLData Na základě zadaného mapování exportuje data do souboru

XML. (Jen Excel 2003 a novější.) SaveCopyAs Uloží kopii sešitu do souboru, přičemž s původním sešitem

se nic neděje. SendMail Odešle sešit jako přílohu elektronické pošty. Unprotect Zruší ochranu sešitu. UpdateFromFile Aktualizuje sešit otevřený jen pro čtení ze stejného souboru

uloženého na disku. Hodí se v případech, kdy jeden sešit má otevřeno více uživatelů.

UpdateLink Aktualizuje určité propojení. WebPagePreview Zobrazí náhled na stránku, jak by vypadala po uložení do for-

mátu HTML. XmlImport, XmlImportXML

Importuje data XML, bud ze souboru (XmlImport) nebo z prou-du v paměti (XmlImportXml).

Z á k l a d n í p o s t u p y pro práci se sešity

Po „suchém" tabulkovém přehledu se na některé metody a vlastnosti podíváme prakticky.

Uložení sešitu

Pro ukládáni sešitu má VBA k dispozici tři metody, které se dají využít spolu s dalšími vlastnostmi nebo metodami.

Při prvním uložení nového sešitu je třeba zadat jeho jméno. To zajistíte bud pomocí kódu jako parametru metody SaveAs, nebo uživatele vyzvete k zadání názvu souboru (pak pro ukládání nového sešitu použijte metodu GetSaveAsFilename objektu Application):

soubor = _ Application.GetSaveAsFilename ( f i l eF i l t e r :="Seši ty , * .x l s" ) )

ActiveWorkbook.SaveAs soubor

Již uložený sešit nadále ukládejte metodou Save, která nemá žádné parametry. Třetí metoda SaveCopyAs se dá využít pro ukládání záložních kopií souboru:

8 . Pracujeme s objekty Workbook <

Page 151: 00-vba1 - Kopie

ActiveWorkbook.SaveCopyAs "C:\zaloha\kopie.XLS"

Pokud již záloha sešitu existuje, bude automaticky přepsána.

Odeslání sešitu elektronickou poštou

Excel umožňuje jednak odeslat sešit jako přílohu klasické zprávy elektronické pošty, jednak je možné sešit směrovat - v tom případě nejde odeslat více příjemcům najednou, ale od jednoho ke druhému. V pivním případě použijete metodu SendMail, která má tři parame-try: jména příjemců (proměnná typu Variant, která může obsahovat i pole proměnných), předmět zprávy a logickou hodnotu pro zpětné zaslání potvrzení o přijetí zprávy.

Sub PoslatUzaverku() jména = Array("Ivo Škrabal" , "Jan Kuliš") ActiveWorkbook.SendMail jména, "Roční uzávěrka", True

End Sub

Kromě metody SendMail existuje také metoda SendForReview, která odešle kopii sdíle-ného souboru k posouzení. Její parametr IncludeAttachment umožňuje zadat, zda má být recenzentům zaslána kopie souboru nebo jen odkaz na sdílené umístění souboru.

U směrování je postup trochu složitější, protože před vlastním odesláním (tentokrát meto-dou Routě) musíte ještě nastavit vlastnosti objektu RoutingSlip, který obsahuje všechny potřebné údaje.

Workbooks("Výkaz.xls").HasRoutingSlip = True With Workbooks("Výkaz.xls").RoutingSlip

.Del ivery = xlOneAfterAnother

.Rec ip ien t s = Array("Ivo Škrabal" , "Jan Kuliš")

.Subjec t = "Roční uzávěrka"

.Message = "Prosím z k o n t r o l u j t e všechny údaje " & "a potvrďte sp rávnos t . "

.ReturnWhenDone = True

.TrackStatus = True End With Workbooks("Výkaz.xls").Routě

Nejdříve musíte vlastnost HasRoutingSlip nastavit na hodnotu True, jinak odkaz na objekt RoutingSlip skončí chybou za běhu programu. Poté nastavíte všechny základní vlastnosti objektu RoutingSlip:

Repic ipents Pole proměnných obsahující jednotlivé příjemce. Nejsnad-nější způsob vytvoření je pomocí funkce Array.

Delivery Způsob doručení, a to bud jeden po druhém (xlOneAfte-rAnother), nebo všichni najednou (xlAHAtOnce).

Subject,Message Předmět a text zprávy.

ReturnWhenDone Logická hodnota určující, zda se sešit po dokončení oběhu vrátí k odesílateli.

TrackStatus Sledování stavu oběhu.

8 . 3 Pracujeme se sešity

Page 152: 00-vba1 - Kopie

Otevření jiných dokumentů

Pro rychlé otevřeni jiných typů dokumentů nebo webových stránek, případně pro přechod na určité místo dokumentu, použijte metodu FollowHyperlink.

ActiveWorkbook.FollowHyperlink " H : \ h r a . t x t " ActiveWorkbook.FollowHyperlink _

"h t tp : / /www.gradapubl ish ing .cz" ActiveWorkbook.FollowHyperlink _

"D:\dokumenty\vykaz.xls", "souhrn" ActiveWorkbook.FollowHyperlink _

"D:\dokumenty\hlaseni .doc", " t i t u l e k "

První řádek otevírá textový soubor v aplikaci Poznámkový blok, druhý řádek spustí we-bový prohlížeč a v něm otevře zadanou adresu. Na třetím řádku je otevřen jiný soubor Excelu a v něm je nalezena pojmenovaná oblast souhrn (nelze uvádět přímo odkazy na buňky). A konečně čtvrtý řádek spustí Word, v něm otevře příslušný dokument a přejde na záložku titulek.

Ochrana sešitu

Sešity se také dají chránit proti změnám, stejně jako pracovní listy. V tomto případě jsou však parametry metody Pro téc t jiné:

Protéct(Password, S t ruc tu r e , Windows)

U sešitu můžete uzamknout bud strukturu, nebo pozici oken. Strukturou se rozumí vzá-jemná pozice listů, při jejím zamčení není možné listy ani vkládat, ani mazat, přejmenovat nebo skrýt. Pokud chráníte okna, nemůžete měnit jejich velikost ani pozici na obrazovce, případně vytvářet nová okna.

' hes lo j e XXXX, obě ochrany zapnuty ActiveWorkbook.Protéct "XXXX", True, True

Zrušení ochrany provedete metodou Unprotect, na rozdíl od ochrany listu však dojde k chybě za běhu programu, jestliže vynecháte nastavené heslo. Pomocí vlastností Pro-t e c t S t r u c t u r e a ProtectWindows si můžete ověřit, zda je ochrana sešitu zapnuta.

Aktualizace propojení do jiných sešitů

Jsou-li v sešitu některé údaje uloženy ve formě propojení, můžete přímo v Excelu z nabíd-ky Úpravy otevřít dialogové okno Propojení, ve kterém vidíte seznam všech propojení a můžete zde ručně provádět aktualizace. (V Excelu 2007 jde o příkaz Upravit odkazy v rámečku Připojení na kartě Data.)

Page 153: 00-vba1 - Kopie

WĚĚĚĚĚfcĚkr ' : ' E X C E L 2 0 0 0 - 2 0 0 7 155

U p r a v i t p r o p o j e n ?

Zdroj Typ Aktualizovat Stav

Grafické karty.xls List

< Umístění: L: \Dokumenty Položka:

Aktualizovat: 0 Automaticky

Výzva pň spuštění...

> RuČne

[ Aktualizovat hodnoty

I Změnit zdroj...

[ Otevřít zdroj

[ Zrušit propojení

Zkontrolovat stav

Zavřít

Obr. 82: Rychlý přehled všech propojení do sešitu najdete v tom to dialogovém okně

Do sešitu můžete propojit údaje bud z jiných sešitů Excelu, nebo z dokumentů jiných aplikaci (OLE). V kódu jazyka na tato propojení odkazujete jako na pole proměnných, které získáte metodou LinkSources, u níž jako parametr zadáte tato propojení (Excel, OLE, u sdílených dokumentů i další typy):

odkazy = ActiveWorkbook.LinkSources(xlOLELinks) If Not IsEmpty(odkazy) Then

MsgBox "V dokumentu j e celkem " & _ UBound(odkazy) & " OLE propojen í"

End If

Aktualizaci z kódu můžete provést voláním metody UpdateLink, které předáte pole zís-kané předchozí metodou:

ActiveWorkbook.UpdateLink ActiveWorkbook.LinkSources(xlExcelLinks)

Toto byl příklad aktualizace všech propojení určitého typu, je však možné aktualizovat i jediné konkrétní propojení (ale pozor, musí mít nastavenu ruční aktualizaci!):

x = ActiveWorkbook.LinkSources(xlOLELinks) If Not IsEmpty(x) Then

ActiveWorkbook.UpdateLink x ( l ) , xlLinkTypeOLELinks End If

Obdobným způsobem je možné otevřít zdrojové dokumenty (metoda OpenLinks).

Vestavěné vlastnosti sešitu - kolekce DocumentProperties

Nejde o vlastnosti objektů, ale o vlastnosti sešitu - to jsou pomocné údaje, sloužící většinou pro statistické účely. Přímo v Excelu je můžete zadávat nebo zjišťovat v dialogovém okně Vlastnosti dokumentu (z nabídky Soubor zadejte příkaz Vlastnosti; v Excelu 2007 je jako vždy vše jinak, a musíte v hlavní nabídce Excelu jít do nabídky Připravit, kde je položka Vlastnosti).

- —

118 8 . 3 Pracujeme se sešity

Page 154: 00-vba1 - Kopie

156 E X C E L 2 0 0 0 - 2 0 0 7

Sešiti - vlastnosti

Obecné ] Souhrnné informace [ Statistické údaje Obsah Vlastní

Název: j Základy programování VB A

Předmět:

Autor: í Jaroslav Černý

Manažer:

Společnost: Jaroslav Černý

Kategorie: programování

Klíč. slova: j

Komentáře:

ZákJadhyp. odkazu:

Šablona:

O Uložit obrázek s náhledem

1 OK | [ Storno [

Obr. 83: Dialogové okno Vlastnosti dokumentu

V jazyku VBA jsou všechny vestavěné vlastnosti uloženy ve zvláštní kolekci DocumentPro-p e r t i e s . Odkaz na ni získáte pomoci vlastnosti Buil t inDocumentPropert ies.

Kolekce DocumentProperties se vyskytuje i v jiných aplikacích Microsoft Office. Ve všech případech má stejné členy, někteří z nich ovšem mají význam jen v určitých programech. Např. vlastnost Autor je k dispozici jak v Excelu, tak ve Wordu či PowerPointu, vlastnost Number of s l i d e s (počet snímků) má smysl jen v PowerPointu, vlastnost Total ed i -t i n g time zase ve Wordu.

Seznam vestavěných vlastností pro sešity Excelu najdete v heslu nápovědy k vlastnosti Buil t inDocumentProperties. Hodnotu každého uvedeného objektu v kolekci vlastností můžete zjišťovat nebo měnit přes její vlastnost Value.

Act iveWorkbook.Buil t inDocumentPropert ies("Tit le") .Value = "Nový název"

8.4 Odpověď na hádanku První sloupec tabulky, začínající v buňce AI, bude mít tučné písmo. (Hádanka ze str. 146.)

8.5 Cvičení Ve složce Kap8 najdete sešit Cviceni.xls, který obsahuje několik příkladů na procvičení lát-ky, probírané v této kapitole. Vyřešené procedury a funkce najdete v souboru Vysledky.txt. Připomínám, že moje řešení rozhodně

8. Pracujeme s objekty Workbook a

Page 155: 00-vba1 - Kopie

Objekt Application a jeho význam

Poslední objekt, kterému se v této knize budeme věnovat, představuje sám Excel. Je to objekt velmi významný, i když vám mnoho řádků v kódu nezabere.

Objekt Appl ica t ion existuje vždy, protože k tomu, abyste mohli v Excelu spouštět nějaký kód jazyka VBA, musí být spuštěna samotná aplikace. K čemu se používá? Hlavním účelem je nastavení určitých charakteristik a vlastností prostředí, které jsou společné všem sešitům, a v některých případech výrazně urychlují běh samotného makra.

9.1 Užitečné metody a vlastnosti objektu Application Vlastností i metod má tento objekt více než dost, a proto postup tentokrát otočím - nejdříve si vysvětlíme a prakticky předvedeme ty nejdůležitější vlastnosti a metody a teprve poté budou následovat přehledné tabulky. To aby se vám nezatočila hlava.

•íe § °

15" o O

9.1 Užitečné metody a vlastnosti.

Page 156: 00-vba1 - Kopie

J a k urychlit makro potlačením vykreslování změn

Kdykoli budete v makru vykonávat nějaké činnosti, jejichž výsledek se projevuje na mo-nitoru (přesun buněk či listů, vytvářeni nových sešitů, úprava grafů, kresleni tvarů apod.), je vždy lepši, když během prováděni makra potlačíte vykreslováni změn. Uvedu příklad - před několika lety jsem vytvářel aplikaci, která pomocí čar vykreslovala jízdní řád vlaků. List Excelu sloužil jako „plachta", na níž sloupce představovaly čas a jednotlivé řádky zase stanice. Celé makro nedělalo nic jiného, než že procházelo ohromnou tabulkou s jednot-livými časovými údaji a vykreslovalo do „plachty" jednotlivé čáry. Pro lepší představu se podívejte na obrázek:

Vlastní kód pro vypnutí překreslování obrazovky je nesmírně jednoduchý, vše se děje změnou hodnoty jediné vlastnosti objektu Applicat ion:

Sub ProceduraZatezuj iciObrazovku() Applicat ion.ScreenUpdating = Falše ' zde bude v l a s t n i kód Applicat ion.ScreenUpdating = True

End Sub

Potlačení některých výstražných dialogů

Toto téma zmíním jenom stručně, protože vlastnost DisplayAler ts jsme si již ukazovali, a to u odstraňování listů. Vypnutím této vlastnosti potlačíte některá varovná hlášení, která by jinak Excel za běhu makra zobrazoval. Ani zde nezapomeňte před skončením procedury tuto vlastnost opět zapnout!

Appl ica t ion .Disp layAler t s = Falše ' zde bude smazán l i s t Appl ica t ion .Disp layAler t s = True

Z o b r a z o v á n í z p r á v o průběhu makra

Zobrazování různých hlášení pro uživatele pomocí příkazu či funkce MsgBox je silně ne-praktické, protože uživatel musí tato okna ručně uzavřít.

9. Objekt Application a jeho význam

Page 157: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 15(

Excel proto umožňuje vypisovat hlášeni i do svého stavového řádku, tedy do vodorovného pruhu ve spodní části okna Excelu. Konkrétní text přiřazujete do vlastnosti StatusBar. Na konci procedury je nutné předat ovládáni stavového řádku zpět Excelu, jinak by tam váš poslední zadaný text zůstal nadále zobrazen. Kontrolu nad stavovým řádkem vrátíte Excelu tak, že jako hodnotu vlastnosti StatusBar zadáte Falše.

Sub R e n t a b i l i t a ( ) Appl ica t ion .S ta tusBar = "Probíhá výpočet r e n t a b i l i t y " ' zde bude v l a s t n í kod Appl ica t ion .S ta tusBar = Falše

End Sub

Jak bude vše vypadat, vidíte na obrázku. J . . , ,,

i< < • H i tístl, List2 List3 , <J _ Probíhá vypočet rentability

Z m ě n a tvaru ukazatele myši

Zkušený programátor ví", že u procedur, jejichž zpracováni trvá delší dobu, je slušnost dát nějak uživateli najevo, že si musí počkat. Z praxe víte, že ve většině aplikací se vám např. změní tvar ukazatele myši na přesýpací hodiny. Tuto změnu můžete provádět i vy, slouží k tomu vlastnost Cursor, která má čtyři možné hodnoty.

Appl ica t ion .Cursor = x lDefau l t ' výchozí nas tavení Appl ica t ion .Cursor = xlWait 1 přesýpací hodiny Appl ica t ion .Cursor = xlNorthwestArrow ' šipka Appl ica t ion .Cursor = xmIBeam ' textový kurzor

Vlastnosti prostředí Excelu

Vlastnosti prostředí najdete většinou v dialogovém okně Nástroje —> Možnosti (v Excelu 2007 ho vyvoláte tlačítkem Možnosti aplikace Excel v hlavní nabídce programu). Někte-ré zdejší volby se sice vztahují jen na konkrétní list či sešit, větší část jich však ovlivňuje celkové pracovní prostředí Excelu.

Protože těchto vlastností je mnoho, probereme si je v jednotlivých skupinkách.

Vlastnosti ovlivňující zobrazení částí Excelu DisplayFormulaBar, DisplayStatusBar

Zobrazení řádku vzorců a stavového řádku. Možné hodnoty True/Falše.

DisplayScrol lBars Zobrazení posuvníků pro všechny sešity. Možné hod-noty True/False.

DisplayNoteIndicator Zobrazení indikátorů komentářů a poznámek v buň-ce. Možné hodnoty True /Fa l se .

Disp lay lnser tOpt ions , DisplayPasteOptions

Zobrazování tlačítek Možnosti vložení a Možnosti vložení buněk. Možné hodnoty True/False.

DisplayRecentFí les Zobrazení seznamu naposledy otevřených souborů. Možné hodnoty True /Fa l se .

9 . 1 Užitečné metody a vlastnosti.. .

Page 158: 00-vba1 - Kopie

160 E X C E L 2 0 0 0 - 2 0 0 7 siiiasiii

Vlastnosti ovlivňující výpočty C a l c u l a t i o n Nastavuje režim přepočtu sešitu (automaticky, ruč-

ně, automaticky s výjimkou tabulek). U ručního režimu přepočtu můžete dále zapnout vlastnost Ca lcu la teBeforeSave , aby byl přepočet vždy proveden před uložením sešitu.

C a l c u l a t i o n l n t e r r u p t K e y Nastaví klávesu, kterou lze přerušit proces pře-počtu.

I t e r a t i o n Zapíná či vypíná používáni iterací pro řešení kru-hových odkazů. Možné hodnoty T rue /Fa l š e .

M a x i t e r a t i o n ,

MaxChange

Souvisí s předchozí vlastností. Jsou-li zapnuté itera-ce, umožňují tyto vlastnosti nastavit největší počet iterací a maximální povolenou změnu, pod kterou se iterace zastaví.

Vlastnosti pro výchozí nastavení prostředí S t a r t u p P a t h , A l t S t a r t u p P a t h

Primární a alternativní umístění spouštěcích sou-borů.

TemplatesPath Umístění složky s místními šablonami. AskToUpdateLinks Má-li hodnotu Falše, jsou propojení do jiných se-

šitů automaticky aktualizována při otevření sešitu. CellDragAndDrop Povoluje či zakazuje tažení a pouštění buněk myší.

Možné hodnoty True /Fa l še . D e f a u l t F i l e P a t h Výchozí složka pro otevírání souborů. DefaultSaveFormat Výchozí formát pro ukládání souborů. Možné hod-

noty jsou totožné s konstantami pro vlastnost F i l e -Format objektu Workbook.

E d i t D i r e c t l y l n C e l l Povoluje či zakazuje editaci hodnot přímo v buňce. MoveAfterReturn, MoveAfterReturnDirect ion

Povoluje změnu aktivní buňky po stisku klávesy EN-TER. Druhá vlastnost určuje směr posunu výběru.

ReferencesTYle Určuje styl odkazů - AI nebo R1C1 (hodnoty xlAl nebo xlRlCl).

SheetsInNewWorkbook Počet pracovních listů v novém sešitu. ShowToolTips Zobrazení rychlé nápovědy (tooltips). Možné hod-

noty True /Fa lse . ShowWindowsInTaskbar Zobrazení tlačítek v hlavním panelu pro každý ote-

vřený sešit. Možné hodnoty True /False . StandardFont , S tandardFontSize

Vlastnosti určující název fontu a velikost standard-ního písma.

UserName Jméno uživatele.

Page 159: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

M e t o d y objektu Application, které jsme již poznali

Během předešlého výkladu jsme již narazili na šest metod tohoto objektu, které byly v příslušných pasážích i popsány, takže zde uvedu jen stručný souhrn:

V Metoda Run - slouží pro spuštěni nějakého makra nebo procedury. Její výhodou je fakt, že dokáže spouštět procedury uložené v jiném sešitu nebo napsané v mak-rojazyku XLM. Stejně tak můžete zadávat název procedury jako proměnnou.

V Metoda InputBox - nabízí uživateli dialogové okno pro zadání nějaké hodnoty, kterou funkce vrátí. Umožňuje kontrolovat typ zadávané hodnoty.

S Metody GetOpenFileName a GetSaveFileName - zobrazí standardní dialogová okna pro otevření nebo uložení souboru a vrací jejich názvy včetně típlné cesty.

S Metoda Cent imeterToPoints - převádí hodnotu v centimetrech na body. Používá se u objektu PageSetup.

S Metoda Union - vrátí vícenásobnou oblast vytvořenou z několika oblastí.

V další části této kapitoly si probereme příklady použití některých dalších metod.

Přechod na jiné místo sešitu

I když jsme si již v začátcích zdůraznili, že buňky není nutné vybírat, abyste v nich mohli provádět některé operace, přesto se v některých situacích používají metody, které změní aktivní oblast sešitu. Typickým příkladem by byla procedura, která spočítá výsledky z ně-kolika listů a na závěr uživateli zobrazí nově vzniklou tabulku, která se může nacházet na zcela jiném listu či v jiném sešitLi.

Nejjednodušším způsobem, jak takový přesun zajistit, je metoda GoTo. Oproti metodě S e l e c t (která objekty jen vybírá) má několik výhod:

S Jestliže přejdete do oblasti buněk, která se nalézá na jiném než aktivním listu či v jiném sešitu, bude tento list aktivován (= bude vidět). Metoda S e l e c t oblast na jiném než aktivním listu sice označí, ale list zůstane dál neaktivní. Čili před metodoLi S e l e c t by bylo nutné použít ještě metodu Ac t iva te .

S Metoda GoTo má parametr s c r o l l , který po nastavení na True způsobí, že levý horní roh cílové oblasti bude automaticky zobrazen v levém horním rohu okna.

' přechod do l i s t u Souhrn Applicat ion.GoTo Reference:=Worksheets("Souhrn") .Range("D100")

M e t o d a O n K e y - spouštění procedury klávesovou zkratkou

Tato metoda přiřadí určité proceduře klávesovou zkratku, jejímž stiskem bude daná pro-cedura spuštěna. Začneme Likázkou, ve které jsou makrům přiřazeny klávesy F4 a Fl l . Všimněte si, že název kláves je uzavřen do složených závorek.

Application.OnKey "{F4}", "Makro4" Application.OnKey " { F l l } " , " R e n t a b i l i t a "

Metodu můžete volat několikrát, a vytvořit tak různé klávesové zkratky pro více maker. Nastavenou zkratku zrušíte tak, že metodu OnKey zavoláte znovu a vynecháte druhý parametr.

Applicat ion.OnKey "{F4}" 1 z ru šen i nas tavené kombinace

• • •

Page 160: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Pro vyjádřeni speciálních kláves (CTRL, ALT, SHIFT, klávesové šipky atd.) musíte používat zvláštní znaky. Jejich přehled najdete v heslu nápovědy k této metodě, zde ukážu jen několik příkladů:

' kombinace Shift+F7 Application.OnKey "+{F7}'\ "TiskVykazu" ' kombinace Ctrl+ŠIPKA DOLŮ Application.OnKey "A{D0WN}", "SkokNaKonecTabulky" ' kombinace Alt+Delete Application.OnKey "%{DELETE}", "VymazVse"

Klávesa SHIFT se tedy v této metodě zapisuje jako „+", CTRL jako „A" a klávesa ALT jako „%".

M e t o d a OnTime - spuštění procedury v určitý čas

Tato metoda se rovněž velmi často hodí, např. pro spouštění procedur v době, kdy na počítači nikdo nepracuje, nebo pro periodické spouštění vlastní procedury v určitém in-tervalu. Má celkem čtyři parametry, povinné jsou první dva.

Application.OnTime TimeValue("19:30"), "Zaloha"

Odvolat nastavené spuštění můžete opětovným voláním této proceduiy se zadaným para-metrem Schedule (ale pozor - musíte zadat přesný čas, na který je spuštění naplánováno, jinak dojde k chybě za běhu programu!):

Application.OnTime TimeValue("19:30"), "Zaloha", ,Fa l še

Poslední parametr (třetí v pořadí) umožňuje zadat čas, dokdy musí být procedura spuštěna. Pokud Excel není schopen ji do této doby provést, nebude již daná procedura spuštěna. Jestliže parametr vynecháte, čeká Excel neomezeně dlouhou dobu.

Periodické spouštění procedury v intervalu třeba 1 minuty se dá v kódu zajistit takto:

Sub Zaloha() ! zde bude kód procedury Application.OnTime Now + TimeValue("00:01"), "Zaloha"

End Sub

Pozastavení makra na určitou dobu

Běžící procedura VBA se dá na nějakou dobu pozastavit pomocí metody Wait. Po uplynutí nastavené doby vrátí metoda hodnotu True. Během této doby probíhají jen operace na pozadí (tisk), přístup uživatele k programům na počítači může být omezen nebo znemož-něn. Proto tuto metodu používejte jen v nezbytných případech.

If Application.Wait(Now + TimeValue("0:00:05")) Then ' kód, k te rý bude spuštěn po up lynut í 5 v t e ř i n

End If

Uložení pracovního prostoru

Dnes už tuto volbu málokdo používá, ale to je chyba uživatelů, ne Excelu. Pracovní prostor je soubor (s příponou XLW), do něhož Excel uloží názvy všech otevřených sešitů a rozmís-tění jejich oken. Díky tornu můžete rychle otevřít více souborů najednou - tím, že otevřete soubor pracovního prostředí, otevře Excel všechny soubory, které v něm jsou zapsány.

Page 161: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 163 Pracovní prostor uložíte metodou SaveWorkspace, spuštěnou na objektu Applicat ion. Příponu nezadávejte:

Application.SaveWorkspace Filename:= _ "C:\Dokumenty\Pracovni p r o s t ř e d í "

Ukončení Excelu

2 procedury VBA je možné také ukončit Excel. Metoda Quit, která to provede, nemá žádný parametr. Pokud máte otevřeny nějaké sešity s neuloženými změnami, zobrazí Excel dotaz, zda chcete změny uložit. Uvedenému se můžete vyhnout tak, že nastavíte vlastnost Disp layAler t s na hodnotu Falše; změny pak uloženy nebudou.

Appl i ca t ion .Qui t ' uzavře všechny s e š i t y a ukončí Excel

9.2 Zobrazení vestavěných dialogových oken Poslední téma, které si v této knize probereme, je způsob, jak můžete zobrazit vestavěná dialogová okna Excelu (Formát buněk, Možnosti, Vlastnosti dokumentu apod.). Ta jsou ve VBA dostupná v kolekci Dialogs objektu Applicat ion. Každý člen této kolekce má přiřazenu i vestavěnou konstantu, která zastupuje název dialogového okna (index se u kolekce Dialogs nedá použit).

£ E

** o

Formát buněk

Písrno i

Calíbrí fJt> Cambria (Nadpisy) vv

. ArnotdBoeckJinTTEE 'ijp Agency FB

Aharoni j f i Albertus Extra Boid v Podtržení:

|Žádné v 1 Efekty

Q Přeškrtnuté • Horní index O Dolní index

Řez písma: Velikost: Obyčejné 11

ISSS iSHBBHI 8 * Kurzíva Tučné Tučná kurzíva

9 10

12 14

Barva:

WĚĚĚĚĚHĚĚĚĚĚ v 0 Normální

Náhled

ÁáBbČčYyŽž

Toto je písmo TrueType. Stejné písmo bude použito na tiskárně i na obrazovce.

Obr. 92: Pomocí metody Dialogs můžete zobrazit jen určitou část dialogových oken

Jediná rozumná věc, která se s těmito dialogovými okny dá podniknout, je jejich zobrazení pomocí metody Show. Uživatel si pak může sám nastavit potřebné vlastnosti a dialogové okno uzavře tlačítkem OK.

MsgBox "Upravte s i v e l i k o s t písma podle svých potřeb" Act iveSheet .Range("AI") .CurrentRegíon.Select Appl ica t ion .Dia logs(x lDia logFontProper t ies ) .Show

zení vestavěných dialogových oken

Page 162: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7

První řádek upozorni uživatele, co má dělat, aby nebyl překvapen, když na něj znenadání „vybafne" nějaké dialogové okno. V druhém řádku vybereme oblast, která má být upravena a ve třetím Visual Basic zobrazí dialogové okno vlastností písma. Když se podíváte na obrázek tohoto okna, zjistíte jednu věc - nejde vlastně o okno Formát buněk, ale jen o jednu jeho kartu! Uživatel se pak nemusí zdržovat prohledáváním okna, a vidí přímo ty věci, které má měnit. Podobným způsobem se dají zobrazit i části jiných dialogových oken.

Když se podíváte v nápovědě na heslo popisující metodu Show, najdete v něm hypertextový odkaz na další heslo „BLiilt-In Dialog Box Argument Lists". K čemu je dobré? U většiny vestavěných dialogových oken můžete za metodoLi Show uvést ještě výchozí parametiy pro dané okno. V uvedeném hesle nápovědy máte jejich seznam.

Jaké hodnoty je možné do jednotlivých parametrů přiřazovat? Doporučuji vždy si nejdříve nahrát makro, které bude pracovat s požadovaným oknem, a v něm jednotlivé možné pa-rametry prozkoumat. Následující ukázka je obměnou předešlého příkladu. V okně Formát buněk bLide dopředu nastaveno písmo CoLirier New o velikosti 12 bodů.

App l i ca t i on .D ia logs (x lD ia logFon tP rope r t i e s ) .Show _ "Courier New CE", , 12

Metoda Show u dialogových oken vrací hodnotu True nebo Falše , podle toho, jestli uži-vatel okno zavřel tlačítkem OK nebo Storno. I to se dá někdy s úspěchem využít.

Ve složce Kap9 najdete sešit CvicenLxls, který obsahuje několik příkladů na procvičení lát-ky, probírané v této kapitole. Vyřešené procedury a funkce najdete v soLibom Vysledky.txt. Připomínám, že moje řešení rozhodně není to jediné správné.

Pozor, v tomto případě se nejedná o pojmenované parametry, takže musíte dodržet jejich pořadí.

9.3 Cvičeni

9. Objekt Application a jeho v]

Page 163: 00-vba1 - Kopie

Jak řešit chyby v makrech

Nikdy nepočítejte s tím, že se vám povede napsat procedury, která ve všech situacích po-běží bez chyb. V kapitole věnované nahrávání maker jsme si uvedli typický příklad chyby - makro odkazuje na oblast buněk, která neexistuje, protože jste při nahrávání použili relativní odkazy a makro spouštíte z jiné aktuální buňky, než z jaké jste ho nahráli.

Jestliže chyby nebudete nijak ošetřovat, zastaví případná chyba za běhu programu (mak-ra) celé makro VBA, a uživatel uvidí okno hlášení, které zobrazí číslo chyby a její popis. Správně by se však uživatel s těmito výchozími okny hlášení neměl nikdy setkat - už proto, že na ně může reagovat v podstatě jen ukončením makra, těžko lze očekávat, že by se podíval do vlastního kódu (tlačítkem Debug) a chybu bystře odhalil. Proto by všech-na makra měla obsahovat kód pro zachycení chyb a jejich následné „ošetření" pomocí vhodných činností. Když už nic jiného, tak by váš kód pro zpracování chyb měl zobrazit alespoň nějaké srozumitelné hlášení (výchozí hlášení VBA obvykle uživateli nic neřekne), a makro ukončit.

1 0 . Jak řešit chyby v makrech

Page 164: 00-vba1 - Kopie

M i c r o s o f t V i s u a l B a s i c

Run-time error '1004':

Application-defined or object-defined error

Conti! End Debug

Obr. 10.1: Takto vypadá výchozí hlášení VBA. Co z něj uživatel pozná?

Vzhledem k rozsahu knihy zde najdete jen stručný úvod do této problematiky, probereme si především všechny základní problémy týkající se chybových rutin, pomoci kterých lze řešit chyby vzniklé za běhu programu.

Při psaní maker můžete udělat nejrůznější druhy chyb, které se dají rozdělit následujícím způsobem:

V Chyby během kompilace - jde o chyby v syntaxi jazyka, tedy zapomenutá klíčová slova, omyly při psaní názvů klíčových slov či proměnných atd.

S Chyby za běhu programu - základní typ chyb, které musíte v makru ošetřit a odstranit. Velká část této kapitoly je věnována právě takovým chybám.

V Chyby logické - aplikace se nechová tak, jak by měla - běží, ale výsledky nedá-vají smysl. V tomto případě vám však Visual Basic ani nikdo jiný příliš nepomůže - tady zbývá jen přemýšlet a testovat chování makra. Při tomto testování (ladění) však můžete používat nástroje, kterými editor jazyka disponuje.

Chyby během kompilace

Tento typ chyb se dá téměř úplně odstranit již při psaní kódu pomocí automatické kontroly syntaxe v okně Options. Celkově však tyto chyby nepředstavují zvláštní nebezpečí, protože vznikají z neznalosti syntaxe nebo (především) náhodným špatným zápisem. Interpretr VBA vždy při výskytu takové chyby zobrazí hlášení s udáním její příčiny.

Tyto chyby se projeví buď přímo při psaní kódu (díky automatické kontrole syntaxe) nebo při pokusu o spuštění procedury.

Jako ukázku možné chyby během kompilace vidíte na obrázku špatnou deklaraci proměn-né. Protože se v názvu proměnné vyskytuje typová přípona, nemůžete už typ proměnné určit pomocí slova As. Chybové hlášení se objeví při pokusu o přechod na nový řádek, a řádek s chybným zápisem bude zároveň označen červeně.

1 0 . Jak řešit chyby v makrech

Page 165: 00-vba1 - Kopie

(General) " 3 Sub Procedura{)

din* x% §§ Integer

ÍÍ """ " m ra~"iír liíTwiBf888*! irmmm Compile error:

Expected: end of statement

OK Nápověda

E X C E L 2 0 0 0 - 2 0 0 7 16 7

Obr. 102: Takto vám Visual Basic ohlásí chybu během kompilace

1 0 . 1 Chyby za běhu programu Dojde-li k nějaké chybě za běhu programu, VBA jí automaticky přiřadí určité číslo. Pro ukládáni tohoto čísla a dalších zajímavých údajů vztahujících se ke vzniklé - poslední - chybě má jazyk VBA zvláštní objekt Err . Jeho vlastnost Number tedy obsahuje číslo poslední chyby. Uvedená vlastnost je výchozí vlastností tohoto objektL i , a proto skutečné číslo chyby můžete zjišťovat např. takto:

' d o š l o - l i k chybě č . l l (dě len í nulou) If Err = 11 Then

1 zde bude kód pro o š e t ř e n í t é t o chyby 1 nesouhlas datových typů proměnných E l s e l f Er r = 13 Then

' zde bude j i n ý kód pro o š e t ř e n í chyby č .13 End If

Vlastní korekce chyb tedy bude vycházet z čísla poslední chyby (správný program bude pochopitelně reagovat na každou chybu, proto vás čísla chyb předešlých ani moc zajímat nebudou, protože je již budete mít ošetřeny).

Jak dlouho si objekt Err uchová informace o poslední chybě? Jeho vlastnosti se vynuhijí nebo nastaví na řetězce mílové délky ("") po příkazLi Resume (v jakékoli podobě) nebo On Er ror , a také po příkazech Ex i t Sub nebo Ex i t Function. Původní stav objektu Err si můžete vynutit i programově, a to jeho metodou Clear . Kdy se tyto příkazy spouští, se dozvíte později.

1 0 . 2 Chybové rutiny v kódu Protože se chyba může vyskytnout v kterémkoli řádku programu (pochopitelně s výjimkou komentářů), vyplatí se je ošetřovat v určitém centrálním místě každého podprogramu. V Livodních pasážích knihy jste se o tom již dočetli: podprogram je možné rozdělit na několik částí, z nichž každá je identifikována nějakým návěštím (label). Do jedné z částí se umístí tzv. chybová rutina, tedy část kódu pro řešení vzniklých chyb.

Toto návěští se píše na samostatný řádek, musí začínat písmenem a končit dvojtečkou, a především musí být zapsáno zcela od levého kraje okna programového kódu!

1 0 . 2 Chybové rutiny v kódu

Page 166: 00-vba1 - Kopie

Ukázka možného rozděleni podprogramu pomocí návěští:

P r ivá te Sub Form_Click i

' zde j e první čás t kódu procedury

konec: ' nás l edu je druhá čás t oddělená návěštím

End Sub Veškerý kód pro ošetření vzniklých chyb soustředíme do této zvláštní části. 2 toho vy-plývá, že musíme nějak zajistit, aby při vzniku chyby provedl VBA automaticky skok do této části, a také (to už není bezpodmínečně nutné) aby tato část byla při bezchybném průběhu vynechána. Druhou podmínku splním tak, že před zmíněné návěští napíši tento řádek:

Exit Sub

Všechno, co následuje za tímto příkazem, bude vynecháno. Podmínku pivní, neboli au-tomatický skok do části programu ošetřující chyby, zajistí příkaz:

On Error GoTo název_návěšt í

Příkaz On Error má tři možné varianty. První z nich (uvedená na předchozím řádku) zajišťuje onen odskok do chybové rutiny. Pozor, v příkazu zadáváte název návěští bez dvojtečky na konci!

Varianta druhá - On Error Resume Next - při vzniklé chybě prostě pokračuje dalším řádkem - chyba se sice registruje, ale jinak se nic neděje. Toto řešení je vhodné vždy, když případné chyby odstraníte hned v následujícím řádku. Konečně třetí varianta On Error GoTo 0 zamezuje odskoku na návěští chybové rutiny podprogramu (nula zde není míněna jako návěští). Jinými slovy - chyby nejsou nijak ošetřeny.

V rámci jedné procedury se může vyskytovat více příkazů On Error , jak si za chvíli ukážeme.

J a k to tedy může v y p a d a t

Následující ukázka je jakousi „šablonou", který můžete použít pro ladění chyb vzniklých za běhu aplikace:

P r ivá te Sub nějaká_procedura On Error GoTo chybova_rutina

' zde bude kód procedury i

Exit Sub chybova_rutina: 1 zde bude kód o š e t ř u j í c í chyby

End Sub

V případě, že byste použili příkaz On Error Resume Next, bude kód vypadat asi takto:

P r ivá te Sub nějaká_procedura On Error Resume Next ' př íkazy ' zde bude př íkaz náchylný k chybám

1 0 . Jak řešit chyby v makrech

Page 167: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

If Err <> 0 Then ' kód pro ods t ranění chyby

End If 1 p ř íkazy ' zde bude d a l š í p ř íkaz náchylný k chybám

If Err <> 0 Then 1 kód pro ods t ranění chyby

End If ' a tak dále a d á l e . . .

Pozor, v tomto případě samozřejmě nemusíte chyby ošetřovat za každým příkazem! Roz-hodovací bloky If Err <> 0 Then použijte jen za těmi příkazy, kde ke vzniku chyby může dojit.

Obsah chybové rutiny

Vlastni chybová rutina se většinou skládá ze třech základních části - z testování čísla chyby, bloku s příkazy určujícími, jak bude která chyba ošetřena, a konečně z určení toho, co bude následovat po ošetření chyby.

Testování čísla chyby lze provést kupříkladii příkazem Selec t Case:

Se lec t Case Err 1 t e s tu jeme hodnotu Err.Number Case 5

' kód pro chybu č í s l o 5 Case 7

' kód pro ř e šen í d a l š í chyby a t d . End Se lec t

Ošetření chyby by bylo umístěno v jednotlivých částech bloku Selec t Case, např.:

Case 71 1 71 = za ř í zen í není př ipraveno MsgBox "V mechanice není d i s k e t a . Vložte j i do mechaniky " &

"a poté pokraču j t e " , vbExclamation

Každá část bloku bude uzavřena příkazem, který určuje místo, kde bude kód po nápravě chyby pokračovat. Zde se nabízí tyto základní možnosti:

V Ukončení programu - u chyb, které nelze odstranit a díky kterým není ani možné pokračovat v provádění dalšího kódu, musíte kód zastavit, podle potřeby i odvolat provedené změny.

S Příkaz Resume - po jeho provedení bude kód pokračovat řádkem, v němž došlo k chybě, příkaz tedy bude zopakován. Tento příkaz použijete vždy, pokud je chy-bová rutina schopna problém beze stop odstranit.

V Příkaz Resume Next - znamená pokračování programu řádkem nacházejícím se v kódu za tím řádkem, v němž došlo k chybě. Uvedený příkaz musíte použít tam, kde nelze příčinu chyby úplně odstranit a kde nevadí, že chybný řádek kódu nebude proveden.

End Sub

Page 168: 00-vba1 - Kopie

170 E X C E L 2 0 0 0 - 2 0 0 7

Další obrázek ukazuje názorně oba možné způsoby návratu pomocí příkazů Resume či Resume Next. Pro úplnost dodávám, že existuje čtvrtý, i když výjimečný způsob, jak chybovou rutinu ukončit - Resume název_návěš t í (pokud máte podprogram rozdělen pomocí návěští na více částí).

r End Obr. 103: Názorný přehled směru provádění kódu v chybové rutině

Proč je důležité mít chybové rutiny ve všech procedurách

2 jedné procedury (jednoho makra) můžete volat makro jiné - jak, to už dávno víte. Dojde-li však k tomuto volání jiného makra, musíte si dávat obzvláštní pozor na to, aby chybové rutiny byly v obou dvoLi procedurách, nebo alespoň v té, kterou voláte. Proč?

Ukážeme si to na hypotetickém příkladu. Pivní procedura bude zpracovávat zadanou oblast buněk a pro každou buňku v oblasti bude volat druhou proceduru, která s buňkou provede nějakou operaci. V první proceduře budete mít chybovou rutinu, ve druhé ne.

Celý problém se dá popsat takto: jestliže ve druhé proceduře dojde k chybě, hledá VBA chybovou rutinu v této proceduře. Protože ji tam nenajde a protože tato procedura byla volána z jiného makra, přejde interpretr VBA zpět do pivní procedury a hledá chybovou rutinu tam (jinak by totiž musel zobrazit výchozí chybové hlášení). Řekli jsme si, že v prv-ní proceduře chybová rutina existuje. Dobře - interpretr tuto chybovoLi rutinu provede, přičemž číslo poslední chyby je pochopitelně číslo chyby vzniklé ve druhé proceduře. To je první problém - chybová rutina ošetřuje chybu z jiné procedury. Chybu stejného čísla v různých procedurách je samozřejmě možné, ba dokonce někdy i nutné ošetřit různým způsobem, záleží na situaci.

Mnohem větší potíž spočívá v tom, že pokud je chyba ošetřena rutinou umístěnou v první proceduře, nepokračuje interpretr VBA po ošetření chyby v provádění procedury, kde se chyba objevila, ale v proceduře s touto chybovou rutinou, neboli v proceduře první!

Pokud je chybová rutina první procedury ukončena příkazem Resume, pokračuje kód znovu řádkem, v němž je volána druhá procedura, ve které došlo k chybě. Tím máte téměř zajiš-těno zacyklování programu, protože pokud chybová rutina neumí chybu ošetřit, bude se tato chyba v druhé proceduře neListále opakovat. Končí-li chybová rutina první procedury příkazem Resume Next, pokračuje interpretr VBA řádkem následujícím za voláním druhé procedury, což zase může způsobit nedokončení některých (třeba nutných) operací.

Page 169: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Jestliže tedy z jedné procedury voláte druhou (případně z druhé voláte třetí atd.), hledá interpretr při vzniku chyby za běhu programu chybovou rutinu postupně ve všech nedo-končených procedurách. Pokud žádnou nenajde, zobrazí výchozí okno hlášení s popisem chyby.

A to je důvod, proč byste měli chybové rutiny psát do každé procedury či funkce, s kterou pracujete. Vyhnete se tak někteiým nepříjemným překvapením.

Konkrétní u k á z k a chybové rutiny s několika „ f í g l y "

Představme si následující situaci: v určitém sešitu si potřebujete uložit kopii konkrétního listu pro případ, že byste se potřebovali vrátit k původním údajům, které na něm byly uloženy. Dejme tomu, že sešit má mnoho listů, proto si nebudete zálohovat celý sešit, ale jen jediný list.

Požadovaná procedura tedy zkopíruje list (pro zjednodušení to bude aktivní list) do nového listu, jehož název bude totožný, jen na jeho začátek přidáte slovo „Záloha " (s mezerou za tímto slovem). Protože předpokládáte, že zálohu listu budete provádět opakovaně (jinak byste kvůli tomu nepsali proceduru) a jméno kopie listu bude stále stejné, je nutné nej-dříve zjistit, jestli už zálohovaný list existuje, a pokud ano, tak ho odstranit. Následně list zkopírujete a změníte jeho jméno. Nakonec zálohovaný list skryjete, protože není nutné, aby byl vidět.

Jak zjistíte, jestli už zálohovaný list v sešitu existuje? Jednu z možností si asi odvodíte sami - projít kolekcí všech listů a testovat jejich název:

puvodni_jmeno = ActiveSheet.Name For Each l i s t In ActiveWorkbook.Worksheets

If l i s t .Name = "Záloha " & puvodni_jmeno Then _ l i s t . D e l e t e

Next

V tomto fragmentu kódu si nejdříve uložíte název aktivního listu do proměnné (protože po zkopírování listu bude aktivní nový list!) a poté v cyklu projdete všechny listy. Pokud bude název některého listu odpovídat názvu aktivního listu a na začátku bude mít přidáno slovo „Záloha", odstraníte ho.

Vlastní kopírování listu se provádí metodou Copy, v ní ovšem nemáte možnost ovlivnit jméno nového listu, proto bude v kódu řádek měnící vlastnost Name nového listu.

Takže základní kostra požadované procedury může vypadat takto:

Sub ZalohaListu() App l i ca t ion .Disp layAle r t s = Falše puvodni_jmeno = ActiveSheet.Name For Each l i s t In ActiveWorkbook.Sheets

If l i s t .Name = "Záloha 11 & puvodni_jmeno Then _ l i s t . D e l e t e

Next ActiveSheet.Copy a f te r :=Act iveShee t ActiveSheet.Name = "Záloha " & puvodni_jmeno Ac t iveShee t .Vis ib le = Falše Appl i ca t ion .Disp layAle r t s = True Sheets(puvodni_jmeno).Act ivate

End Sub

Page 170: 00-vba1 - Kopie

172 V prvním řádku vypínáme vlastnost DisplayAlerts, jinak bychom museli při mazání lis-tu potvrdit jedno z oken hlášení Excelu. V druhém řádku uložíme název aktivního listu, v cyklu najdeme případnou již existující zálohu a odstraníme ji. V šestém řádku zkopírujeme ak-tivní list. Parametr af t e r zadat musíte, jinak by byl vytvořen novy sešit a list kopírován do něj.

Proč kolekce Sheets a ne Worksheets? Může se stát, že proceduru spustíte, když je aktivní list typu graf.

V sedmém řádku změníme název nového listu a v následujícím řádku ho skryjeme. Osmý řádek znovu zapíná vlastnost DisplayAler ts . A konečně poslední řádek aktivuje list, který jsme kopírovali - pokud byste ho vynechali, bude po provedení procedury aktivní list umístěn za nově vytvořeným listem.

Kde je chybová rutina? Zatím jsme ji do procedury nepřidali. S využitím toho, co jsme si zatím řekli, však můžete celou proceduru podstatně vylepšit. Cyklus, ve kterém procházíte kolekci listů v sešitu, se totiž dá vypustit, a místo něj můžete přímo hledaný list smazat!

Sheets("Záloha " & puvodni_jmeno).Delete

A co když odstraňovaný list v sešitu ještě nebude (při pivním spuštění procedury nebo kdybyste zálohovaný list smazali ručně)? Pokus o smazání listu, který neexistuje, vyvolá samozřejmě chybu za běhu programu. Protože však máte k dispozici příkaz On Error Resume Next, dá se tato chyba jednoduše zachytit a vyřešit:

Sub ZalohaListu() Dim puvodni_jmeno As S t r ing Appl ica t ion .Disp layAler t s = Falše puvodni_jmeno = ActiveSheet.Name On Error Resume Next Sheets("Záloha " & puvodni_jmeno).Delete

On Error GoTo chyba_zalohal i s tu ActiveSheet.Copy a f t e r :=Act iveShee t ActiveSheet.Name = "Záloha " & puvodni_jmeno Act iveShee t .Vis ib le = Falše Appl ica t ion .Disp layAler t s = True Sheets(puvodni_jmeno).Activate Exit Sub

chyba_za loha l i s tu : MsgBox "Záloha l i s t u se nezda ř i l a " Appl ica t ion .Disp layAler t s = True Sheets(puvodni_jmeno).Activate

End Sub

Máte dojem, že to je nějaký divný kód? Že tam chybí ošetření chyby vzniklé pokusem o smazání neexistujícího listu? To máte pravdu - ale co je vlastně třeba ošetřit? Prostě se jen nezdařilo smazání listu! Kód bude pokračovat dál a s testováním čísla chyby se vůbec nemusíme zdržovat, protože tuto chybu lze prostě zahodit.

Všimněte si dvojího použití příkazu On Error. Ihned za řádkem mazajícím zálohovaný list zapínáme klasické zachytávání chyb s odskokem do chybové rutiny.

Je ta procedura dokonalá? Není, samozřejmě. Např. se zde nepočítá s případem, kdy byste proceduru omylem spustili v okamžiku, ve kterém se nacházíte na listu sloužícím jako záloha (procedura by proběhla bez problému. Výsledkem by byl nový list pojmenovaný např. „Záloha Záloha List3"). Ale to už jsou detaily.

Page 171: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

1 0 . 3 Ladicí nástroje Excelu Každou proceduru či funkci, kterou hodláte opakovaně používat, je nutné důkladně otesto-vat, jestli za všech možných okolností pracuje správně. Ve většině případů je selhání makra zaviněno právě nedostatečným testováním, během něhož jste přehlédli některé chyby.

Ve skutečnosti byste měli velkou část testování provádět již během vlastního psaní proce-dur. Každou nově přidanou část makra je potřeba vyzkoušet. V mnoha případech se totiž nesetkáte jen s klasickými chybami vzniklými za běhu programu, ale celé makro může dávat nesmyslné výsledky, protože jste zapomněli na určitou maličkost, která pak ovlivní celý další průběh kódu.

V části věnované chybovým rutinám jsme si na příkladu ukázali, jak napravit pokus o smazání neexistujícího listu. Jenže v aplikaci se můžete setkat i se zcela odlišnými typy chyb, které vzniknou např. v okamžiku, kdy určitá proměnná nabude hodnoty, kterou jste nepředpo-kládali. Typickým příkladem je záporná hodnota místo kladné, dělení nulou, proměnná bez přiřazené hodnoty apod.

Editor VBA vám proto nabízí několik speciálních oken, která můžete použít pro ladění procedur a funkcí. Základním účelem těchto oken je umožnit testovat, jakých hodnot nabývají proměnné nebo celé výrazy během průběhu procedury. Procedura či funkce ovšem normálně po spuštění proběhne najednou až do konce - pokud není přerušena kvůli nějaké chybě. Proto si nyní musíme říci něco více o režimu přerušení, kdy se makro zastaví v určitém místě a zbytek kódu prozatím nebyl proveden.

Stručně o režimu přerušení

Režim přerušení (break) jsme si již krátce představili ve třetí kapitole. Můžete ho využívat mnoha způsoby, nejen k testování hodnot proměnných. V tomto režimu lze např.:

S Změnit již napsaný kód - ale dojde-li přitom ke změně, ovlivňující aktuální stav progra-mu (např. chcete změnit název nebo datový typ proměnné), objeví se po této změně okno hlášení, jehož potvrzením se vracíte znovu do režimu návrhu, abyste mohli proceduru spustit znovu od začátku. Tlačítkem Storno provedenou změnu zrušíte.

M i c r o s o f t V i s u a l Basic m f \ This action will reset your project, proceed anyway?

Nápověda

Obr. 10.4: Provedli jste změnu zdrojového kódu, která si vynutí návrat do režimu návrhu

S Zjišťovat, které proceduiy či funkce nebyly v okamžiku přerušení dokončeny.

V Měnit další průběh programu - vynecháním určité části kódu.

v Krokovat aplikaci, tedy vykonat vždy najednou jen jeden řádek kódu (nebo sku-pinu řádků).

Přerušení programu lze dosáhnout několika způsoby - bud přímo z nabídky Editoru Visual Basicu (příkaz Break v nabídce Run či ikona na panelu nástrojů), stiskem kombinace kláves CTRL+BREAK, vložením příkazu Stop nebo tzv. zarážek do kódu. Do tohoto režimu se můžete přepnout i v případě, kdy dojde k chybě za běhu, kterou jste neošetřili (pomocí tlačítka Debug v okně hlášení o chybě), popř. i u chyb ošetřených, máte-li v okně Options editoru zapnutou na kartě General volbu Break On All Errors.

1 0 . 3 Ladicí nástroje Excelu

Page 172: 00-vba1 - Kopie

Rychlé zobrazení hodnoty nějakého v ý r a z u ci proměnné

Počínaje Excelem 97 můžete v režimu přerušení zobrazit aktuální hodnotu nějaké proměnné prostě tak, že nad její název v okně kódu najedete myší. Nástroj Auto Quick Info vám hodnotu ukáže ve žlutém rámečku u kurzoru myši.

MsgBox prumej[ [prumer = 2|

End Sub

O k n a související s laděním chyb

Pivním nástrojem - a nejčastěji používaným - je okno Immediate, které již znáte. Kromě něj existují ještě tři další - okno Locals, Watches a Call Stack. V prvních dvou můžete sledovat aktuální hodnoty proměnných či vlastností v okamžiku přerušení běhu makra. V okně Locals vidíte hodnoty všech proměnných deklarovaných uvnitř procedury, ve které došlo k přeru-šení, a také hodnoty proměnných deklarovaných na úrovni celého modulu. Okno Watches automaticky nezobrazí nic, ale umožňuje definovat si tzv. kukátka, které umožňují sledovat i hodnoty celých výrazů, nikoli jen proměnných.

U rozsáhlejších řešení, kdy jsou jednotlivé procedury spouštěny řetězově (z procedury A zavoláte proceduru B a ta zase volá funkci C), je někdy nutné zjistit, které procedury a funkce nebyly v okamžiku přerušení běhu ukončeny. K tomuto účelu slouží poslední okno Call Stack, ve kterém jsou vidět názvy těchto nedokončených podprogramů. Zcela nahoře je název posledního volaného podprogramu.

Všechna okna pro ladění jsou na sobě nezávislá a jejich zobrazení či skrytí se provádí přes nabídku View. Jestliže jsou vidět, najdete je uchycená ke spodní hraně okna kódu, odkud si je samozřejmě můžete přesunout jinam.

Testování hodnot v okně Immediate

Toto okno je vlastně jen obyčejné textové pole, do kterého můžete z programu vypisovat různá hlášení, ale stejně tak do něj můžete přímo psát příkazy i metody VBA nebo zjišťovat hodnoty proměnných během režimu přerušení.

Přímo z kódu můžete do okna Immediate směrovat výpisy pomocí metody Pr in t objektu Debug:

Debug.Print "Act iveCel l .Address" , ActiveCell .Address

Metoda P r in t vytiskne do okna Immediate seznam svých parametrů, které ji předáte. Čárka oddělující parametry zajišťuje odskoky do dalších tiskových zón (tisková zóna je široká 14 znaků), je to v podstatě to samé co odskok tabulátorem. Pokud místo čárky použijete středník (nebo mezeru), bude proměnná zapisována bezprostředně za konec prvního řetězce. Na dalším obrázku vidíte obsah okna Immediate po provedení předcho-zího příkladu kódu. Nejdříve je vytištěn textový popis (abyste věděli, co vlastně vypsané číslo představuje), poté vlastní hodnota vlastnosti.

m^^^SSĚBĚ^^ĚIĚĚĚĚĚĚIĚĚQ Act iveCe 1 i . Address $C $ 8 I •

1 0 . Jak řešit chyby v makrech

Page 173: 00-vba1 - Kopie

Tiskovou podobu výstupu můžete ovlivnit i speciálními klauzulemi Spc (n) nebo Tab (n). Bližší podrobnosti o nich se dozvíte v nápovědě k metodě Pr in t .

Hodnoty vlastností však můžete zjišťovat i přímo zápisem, ve kterém na začátku použijete otazník a za ním název vlastnosti. To již znáte ze třetí kapitoly.

Jak používat okno Locals

V tomto okně vidíte hodnoty všech lokálních a modulových proměnných. V horní části okna je název procedury či funkce, v níž byl běh programu přerušen. Na obrázku vidíte okno Locals, které zobrazuje hodnoty dvou proměnných na úrovni modulu (soubor a odkaz) a dvou lokálních proměnných deklarovaných v proceduře Faktury. Okno Locals jasně říká, že proměnná součet typu Variant nebyla inicializována (= nepřiřadili jste jí ještě žádnou hodnotu), takže obsahuje speciální hodnotu Empty. Proměnná soubor také nemusela být inicializována, ale protože je deklarována jako typ String, nedá se to poznat.

V pivním sloupci je název proměnné nebo modulu, ve druhém aktuální hodnota, ve třetím datový typ (u typu Var iant i podtyp). Vedle názvu modulu je značka osnovy, kterou se dá seznam modulových proměnných rozvinout, jako je tomu i na následujícím obrázku.

Obr. 10.5: Okno Locals se dvěma lokálními a dvěma modulovými proměnnými

Kukátka

Pokud aplikace poskytuje výsledky, které neodpovídají zadání, popř. pokud některé pro-měnné nabývají zakázaných či nesmyslných hodnot, můžete do okna Watches přidat tzv. kukátka, zobrazující konkrétní hodnoty proměnných či vlastností, popř. platnost či neplatnost nějakého výrazu. Výhodou okna Watches je tedy možnost sledovat hodnoty výrazů a vlastností, pro proměnné postačí okno Locals.

Obr. 10.6: Dialogové okno pro nastavení vlastností kukátka

1 0 . 3 Ladicí nástroje Excelu

Page 174: 00-vba1 - Kopie

Do řádku Expression zadáváte vyraz, vlastnost či proměnnou (je-li v otevřeném okně kódu vybrán blok, objeví se v tomto řádku ihned po vyvoláni okna).

V sekci Context volíte, v jakém rozsahu chcete vyraz, vlastnost či proměnnou sledovat. U lokálních proměnných to bude pochopitelně vždy pouze ta procedura, ve které daná proměnná existuje (jinak se místo hodnoty zobrazí v okně Watches hlášení „Expression not defined in context"). U modulových či veřejných proměnných nebo výrazů a u vlast-ností objektů už lze kontext volit - máte-li problémy jen v rámci jedné procedury, postačí opět kontext této procedury. Neznáte-li místo výskytu chyb přesněji, zadejte kontext (All procedures), a to bud v jednom modulu, či ve všech modulech, případně v rámci celého sešitu (rozvírací seznam Module).

Ve spodní sekci Watch type si můžete vybrat mezi třemi různými typy. Nejčastější je první typ Watch Expression, kdy prostě sledujete hodnotu dané proměnné nebo vlastnosti, případně platnost výrazu. V některých případech však bývají výhodnější zbylé typy kukátek. První z nich (Break When Value Is True) přeruší běh aplikace pokaždé, když sledovaný výraz začne platit (např. hodnota proměnné překročí nastavenou horní či dolní mez nebo když je proměnná inicializována). Druhý typ (Break When Value Changes) přeruší běžící program, když se hodnota proměnné či platnost výrazu změní. Můžete ho využít např. pro kontrolu opakovaných volání nějakého podprogramu, v němž si nadefinujete proměnnou jako sčítač průběhu. Nebo vždy, když se vám neočekávaně mění nějaká hodnota a vy chcete přijít na to, kdy k této změně dojde.

Vytvořené kukátko lze kdykoli později upravit pomocí nabídky Debug —» Edit Watch... (nebo přes místní nabídku v okně Watches). Odstranění kukátka je také jednoduché - vyberete ho a stisknete klávesu DELETE.

Rychlé kukátko

Mimo kukátek trvalého rázu, která jsou vidět v okně Watches, lze v režimu přerušení vy-tvořit i dočasný náhled na hodnotu nějaké proměnné či výrazu. Stačí k tomu vybrat v okně kódu příslušný výraz či proměnnou do bloku a zadat příkaz Debug —> Quick Watch... (klávesová zkratka S H I F T + F 9 ) . Objeví se dialogové okno s hodnotou proměnné či údajem o platnosti vybraného příkazu. Stisknutím tlačítka Add lze vybraný výraz či proměnnou změnit na tivalé kukátko.

Z a r á ž k y (breakpoint)

Bude-li aplikace dávat nesmyslné výsledky, je také možné ji rozčlenit pomocí zarážek. Zarážka automaticky přeruší program, jakmile jeho běh dospěje k řádku, na kterém je zarážka umístěna. Tak je možné postupně (pomocí kukátek a dalších nástrojů) zjistit, ve kterém místě je zakleta příčina problému.

Zarážky lze nastavit v režimu návrhu nebo přerušení, a to tak, že na řádek kódu, před jehož provedením se má aplikace zastavit, přesunete kurzor a stisknete klávesu F9. Ekvivalentní příkaz v nabídce Debug se jmenuje Toggle Breakpoint, případně použijte ikonu na panelu nástrojů Debug. Po nastavení zarážky se příslušný řádek podbarví hnědě.

<&°%orné/>s Zarážky zůstávají nastaveny jen během práce s editorem VB A, nejsou ukládány trvale.

Page 175: 00-vba1 - Kopie

E X C E L 2 0 0 0 - 2 0 0 7 2 3

Místo zarážek lze rovněž použít přímo v kódu příkaz Stop, ten je však nutné z kódu po dokončení testovací fáze odstranit.

Krokování procedur

V režimu přerušení je možné aplikaci krokovat - neboli provádět vždy jen jeden řádek kódu (odchylky jsou uvedeny níže). V praxi se dá krokování využít v těchto případech:

V Potřebujete projít celou proceduru či funkci řádek po řádku, protože nejste schopni objevit místo vzniku nějaké chyby, nebo chcete blíže prozkoumat, co všechno se v rámci jednotlivých příkazů děje. Krokování v tomto případě začínáte již od pivního výkonného řádku procedury.

Většina kódu funguje dobře, jen v určitých místech máte potíže. Pomocí zarážky můžete pivní část procedury provést najednou a až se zastavíte na určitém řádku, zbytek kódu odkrokujete.

Krokování procedury se dá zahájit několika způsoby. V dialogovém okně Makro najdete tlačítko Krokovat s vnořením. Přímo v editoru proceduru krokujete bud klávesou F8 (na začátku musí být kurzor kdekoli uvnitř požadované procedury) nebo pomocí příkazu Step Into z nabídky Debug (klávesová zkratka F8). Řádek kódu, který bude proveden po dalším stisku klávesy F8, je v okně kódu zbarven žlutě a v levém šedém pruhu je označen šipkou. Nacházejí-li se na jednom řádku příkazy dva, je podbarven jen ten příkaz, který bude dále proveden.

Základní varianta krokování (Step Into) je charakteristická tím, že je ve všech případech proveden pouze jeden výkonný příkaz - a to i v případě, že se v krokované proceduře nachází volání jiné vlastní procedury či funkce (tedy ne vestavěných příkazů a funkcí Vi-sual Basicu). V takovém případě se po zavolání dané procedury automaticky v okně kódu objeví její definice a vy budete krokovat i tyto funkce či procedury.

Další variantou krokování je volba Step Over, kdy se rovněž provádí vždy jeden výkonný příkaz, ovšem s výjimkou volání jiných podprogramů. Ty jsou vykonány najednou a poté je provádění zastaveno před následujícím příkazem v podprogramu, v němž krokujeme. Tato varianta se hodí v těch případech, kdy víte, že kód volaných procedur je v pořádku.

Třetí varianta Step Out se dá použít ve volané proceduře. Zajistí provedení zbytku této procedury a návrat do proceduiy volající, přičemž běh programu se zastaví na řádku ná-sledujícím po řádku, ve kterém byla volána procedura, jejíž běh chcete najednou dokončit. Srozumitelně řečeno - jestliže pomocí Step Into krokujete proceduru a přejdete do jiné vlastní procedury, nemusíte ji celou krokovat, ale v určitém okamžiku lze její kód dokončit právě volbou Step Out.

Poslední zajímavý příkaz pro spouštění kódu v nabídce Debug se jmenuje Run to Cursor a umožňuje najednou vykonat některá „dlouhá" místa v kódu (cykly...). Jestliže při kroko-vání kódu dojdete k místu s delším cyklem, můžete nastavit kurzor na první řádek za tímto cyklem a stisknout C T R L + F 8 nebo zadat v nabídce Debug uvedený příkaz. Celý cyklus bude proveden najednou a interpretr VBA se zastaví na řádku, ve kterém je umístěn kurzor.

c> Range (MC9:C12řř) .Select Range("C12").Áctivate ActiveCell.FormulaRlCl = "=SUM(R[-3]C:R[-l] C)"

Obr. 10.7: V okně kóduje žlutě podbarven řádek kódu, který bude proveden po stisku klávesy F8

Page 176: 00-vba1 - Kopie

- -i I ' ' HBiii m E X C E L 2 0 0 0 - 2 0 0 7

JBMB&m

M o ž n é vynechání určitých míst v kódu

Někdy je třeba za běhu programu přeskočit určitou část - o niž víme, že v ní je jakási zá-hadná chyba, kterou nejsme schopni zatím odhalit - a pokračovat až o kus dále. V takovém případě na začátku krizového místa nastavíte zarážku a po přerušení běhu makra umístíte kurzor na místo, kde má program pokračovat. Poté v nabídce Debug vyberte příkaz Set Next Statement. V tomto okamžiku budete mít v okně kódu dva podbaivené řádky - řádek s nastavenou zarážkou bude hnědý a řádek s kurzorem žlutý. Dále můžete kód běžným způ-sobem krokovat. Všechny řádky mezi zarážkou a řádkem s kurzorem budou vynechány.

Příkaz Show Next Statement v nabídce Debug se používá v jiných situacích - přemístí kurzor do řádku, kde bude aplikace pokračovat. I to se někdy může hodit, zvláště tehdy, když začnete ztrácet v programu orientaci.

1 0 . 4 Stručný přehled nejdůležitějších chyb Následující tabulka rozhodně není úplným výčtem možných chyb vzniklých za běhu pro-gramu, ale pouze těch, s nimiž se setkáte nejčastěji.

Číslo Popis a příčiny vzniku

5 Nepovolené volání funkce; příčinou může být parametr mimo povolený roz-sah, neplatný index, případně nepovolené použití funkce.

6 Výsledná hodnota je mimo povolený rozsah daného datového typu; typické při návratu hodnoty z funkce nebo při matematických operacích.

7 Málo paměti k dokončení operace (máte příliš mnoho otevřených souborů, rovněž můžete mít deklarováno příliš mnoho veřejných proměnných).

9 Odkaz na neexistující prvek pole (index prvku je mimo deklarovaný rozsah nebo jste uvedli špatný počet rozměrů pole).

11 Dělení nulou. Jedna z nejčastějších chyb vůbec.

13 Špatný datový typ proměnné nebo vlastnosti. Rovněž velmi častá chyba.

18 Procedura byla přerušena Liživatelem (nejspíše stiskem klávesové kombinace CTRL+BREAK).

20 Chyby v rutině na ošetření chyb (špatně umístěný příkaz Resume).

28 Přetečení zásobníku. Možné příčiny: příliš mnoho volaných funkcí či proce-dur; zacyklované volání podprogramů; příliš mnoho lokálních proměnných (lze řešit jejich deklarováním na úrovni modulu nebo s klauzLilí S t a t i c ) .

35 Volaný podprogram nebyl nalezen (špatně zapsaný název procedury).

51 Interní chyba VBA. Pokud není způsobena voláním příkazu E r r o r nebo metodou Raise, je to špatné, protože neznáte příčinu. Opakovaný výskyt této chyby vyřeší (možná) technická podpora Microsoftu.

53 Hledaný soubor nebyl nalezen.

55 Soubor je již otevřen.

58 Daný soubor již existuje.

68 Zařízení je nedostupné (vypnuté, porucha na síti apod.).

70 Přístup byl odmítnut (disketa chráněná proti zápisu nebo uzamčený soubor).

1 0 . Jak řešit chyby v makrech

Page 177: 00-vba1 - Kopie

177 E X C E L 2 0 0 0 - 2 0 0 7

Číslo Popis a příčiny vzniku

71 Disk není připraven (chybí disketa apod.).

76 Složka (adresář) nebyla nalezena.

91 Nesprávně použitá objektová proměnná (objekt neexistuje nebo má hodnotu Nothing).

380 Pokus o přiřazeni neplatné hodnoty do vlastnosti. 422 Daná vlastnost objektu neexistuje.

423, 438

Daná vlastnost nebo metoda objektu neexistuje.

424 Chybí odkaz na objekt (název vlastnosti bez názvu objektu, špatně zapsaný název objektu, přiřazeni odkazu na objekt bez příkazu Set).

446 Daná metoda objektu nepodporuje pojmenované parametry (musíte použit parametry v přesném pořadí).

448 Špatně zapsaný název pojmenovaného parametru.

449 Nesprávný počet parametrů nebo vynechaný povinný parametr.

460 Chybný formát dat při práci se schránkou.

482 Problémy s tiskem.

Page 178: 00-vba1 - Kopie
Page 179: 00-vba1 - Kopie

E

editor barvy kódu 44 okno Immediate 4 4 - 4 5 okno Project 34 popis prostředí 3 4 - 3 6 režimy práce 38 spuštění 32

Excel typy listů 16

F

funkce Array 82 Clnt 80 CLng 80 Fix 107 InputBox 102 -104 InStr 105 -106 InStrRev 106 Int 107 IsArray 82 IsEmpty 79 IsNull 79 IsNumeric 70 Join 107 LBound 82 LCase 106 Left 105 Len 104 logaritmické 108 LTrim 105 Match 131 Mid 105 MsgBox 9 9 - 1 0 2 pracovního listu 9 7 - 9 8 převodní 80 Right 105

Rejstřík

Split 106 -107 StrComp 106 struktura 63 trigonometrické 108 Trim 105 TypeName 69 UBound 82 UCase 106 VarType 69 vrácení chybové hodnoty 109 vytváření 61 ,108 základní pojmy 60 zaokrouhlování 107

Ch

chyby druhy chyb 166 chybové rutiny v kódu 168 ve volaných procedurách 170 za běhu programu 167 -168

J

jazyk VBA cykly 8 9 - 9 1 historie 16 komentáře 4 0 - 4 1 konstanty 65 metody 54 nápověda 5 5 - 5 6 odkazy na objekty 5 2 , 1 1 0 - 1 1 1 parametry 8 2 - 8 8 pravidla pro názvy 66 procedury a funkce 60 předávání parametrů 8 4 - 8 5 přehled 4 7 - 4 8 rozhodovací bloky 8 5 - 8 9 události 55 umístění kódu 37

Rejstřík

Page 180: 00-vba1 - Kopie

182 E X C E L 2 0 0 0 - 2 0 0 7

vlastnosti 54 výrazy 66

jazyk XLM 16

K

kolekce viz objekty: kolekce konstanty 65,74

L

ladění krokování procedur 177 kukátka 175 -176 okna pro ladění 174 režim přerušení 173 vynechání části kódu 178 zarážky 176

M

makra komentáře 4 0 - 4 1 místo uložení 2 2 - 2 3 nahrávání 1 9 - 2 4 názvy maker 2 1 - 2 2 osobní sešit maker 22 praktické použití 14 způsoby spuštění 15

metody 54 AutoFill 127 -128 AutoFit 118 Clear 126 Close 150 Copy 124 Copy (list) 142 Cut 125 Delete 126,139,141 End 121 FillAcrossSheets 139 Find 129 -130 FollowHyperlink 154 GetOpenFileName 150 GetSaveFilename 153 GoTo 161 InputBox 102 -104 Insert 126 LinkSources 155 Move 142 Offset 119 OnKey 161 -162 OnTime 162

Open 150 Paste 142 PasteSpecial (buňky) 125 PasteSpecial (list) 143 PrintOut 143 Protéct 145,154 Quit 163 Replace 131 SaveAs 143-144 SaveCopyAs 153 Select 114 SendMail 153 Show 163 Sort 131-132 SpecialCelIs 128 Unprotect 145 UpdateLink 155 Wait 162

moduly části modulů 60 modul ThisWorkbook 37 typy modulů 37

objekty 4 8 - 5 5 Application 157 -164

metody 161 -163 vlastnosti 158 -160

Borders 133 Dialogs 163-164 DocumentProperties 155-156 Err 168 Font 133 hierarchie 51 HPageBreaks 148 Interior 133 kolekce 4 9 - 5 0

Charts 137 Sheets 137 Workbooks 149 Worksheets 138-144

PageSetup 146 -149 přehled 4 8 - 5 5

113-135 formátování 132 -135 hledání a záměna obsahu 129-130 kopírování buněk 124 metody 124

odkazy na buňky 114-121 práce s komentáři 127 řazení 131 -132

Page 181: 00-vba1 - Kopie

vkládání buněk 126 vkládání vzorců 126-127 vlastnosti 122 -123 základní pojmy 113

RoutingSlip 153 Selection 42 Sheets 51 Styles 134 třídy 49 VPageBreaks 148 Windows 51 Workbook

metody 151-152 vlastnosti 150-151

Workbooks 5 1 , 1 4 9 - 1 5 2 Worksheet

metody 141 vlastnosti 140

Worksheets 138 -139 odkazy

absolutní a relativní 29 ActiveChart 138 ActiveSheet 138 ActiveWorkbook 138 ThisWorkbook 138

operátory ampersand 74,77 priorita 68 přehled 67

P

pole proměnných 8 0 - 8 2 dynamické 81 statické 81 v proměnné 82 základní pojmy 80

procedury parametry 82 spouštění 9 2 - 9 5 struktura 62 vytváření 61 základní pojmy 60

proměnné datové typy 69 deklarace 7 3 - 7 4 objektového typu 5 2 , 6 5 , 1 1 0 převody hodnot 80 rozsah platnosti 7 1 - 7 2 statické 7 6 - 7 7 typ Boolean 7 9 - 8 0

typ String 79 typ Variant 79 typové přípony 74 hodnota Null 79 zápis hodnot 7 7 - 7 9 životnost 7 2 - 7 3

příkazy Do...While/Until 9 0 - 9 1 For Each...Next 91 For...Next 8 9 - 9 0 If...Then...Else 8 7 - 8 9 MsgBox 99 - 102 On Error 168 Option Base 81 Option Explicit 73 pravidla pro názvy 66 Resume 169 Select Case 8 6 - 8 7 With...End With 109-110 zápis na více řádků 64

u události 55

V vlastnosti 54

Areas 120 BottomRightCell 121 Cells 116-117 Columns 117-118 Count 118 CurrentRegion 119 Cursor 159 CutCopyMode 126 DisplayAlerts 141 158 End 121 EntireColumn 118 EntireRow 118 Offset 119 Range 114-116 Row 131 Rows 117-118 ScreenUpdating 158 StatusBar 159 TopLeftCell 121 UsedRange 119-120

výrazy 66

Rejstřík

Page 182: 00-vba1 - Kopie

Recommended