Programování v Excelu 2000, 2002, 2003

Podobné dokumenty
Ukázka knihy z internetového knihkupectví

Programování v Excelu 2000, 2002, 2003

Obsah Úvodem... 5 Co je to vlastně formulář... 6 Co je to šablona... 6 Jak se šablona uloží... 6 Jak souvisí formulář se šablonou...

Ukazka knihy z internetoveho knihkupectvi

MS Excel makra a VBA

Ukázka knihy z internetového knihkupectví

Ukázka knihy z internetového knihkupectví

Ukazka knihy z internetoveho knihkupectvi

ZŠ ÚnO, Bratří Čapků 1332

Visual Basic for Application

Test z programování v jazyce VBA v rámci předmětu Počítače II Vzorová zadání a vypracování

Manuál k ovládání aplikace INFOwin.

Kurz Databáze. Obsah. Formuláře. Práce s daty. Doc. Ing. Radim Farana, CSc.

Struèný obsah. Základní průprava. Vývoj aplikací v Excelu. Základy jazyka Visual Basic for Applications. Práce s vlastními dialogy (UserForms)

Microsoft Word základní

Vzorce. Suma. Tvorba vzorce napsáním. Tvorba vzorců průvodcem

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Obsah. Úvod Začínáme s PowerPointem Operace se snímky Pro koho je kniha určena...10 Použité konvence...11

Ukázka knihy z internetového knihkupectví

Ukázka knihy z internetového knihkupectví

Spuštění a ukončení databázové aplikace Access

Předmluva 11 Typografická konvence použitá v knize Úvod do Excelu

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Obsahy kurzů MS Office

Obsah. Obsah. Úvod Makra v Excelu Nahrávání maker První setkání s editorem jazyka Visual Basic... 31

Návod k aplikaci DPH Kontrol

Obsah. Několik slov o Excelu 2007 a Operace při otvírání a ukládání sešitu 15. Operace s okny 27. Kapitola 1

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

Word Lekce III. a IV.

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

8 Makra Příklad 4 Excel 2007

MS OFFICE, POWERPOINT

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 2. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

MS Excel 2007 Kontingenční tabulky

Úvodní příručka. Získání nápovědy Kliknutím na otazník přejděte na obsah nápovědy.

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Kapitola 11: Formuláře 151

Archiv elektronických dokumentů Zela

Kontingenční tabulky v MS Excel 2010

FORMÁTOVÁNÍ 1. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

z aplikace Access 2003

MS Excel Základy maker. Operační program Vzdělávání pro konkurenceschopnost. Projekt Zvyšování IT gramotnosti zaměstnanců vybraných fakult MU

Uživatelský manuál aplikace. Dental MAXweb

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

Hromadná korespondence

MS Excel Lekce 1. Operační program Vzdělávání pro konkurenceschopnost. Projekt Zvyšování IT gramotnosti zaměstnanců vybraných fakult MU

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

Obsah. Úvod Jak začít Pište a upravujte různé texty bez obav... 21

DUM 06 téma: Tvorba makra pomocí VBA

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Pracovní prostředí Excel 2010

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

Osnova, hlavní a vnořené dokumenty

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

Migrace na aplikaci Outlook 2010

Informace k e-learningu

Informace o zdroji učebního textu a poučení o jeho užívaní. Petr Broža, Libor Kříž, Roman Kučera, Pavel Nygrýn

Formátování pomocí stylů

Pracovní sešit MS Word pokročilý

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Access. Tabulky. Vytvoření tabulky

Přehledy pro Tabulky Hlavním smyslem této nové agendy je jednoduché řazení, filtrování a seskupování dle libovolných sloupců.

2.3.3 PRÁCE S JEDNÍM A VÍCE DOKUMENTY

3MA481 Propojení Accessu a Excelu David Hach

(IMPACT) CZ.1.07/2.2.00/

Internetový přístup do databáze FADN CZ - uživatelská příručka Modul FADN RESEARCH / DATA

MS Excel 3: Pokročilý kurz

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 6. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Prozkoumání příkazů na pásu karet Každá karta na pásu karet obsahuje skupiny a každá skupina obsahuje sadu souvisejících příkazů.

Slíbená princezna. Univerzální ComboBox

Velmi stručný návod jak dostat data z Terminálu Bloomberg do R

DATABÁZE MS ACCESS 2010

Generátor list nastavení

1. Otevřete dokument, který chcete číst. 2. Na kartě Zobrazení klikněte ve skupině Zobrazení dokumentů na položku Čtení na celé obrazovce.

Řešení. ŘEŠENÍ 36 Výsledková listina soutěže

Office podrobný průvodce. Tomáš Šimek

Úvodní příručka. Správa souborů Kliknutím na kartu Soubor můžete otevřít, uložit, vytisknout a spravovat své soubory Wordu.

Tlačítka a další prvky vestavěných panelů nástrojů a nabídek (CommandBar) a jejich Control ID ve verzi Excel 2010

Popis a ovládání. Aplikace 602XML Filler

MS Word. verze Přehled programů pro úpravu textu

Úvod...1 Instalace...1 Popis funkcí...2 Hlavní obrazovka...2 Menu...3 Práce s aplikací - příklad...5

Tabulkový kalkulátor

Začínáme pracovat s tabulkovým procesorem MS Excel

Úvod. Program ZK EANPRINT. Základní vlastnosti programu. Co program vyžaduje. Určení programu. Jak program spustit. Uživatelská dokumentace programu

Obsah. 1 Úvod do Visia Práce se soubory 47. Předmluva 11 Typografická konvence použitá v knize 13

3 Makra Příklad 4 Access Ve vytvořené databázi potřebuje sekretářka společnosti Naše zahrada zautomatizovat některé úkony pomocí maker.

JAK PROPOJIT R-KO a EXCEL aneb Aby se uživatel nasytil a statistik zůstal celý

Jak vyplnit daňové přiznání v Software602 Form Filler

METODICKÝ POKYN PRÁCE S MS PowerPoint - ZAČÁTEČNÍCI. Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky.

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

HELIOS - Zálohování BüroKomplet, s.r.o.

Práce s programem MPVaK

Transkript:

Obsah 1 2 3 Úvod...10 Události v Excelu...13 1.1 Využití událostí ve vlastních aplikacích... 15 Umístění procedur událostí... 15 Jak zabránit výskytu událostí... 18 1.2 Události sešitu... 19 Přehled událostí sešitu... 19 Příklady využití základních událostí sešitu... 21 1.3 Události listů... 23 Přehled událostí listu... 24 Přehled událostí grafů (listu typu graf)... 28 1.4 Události aplikace Excel... 31 Práce s grafy pomocí jazyka VBA...33 2.1 Úvod...... 34 Grafy v objektovém modelu VBA... 34 2.2 Základní postupy při práci s grafy... 37 Vytvoření nového grafu pomocí kódu VBA... 37 2.3 Práce s datovými řadami... 42 Kolekce SeriesCollection... 42 Práce s jednotlivými datovými řadami... 45 Pokročilé techniky práce s grafy... 48 Automatické přizpůsobení hodnot osy Y... 48 2.4 Formátování grafu... 51 2.5 Přehled vlastností a metod objektů... 52 Vlastnosti objektu ChartObject... 52 Metody objektu ChartObject... 54 Vlastnosti objektu Chart... 54 Metody objektu Chart... 56 Třídy objektů a moduly tříd...57 3.1 Proč, k čemu, jak... 58 3.2 Vytvoření nové třídy a konkrétní instance... 59 První pokus... 60 Vytváření vlastností a metod... 62 Zachycení událostí objektu Application pomocí třídy... 67 Zachycení událostí vložených grafů... 68 Příklad: použití událostí u vloženého grafu... 69 OBSAH 5

4 Formuláře...73 4.1 Vytvoření formuláře, jeho zobrazení a ukončení pomocí VBA... 75 Modul kódu formuláře...76 Toolbox (souprava nástrojů)...76 Spuštění formuláře...77 Modální a nemodální formuláře...78 Uzavření formuláře...79 4.2 Okno Properties...80 4.3 Ovládací prvky...82 Přidání ovládacího prvku do formuláře...82 Výběr ovládacího prvku na formuláři...84 Konvence pro názvy formulářů a ovládacích prvků...85 Pořadí ovládacích prvků na formuláři...86 Dostupnost ovládacích prvků a přesun mezi nimi...88 Úprava ovládacích prvků ve formuláři...89 4.4 Přehled typů ovládacích prvků...91 Příkazové tlačítko (CommandButton)...91 Popisek (Label)...92 Textové pole (TextBox)...93 Zaškrtávací políčko (CheckBox)...94 Přepínač (OptionButton)...95 Seznam (ListBox)...96 Rozvírací seznam (ComboBox)...99 Rámeček (Frame)...100 Přepínací tlačítko (ToggleButton)...101 Číselník (SpinButton)...101 Posuvník (ScrollBar)...102 RefEdit...102 Vícenásobná stránka (MultiPage)...102 Karty (TabStrip)...103 Obraz (Image)...104 4.5 Odkazy na formuláře a ovládací prvky v kódu VBA...105 Příklad formulář pro zobrazení informací o listu...106 Další příklad seznam všech pojmenovaných názvů v sešitu.. 108 Ukázka práce se zaškrtávacími políčky a přepínači...111 4.6 Zpracování událostí souvisejících s klávesnicí a myší...113 Události klávesnice...115 4.7 Používání ovládacích prvků přímo na pracovním listu...116 4.8 Základní společné vlastnosti a metody ovládacích prvků a uživatelských formulářů...119 6 OBSAH

5 6 Vlastnosti ovlivňující vzhled a chování formuláře či ovládacích prvků... 119 Další společné vlastnosti... 121 Metody formuláře nebo ovládacích prvků... 121 4.9 Přehled důležitých vlastností a metod objektu UserForm... 122 Vlastnosti... 122 Metody... 124 Základní události formuláře... 124 4.10 Sdílení formulářů... 124 Práce s externími soubory, export a import souborů...127 5.1 Práce s externími soubory... 128 Základní operace se soubory... 128 5.2 Jednoduché čtení a zápis textových souborů... 132 5.3 Vlastní manipulace s textovými soubory... 136 Otevření textového souboru... 137 Načtení obsahu textového souboru... 138 Zápis údajů do textového souboru... 139 Import dat do listu Excelu pomocí příkazu Line Input #... 139 Načítání textového souboru příkazem Input #... 141 Zápis do souborů příkazy Write # a Print #... 141 Export oblasti buněk do textového souboru pomocí příkazu Write #... 142 Využití příkazu Write pro zápis údajů o chybách za běhu programu... 143 5.4 Ukládání různých nastavení do registru Windows... 144 Použití příkazů SaveSetting, DeleteSetting a funkcí GetSetting, GetAllSettings... 145 Další možnosti pro ukládání nastavení... 145 Databáze a seznamy v Excelu...147 Základní terminologie... 149 Ruční správa seznamu pomocí nabídky Excelu... 149 6.1 Vytvoření seznamu... 149 Pořizování záznamů v seznamu... 150 6.2 Řazení, filtrování a další operace s databázemi Excelu pomocí VBA... 150 6.3 Příklad jednoduché aplikace využívající formuláře (Adresář)... 155 Jak načítat a ukládat data... 156 Činnosti při otevření formuláře... 157 OBSAH 7

7 8 9 Obecné procedury pro načtení záznamu, uložení původních hodnot a uložení změn...158 Tlačítka pro přechod na další (předchozí záznam)...161 Pracovní prostředí Excelu nabídky a penely nástrojů...165 7.1 Části pracovní plochy Excelu a jejich zobrazení či skrytí pomocí VBA...166 7.2 Panely nabídek a panely nástrojů možnosti manipulace s nimi...170 Kolekce CommandBars, objekty CommandBar...170 Objekt CommandBarControl a objekty vyjadřující jednotlivé typy ovládacích prvků...172 7.3 Práce s nabídkami a panely nástrojů...173 Vytváření a odstranění vlastních panelů a nabídek...173 Úprava existujících panelů a nabídek...175 7.4 Místní nabídky...181 Vytvoření, úprava a odstranění nové místní nabídky...182 7.5 Přehled vlastností a metod objektů CommandBars a CommandBar...183 Vlastnosti kolekce CommandBars...183 Metody kolekce CommandBars...183 Vlastnosti objektu CommandBar...184 Metody objektu CommandBar...185 Základní vlastnosti a metody ovládacích prvků na panelech příkazů...186 Doplňky v Excelu...187 8.1 Účel doplňků a přehled doplňků dodávaných přímo s Excelem... 189 8.2 Obecné zásady pro vytváření doplňků...190 8.3 Příklad doplňku převod do HTML...192 Formulář...192 Programový kód doplňku...193 Spolupráce s dalšími programy...197 9.1 Spouštění a aktivace jiných aplikací...198 Funkce Shell...198 Spuštění programů pomocí technologie Automation...199 Přepínání mezi několika programy...202 9.2 Technologie Automation a její využití pro spolupráci s Wordem nebo Outlookem...203 Příklady práce s Wordem...203 Příklady práce s Outlookem...205 8 OBSAH

10 Funkce Windows API...211 10.1 Co se skrývá za zkratkou API... 212 Deklarace API funkcí a příkazů... 212 10.2 Konstanty a uživatelské typy proměnných v API... 213 Další lahůdky spojené s voláním rutin API... 215 Několik varování... 216 10.3 Základní příklady na používání Windows API... 216 Práce s disky, složkami a soubory... 217 Práce se systémem Windows... 219 API pro práci se sítí... 221 Další vhodné ukázky... 222 Kde hledat dále?... 223 Rejstřík...225 OBSAH 9

Úvod Kniha se zaměřuje na základy programování v Excelu 2003; pokud máte starší verze Excelu (97, 2000, 2002), můžete se podle ní učit také, z hlediska základů programování se tyto verze neliší. Tato kniha volně navazuje na knihu s názvem Excel 2000, 2002, 2003 záznam, úprava a programování maker (Grada, 2004), v níž 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. Kniha, již však držíte v rukou právě teď, je učebnicí pokročilých programovacích technik a objektů. V celém textu se snažím být maximálně stručný, což je přirozený důsledek dlouholeté zkušeností lektora, který ví, že jeho posluchači (čtenáři) se chtějí něco naučit a ne poslouchat marketingové a jiné podobné bláboly. Sem tam na některé věty či pasáže narazíte vícekrát opakování je matka moudrosti. 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 předpokládám, že umíte Excel ovládat a víte, k čemu všemu se dá použít. Např. v části věnované programování grafů 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ě. Schází především česká referenční příručka s kompletním českým překladem nápovědy k objektům, vlastnostem, metodám a událostem, i když se v tomto směru stále dá doporučit výtečná knížečka Programování Office 97 od Markéty a Petra Šitinových, kterou vydalo nakladatelství Grada v roce 1998. 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 sdds@seznam.cz 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é prvky: Pozor! Název Soubor Storno Důležité pojmy a pasáže textu, které je třeba zvýraznit, jsou vysazeny tučně. Názvy firem, softwarových produktů, aplikací a jednotlivých objektů programu označuji kurzívou. Názvy souborů, složek a internetové adresy. Texty, které se objevují v uživatelském prostředí aplikací Windows, jsou vysazeny jako běžný text, ale v tučné kurzivě. Takto jsou odlišeny příkazy nabídek, popisky ovládacích tlačítek, názvy dialogových oken a další citace z obrazovky. 10 ÚVOD

Vložit Rám KLÁVESA Program Jednotlivé příkazy v posloupnosti příkazů zadávané v nabídkách, podnabí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 ALT+S. Pro výpis zdrojového kódu v příkladech a pro odlišení jednotlivých prvků programu v běžném textu je použito bezpatkové 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: Píšící ruka označuje poznámku, která není nezbytná k pochopení dané problematiky, ale týká se tématu a prozrazuje další souvislosti. Usměváček 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 efektních výsledků. Varovně vztyčený prst 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 mohlo způsobit problémy. Bomba je předzvěstí katastrofy nebo alespoň velkých nepříjemností. Tato ikona totiž označuje text upozorňující na skutečnosti, vedoucí ke ztrátě dat, zhroucení systémů a podobným havarijním stavům. ÚVOD 11

1. Události v Excelu 13

1. Události v Excelu V prvním dílu učebnice byly události zmíněny jen velmi stručně, nyní přišel čas věnovat se jim podrobněji. V dalších kapitolách se s jejich využitím budete setkávat velmi často. Připomeňme si, co už víte událost (angl. event) je akce vyvolaná uživatelem nebo systémem, kterou objekt (obecně, nejenom v Excelu) dokáže rozpoznat. 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á událost má přiřazenu svoji proceduru (říká se jí událostní procedura, angl. event procedure), která standardně neobsahuje žádný kód. Napíšete-li však nějaký kód do událostní procedury, 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. Objekty Excelu umí reagovat na velké množství událostí. Rozsah této knihy proto umožní představit si jen některé z nich, stručný přehled všech událostí je uveden vždy v příslušné části kapitoly: Události sešitu: Probíhají v rámci sešitu. Jako příklad lze uvést událost Open (vytvoření nebo otevření sešitu), BeforeSave (sešit bude uložen), BeforePrint (sešit bude tištěn) nebo NewSheet (je přidáván nový list). Události listu: Jsou vyvolány pro určitý list. Sem patří např. událost Activate (list je aktivován), SelectionChange (změna výběru na listu) či Calculate (list je přepočítáván). Události grafu: Jsou vyvolány pro určitý list typu graf. Patří mezi ně události Resize (po změně velikosti grafu) či SeriesChange (změna datového bodu v nějaké datové řadě). Pro zachytávání událostí v grafech vložených na pracovním listu je nutné použít modul třídy (ty budou podrobně probrány ve třetí kapitole). Události celé aplikace: Probíhají na úrovni celé aplikace (Excelu). Mezi nejvýznamnější patří např. NewWorkbook (vytvoření nového sešitu) nebo SheetChange (proběhla změna buňky v libovolném sešitu). Pro práci s událostmi aplikace je vždy nutný modul třídy. Události formulářů a jejich ovládacích prvků: Vyskytují se v rámci určitého formuláře nebo ovladače. Události, které neprobíhají v rámci žádného objektu: Sem patří dvě události na úrovni celé aplikace OnTime a OnKey. Funkčně se odlišují od jiných událostí. Některé akce spouští více událostí za sebou. Např. při otevírání sešitu proběhnou postupně tyto události sešitu: Open Activate WindowActivate 14 UDÁLOSTI V EXCELU

Při uzavírání sešitu probíhají (minimálně) tyto události sešitu: BeforeClose WindowDeactivate Deactivate Posloupnosti událostí bývají mnohem složitější, než si můžete představit na základě těchto příkladů. V obou ukázkách šlo navíc jen o události na úrovni sešitu. Např. při přidání nového listu do sešitu však proběhnou i události na úrovni listu a celé aplikace. Posloupnost událostí navíc nemusí být vždy zcela logická při přidání nového listu do sešitu proběhne nejdříve událost SheetActivate (aktivace listu) a až poté událost WorkbookNewSheet (nový list v sešitu). Další sekvence můžete zkoumat sami podle libosti, nejjednodušší je zapsat do každé zkoumané událostní procedury příkaz: Debug.Print "Název_Procedury" Bližší průzkum posloupností, v jakých jednotlivé události probíhají, se ovšem v praxi vyplatí pouze v případech, kdy využíváte větší množství událostí. Chcete-li spustit jednu proceduru při otevření sešitu a druhou při přepočtu určitého listu, není třeba se ničeho obávat. 1.1 Využití událostí ve vlastních aplikacích Aplikace řízené událostmi jsou v systému Windows rozšířeny tak, že už si to ani neuvědomujeme. Každé dialogové okno je typickou ukázkou po klepnutí na tlačítko nebo po změně hodnoty určitého ovladače je okamžitě provedena nějaká operace. Klepnutí nebo poklepání myší, pohyb kurzorem nebo stisk klávesy jsou také událostmi, které je každý prvek v dialogovém okně schopen rozeznat. Umístění procedur událostí Velmi častou chybou mnoha začátečníků (v diskusních konferencích narazíte na spoustu dotazů) je fakt, že procedury, které by měly při vzniku nějaké události proběhnout, nejsou spuštěny. Příčina problému je jednoduchá událostní procedury je třeba vždy zapsat na správné místo. V okně Project může mít každý sešit tyto části: Objekty jednotlivých listů: Jejich počet odpovídá počtu pracovních listů v sešitu. Objekty jednotlivých listů typu graf: Přidáte-li do sešitu graf na samostatném listu. Objekt ThisWorkbook: Představuje celý sešit. Standardní moduly VBA ve složce Modules: Do těchto modulů nikdy neumisťujte událostní procedury. Jejich hlavičky se ve standardních modulech ani nevyskytují, musely byste je tam ručně dopisovat. Moduly tříd: Události v modulech tříd si vysvětlíme ve třetí kapitole. Formuláře: Podrobný výklad událostí u formulářů je ve čtvrté kapitole. UDÁLOSTI V EXCELU 15

Obrázek 1.1 Různé části projektu Excelu. Když myší poklepete na objekt listu nebo objekt ThisWorkbook, otevře se okno kódu daného objektu. V jeho horní části jsou dva rozevírací seznamy. Levý seznam obsahuje řádek (General) a řádky Worksheet, Chart nebo Workbook. Část General znáte z klasických modulů: slouží pro deklarování proměnných, které mají svůj rozsah platnosti na úrovni modulu, v praxi tu tedy budete deklarovat proměnné, jež budete používat ve více událostech, probíhajících v daném modulu. Pozor na to, že proměnné, které deklarujete v modulu ThisWorkbook nebo v modulech listů jako veřejné (Public), nejsou dostupné z žádného jiného modulu, tedy ani z jiného modulu listu nebo ze standardních modulů! Veřejné proměnné musíte vždy deklarovat klíčovým slovem Public ve standardním modulu! Stejné pravidlo platí i pro všeobecné procedury ty musí být umístěny také ve standardním modulu. VBA vám sice umožňuje vkládat je i do modulů listů nebo do modulu ThisWorkbook, ale takové procedury je možné spouštět jen v rámci daného modulu! Po krátké odbočce se vraťme zpět k oknu kódu pro moduly listů či modul ThisWorkbook. Vyberete-li v levém seznamu druhý řádek (Worksheet, Chart nebo Workbook), objeví se v pravém seznamu všechny události, které můžete pro list či sešit využít. Jakmile v pravém rozvíracího seznamu vyberete nějakou událost, vloží editor VBA do okna modulu hlavičku odpovídající (prázdné) procedury: Private Sub Workbook_Activate() Veškerý kód zapsaný mezi tyto dva řádky bude proveden při každém vyvolání dané události. 16 UDÁLOSTI V EXCELU

Obrázek 1.2 V pravém rozevíracím seznamu okna kódu vidíte události, které můžete zachytávat na úrovni listu či sešitu. Některé událostní procedury obsahují v závorce za názvem procedury ještě seznam parametrů. Ty jsou vestavěny a vy jejich deklarace v žádném případě nemůžete měnit! Stejně tak nelze do seznamu parametrů přidávat parametry nové. Parametry událostí se vyskytují tam, kde jedna událost může proběhnout pro více různých objektů, nebo kde vám systém předává ještě dodatečné údaje k dané události. Např. u události pohybu myší nad objektem (MouseMove) dostanete předány souřadnice kurzoru (při události stisknutí tlačítka myši MouseDown zase údaj o tom, které tlačítko bylo stisknuto). Dalším příkladem je událost SheetActivate (je na úrovni sešitu, proto ji najdete v modulu ThisWorkbook) proběhne při aktivaci některého listu v sešitu. Aby bylo možné určit, který list byl aktivován, je odkaz na aktivovaný list (tedy na objekt Worksheet nebo Chart, deklarovaný ovšem jako Object) předán jako parametr procedury: Private Sub Workbook_SheetActivate(ByVal Sh As Object) Deklarace parametru jako typ Object má v tomto případě určité nepříjemné důsledky. Musíte totiž rozlišovat, zda byl aktivován list typu graf nebo pracovní list. Např. následující kód proběhne v pořádku, bude-li aktivován pracovní list: Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox Sh.Name ' název listu MsgBox Sh.Rows.Count ' počet řádků v listu Při aktivaci listu typu graf by pochopitelně došlo k chybě za běhu programu ve druhém řádku, protože list typu graf neobsahuje žádné řádky a tudíž odkaz na kolekci Rows není platný. Jak si můžete ověřit, který typ listu byl aktivován? Slouží k tomu operátor TypeOf, volaný např. v bloku If End If: ' zde bude operace, kterou je možné provádět jen pro pracovní listy Private Sub Workbook_SheetActivate(ByVal Sh As Object) If TypeOf Sh Is Worksheet Then ElseIf TypeOf Sh Is Chart ' a zde operace pro listy typu graf End If UDÁLOSTI V EXCELU 17

* V některých událostních procedurách se objevuje logický parametr Cancel. Např. deklarace událostní procedury BeforeClose v modulu ThisWorkbook vypadá takto: Private Sub Workbook_BeforeClose(Cancel As Boolean) Výchozí hodnota předaného parametru Cancel je False. Jestliže však ve vlastním kódu procedury nastavíte tento parametr na True, nebude sešit uzavřen. Ukázku možného využití představuje zákaz uzavření sešitu, zapomněl-li uživatel vytisknout denní přehled: Private Sub Workbook_BeforeClose(Cancel As Boolean) dotaz = "Vytisknul jste denní přehled změn?" odpoved = MsgBox(dotaz, vbyesno, "Ukončení práce...") If odpoved = vbno Then Cancel = True Procedura Workbook_BeforeClose je spuštěna po vydání příkazu k uzavření sešitu (Soubor Zavřít, Soubor Konec apod.). Procedura nejdříve zobrazí okno hlášení a odpoví-li uživatel záporně klepnutím na tlačítko Ne, bude parametr Cancel nastaven na hodnotu True. Uzavření sešitu je poté zrušeno. Jak zabránit výskytu událostí V praxi se setkáte se situacemi, kdy máte pro určitou událost napsán kód, ale tento kód může být prováděn jen někdy. Např. při otevírání sešitu nebude z nějakého důvodu žádoucí, aby byl proveden kód události Activate. Při každé další aktivaci daného sešitu však už kód proveden být musí. Obdobně se můžete potkat s případy, kdy v kódu událostní procedury provedete něco, čím danou událost znovu spustíte. Změníte-li např. v události listu Change hodnotu buňky v tomto listu (příklad si ukážeme za chvíli), bude událost Change generována znovu. V takovém případě ovšem hrozí nekonečné zacyklení kódu. Existuje dvojí možné řešení těchto situací. Buď zachytávání událostí zcela vypnete, nebo použijete logickou proměnnou, která ukončí provádění kódu. První řešení je lepší, protože událost vůbec není vyvolána, ovšem jeho nevýhodou je fakt, že neproběhnou vůbec žádné události. Logická proměnná nic nepotlačuje, jen bezprostředně ukončí provádění kódu v událostní proceduře. Zachytávání událostí vypnete takto: Debug.Print "Název_Procedury" Vlastnost EnableEvents má logické hodnoty True/False, za řádkem, který by vyvolal nežádoucí generování událostí, zase zachytávání zapnete. Ukázka druhého přístupu pomocí logické proměnné potlačí generování události Activate při otevření sešitu: 18 UDÁLOSTI V EXCELU

' proměnnou deklarujeme v modulu ThisWorkbook - jinde ji nepotřebujeme Private lpotlaceni As Boolean Private Sub Workbook_Activate() If lpotlaceni Then ' při otevření sešitu proběhne tato část lpotlaceni = False Exit Sub Else ' zde bude kód, ' který bude proveden při dalších aktivacích sešitu End If Private Sub Workbook_Open() lpotlaceni = True 1.2 Události sešitu Tyto události probíhají v rámci konkrétního (jednoho) sešitu. Jejich událostní procedury jsou uloženy v modulu kódu pro objekt ThisWorkbook. Úplný seznam událostí je uveden dále, po něm se zaměříme na nejdůležitější události, které se v praxi používají. Jestliže potřebujete zachytávat události pro libovolný otevřený sešit, musíte používat události na úrovni celé aplikace. Tato problematika je popsána v třetí kapitole této knihy, seznam událostí objektu Application najdete v závěru této kapitoly. Přehled událostí sešitu Událost Activate AddinInstall AddinUninstall AfterXmlExport AfterXmlImport Akce, která vyvolá událost Otevření sešitu a přechod do libovolného okna sešitu z jiného sešitu. Událost neproběhne při vytváření nového okna sešitu ani při přechodu mezi dvěma okny téhož (v tom případě však proběhne událost Window- Activate). Sešit je instalován do prostředí Excelu jako doplněk. Odinstalování sešitu, který je nainstalován jako doplněk. Uložení nebo export dat ze sešitu do datového souboru XML. Nové načtení dat pomocí existujícího datového připojení, nebo import dat XML do sešitu. BeforeClose Probíhá před uzavřením sešitu (= byl vydán příkaz k uzavření sešitu). UDÁLOSTI V EXCELU 19

Událost BeforePrint BeforeSave BeforeXmlExport BeforeXmlImport Deactivate NewSheet Open PivotTableClose- Connection PivotTableOpen- Connection SheetActivate Akce, která vyvolá událost Probíhá před vytištěním sešitu (nebo jeho části). Probíhá před uložením sešitu. Proběhne předtím, než Excel uloží nebo exportuje data ze sešitu do datového souboru XML. Proběhne před novým načtením dat pomocí existujícího datového připojení, nebo po naimportování dat XML do sešitu. Při deaktivaci sešitu (probíhá též při uzavírání sešitu, ale až po události BeforeClose). Vložení nového listu do sešitu. Odkaz na nový list je do události předán jako parametr Sh. Otvírání sešitu. Po této události probíhá ještě událost Activate. Proběhne poté, co kontingenční tabulka uzavře připojení ke zdroji dat. Proběhne poté, co kontingenční tabulka otevře připojení ke zdroji dat. Aktivace libovolného listu v sešitu. SheetBeforeDoubleClick Při poklepání na libovolném listu. Událost probíhá před výchozí akcí pro poklepání. SheetBeforeRightClick SheetCalculate SheetChange SheetDeactivate SheetFollowHyperlink SheetPivotTableUpdate Po klepnutí pravým tlačítkem myši na libovolném listu. Událost probíhá před výchozí akcí pro klepnutí pravým tlačítkem myši. Při přepočítání obsahu libovolného listu. Obsah libovolného sešitu je měněn uživatelem nebo aktualizací vnějšího propojení. Při deaktivaci libovolného listu v sešitu. Při klepnutí myší na libovolný hypertextový odkaz v libovolném listu. Po aktualizaci listu s kontingenční tabulkou. SheetSelectionChange Změna výběru na libovolném listu, s výjimkou listů typu graf. 20 UDÁLOSTI V EXCELU

Událost Sync WindowActivate WindowDeactivate WindowResize Akce, která vyvolá událost Synchronizace lokální kopie pracovního listu, která je součástí pracovního prostoru dokumentu, s kopií na serveru. Aktivace kteréhokoli okna sešitu. Deaktivace kteréhokoli okna sešitu. Změna velikosti kteréhokoli okna sešitu. Příklady využití základních událostí sešitu Událost Open Tato událost je využívána zřejmě nejčastěji. Způsoby jejího využití jsou skutečně bohaté: Otevření dalších potřebných sešitů, případně doplňků. Nastavení vlastních panelů nástrojů či nabídek, případně klávesových zkratek. Přechod na určitý list. Zobrazení úvodního formuláře, sloužícího jako uživatelské rozhraní. Automatické provedení určitých výpočtů. Zápis údajů do protokolu, ve kterém je sledována činnost uživatele (ti zkušenější z vás samozřejmě vědí, že k těmto účelům se dá využít i Deník v Outlooku nebo zvláštní aplikace ). Nastavení vlastnosti listu ScrollArea (ta není ukládána spolu se sešitem). Budete-li při otevírání sešitu držet stisknutou klávesu SHIFT, není událostní procedura Workbook_Open spuštěna (jde o jednu z možností, jak se bránit makrovirům). Ukážeme si jednoduchý kód, uložený v sešitu složeném z 13 listů (prvních 12 listů pro jednotlivé měsíce a poslední list pro souhrnné údaje). Při otevírání sešitu je zkontrolováno datum a podle aktuálního měsíce je aktivován příslušný list. ' v deklarační části modulu ThisWorkbook příkaz Option Base 1 ' způsobí číslování prvků pole od jedničky, nikoli od nuly Option Base 1 Private Sub Workbook_Open() Dim varmesice varmesice = Array("Leden", "Únor", "Březen", "Duben", _ "Květen", "Červen","Červenec", "Srpen", "Září", "Říjen", _ "Listopad", "Prosinec") Worksheets(varMesice(Month(Date))).Activate Názvy listů jsou pomocí funkce Array uloženy do pole varmesice a metoda Activate při otevření sešitu zobrazí požadovaný list. UDÁLOSTI V EXCELU 21

Události Activate, Deactivate Událost Activate je vyvolána při aktivaci sešitu (jeho libovolného okna). Využití této události je opět pestré: Úprava velikosti aktivovaného okna. Zobrazení či skrytí některé nabídky nebo panelu nástrojů, která/ý je platná/ý jen pro daný sešit. Aktualizace údajů ve stavovém řádku. Ukázka kódu pro tuto událost obsahuje maximalizaci okna sešitu při jeho aktivaci a zobrazení speciálního panelu nástrojů. Private Sub Workbook_Activate() ActiveWindow.WindowState = xlmaximized CommandBars("Statistika").Visible = True Událost Deactivate proběhne při přechodu do jiného sešitu, při skrytí sešitu nebo před jeho uzavřením, tedy v případech, kdy sešit přestává být aktivní. Její využití je obdobné jako u události Activate (zobrazení či skrytí některé nabídky nebo panelu nástrojů). Private Sub Workbook_Deactivate() CommandBars("Statistika").Visible = False Událost BeforeSave Tato událost proběhne těsně před skutečným fyzickým uložením sešitu. Pomocí parametru SaveAsUI je možné v této události rozlišit, zda bude či nebude zobrazeno dialogové okno Uložit jako (to se zobrazí v případech, kdy sešit ještě nebyl uložen, byl otevřen pouze pro čtení nebo když uživatel chce sešit uložit pod jiným názvem (příkaz Soubor Uložit jako). Parametr Cancel umožňuje zrušit uložení souboru. ' kód, který se provede před zobrazením dialogového okna Uložit jako Private Sub Workbook_BeforeSave _ ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI Then End If Událost BeforePrint Je spuštěna před vytištěním dokumentu nebo zobrazením tiskového náhledu (poté, co uživatel zadal příslušný příkaz). V této události se vyskytuje již probraný parametr Cancel, takže tisk sešitu nebo jeho části lze zrušit nastavením hodnoty tohoto parametru na True. Jednoduchá ukázka využití této procedury zobrazí okno hlášení, upozorňující uživatele, aby se přesvědčil, zda má založen správný typ papíru: Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim odpoved As Integer odpoved = MsgBox("Tento sešit musí být tištěn na listy formátu A3." _ & " Máte v tiskárně tyto listy připraveny?", vbyesno) If odpoved = vbno Then Cancel = True 22 UDÁLOSTI V EXCELU

Při testování událostních procedur BeforePrint používejte namísto fyzického tisku pouze náhled ušetří vám to čas i peníze. Událost BeforeClose Poslední důležitá událost sešitu proběhne před jeho uzavřením. V této události obvykle probíhají uklízecí operace čili obnova původního stavu. Jestliže jste při otevírání určitého sešitu zobrazili speciální panel nástrojů, je vhodné ho skrýt. Stejně tak je vhodné uzavřít všechny pomocné sešity apod. Při úklidu je třeba dát pozor na jeden zádrhel událost BeforeClose probíhá ještě před zobrazením výzvy k uložení sešitu. Vydáte-li tedy příkaz k uzavření sešitu a změny v něm provedené nebyly uloženy, proběhne nejdříve událostní procedura BeforeClose a teprve poté se zobrazí známé dialogové okno: Obrázek 1.3 Výzva k uložení provedených změn. Jestliže nyní klepnete na tlačítko Zrušit, zůstane sešit otevřen, ale bude již uklizeno. Jedná se o problém, který byl již mnohokrát publikován. V události BeforeClose se uživatele dotážete vlastním oknem hlášení a podle jeho odpovědi buď sešit uložíte nebo nastavíte vlastnost sešitu Saved na True (tím ho uzavřete bez uložení změn), případně proceduru předčasně ukončíte pomocí parametru Cancel sešit pak uzavřen nebude. Private Sub Workbook_BeforeClose(Cancel As Boolean) If Not Me.Saved Then Msg = "Chcete uložit provedené změny?" Odp = MsgBox(Msg, vbquestion + vbyesnocancel) Select Case Odp Case vbyes Me.Save Case vbno Me.Saved = True Case vbcancel Cancel = True Exit Sub End Select End If ' zde bude kód pro "úklid" 1.3 Události listů V další části kapitoly se zaměříme na události objektů Worksheet. Každý list sešitu má svůj vlastní modul kódu, který najdete a otevřete v okně projektu. UDÁLOSTI V EXCELU 23

Obrázek 1.4 Moduly listů v okně projektu. Přehled událostí listu Událost Activate Akce, která vyvolá událost Aktivace listu. BeforeDoubleClick Poklepání na listu. BeforeRightClick Calculate Deactivate FollowHyperlink Change PivotTableUpdate SelectionChange Událost Change Klepnutí pravým tlačítkem myši na listu. Přepočítání listu. Deaktivace listu. Klepnutí myší na libovolný hypertextový odkaz v listu. Obsah buněk je měněn uživatelem nebo aktualizací vnějšího propojení. Aktualizace kontingenční tabulky na listu. Změna výběru buněk na listu. Je využívána asi nejčastěji. Proběhne při každé změně hodnoty libovolné buňky v listu, ať už změnu vyvolá uživatel, kód VBA nebo aktualizace vnějšího propojení. Neprobíhá však při přepočtu vzorce zapsaného v buňce (to je možné zachytit v události Calculate), při změně formátu buňky (s výjimkou příkazu Úpravy Vymazat Formáty) nebo při přidání nějakého objektu (grafu, obrázku) do listu. Událost Change také neproběhne při změně buněk pomocí příkazů Excelu (např. Data Seřadit nebo Úpravy Nahradit) a při přidání/odstranění komentáře. 24 UDÁLOSTI V EXCELU

Z předchozího odstavce vyplývá, že událost Change není ideálním nástrojem pro sledování proběhlých změn. Co se ale dá jinak dělat? Událost Calculate je v tomto ohledu zcela nanic, protože v ní není možné sledovat, v které části listu došlo ke změnám událost nemá žádné parametry. V události Change však víte, které buňky změnily svůj obsah. Měněná buňka nebo oblast buněk je do události Change předána jako parametr Target (typu Range). Private Sub Worksheet_Change(ByVal Target As Range) Ve většině případů vás nebudou zajímat změny libovolné buňky, ale jen buňky určité nebo nějaké oblasti na listu. Jak zjistit, jestli změna proběhla právě tam, kde vás to zajímá? Možné způsoby jsou dva. V prvním případě použijeme metodu Intersect, která vrací pravoúhlý průnik dvou různých oblastí na listu. Můžeme tedy určit, zda se oblast, ve které došlo ke změně, nachází uvnitř oblasti, která nás zajímá. Private Sub Worksheet_Change(ByVal Target As Range) Set prunik = Application.Intersect _ (Target, Worksheets("List1").Range("D10")) If Not prunik Is Nothing Then MsgBox "ano" End If Vrátí-li metoda Intersect prázdnou oblast (průnik dvou oblastí je prázdný), není možné s tímto objektem pracovat. Testovací podmínka prunik Is Nothing používá operátor Is, protože porovnáváme objekty. Rovnítko (=) nelze při porovnávání objektů použít. V druhém případě použijeme metodu Union, která slučuje dvě oblasti, vrací tedy oblast všech buněk ležících v obou oblastech, zadaných jako parametry této metody. Kód vypadá obdobně, tentokrát však nebudeme porovnávat oblasti, ale jejich adresy, proto je v testovacím výrazu Union(Target, ZajmovaOblast).Address = ZajmovaOblast.Address klasické rovnítko: Private Sub Worksheet_Change(ByVal Target As Excel.Range) Set ZajmovaOblast = Worksheets("List1").Range("d1:e5") If Union(Target, ZajmovaOblast).Address = _ ZajmovaOblast.Address Then ' Target se nachází celý uvnitř oblasti ZajmovaOblast End If Takto je tedy možné určit, zda se měněná buňka nebo buňky nachází v určité oblasti. Co se poté bude v kódu dít, závisí už jen na vašich potřebách. Událost Change se dá využít např. pro: Ověřování zadávaných hodnot. Vestavěný nástroj Excelu pro ověřování dat totiž nelze použít vždy např. při vložení dat ze schránky nástroj Ověřování nefunguje! A kdyby jen nefungoval, u buněk, do kterých jste ze schránky něco vložili, je navíc ověřovací pravidlo vymazáno! Takže je skoro lepší vždy ověřovat zadané hodnoty kódem VBA. UDÁLOSTI V EXCELU 25

Vyloučení duplicitních údajů v určitém řádku, sloupci či oblasti. Změnu formátování buněk. Jednoduchá ukázka použití této procedury kontroluje zadané hodnoty v daném sloupci a zadá-li uživatel hodnotu, která v daném sloupci již je, je tato smazána, buňka zůstane aktivní a zobrazí se okno s varovným hlášením. Z kontroly jsou vyloučeny prázdné buňky a buňky obsahující vzorce. Protože v kódu události Change provádíme změnu hodnoty buňky, dojde k opakovanému vyvolání události Change! Vzhledem k tomu, že hodnotu nastavujeme na prázdný řetězec, nemůže dojít k zacyklení (prázdné buňky nejsou kontrolovány), ale i tak je v kódu vypnuto zachycování událostí, aby celá procedura nebyla zbytečně spouštěna podruhé. Private Sub Worksheet_Change(ByVal Target As Range) Dim bunka As Range, list As Worksheet, hlaseni As String ' proměnné list a hlaseni ' používám jen kvůli zkrácení zápisu v této knize Set list = ActiveSheet hlaseni = "Zadaná hodnota se již v tomto sloupci vyskytuje" ' je-li měněno více buněk najednou, nebudeme kontrolu provádět If Target.Cells.Count > 1 Then Exit Sub ' zkontrolujeme všechny buňky daného sloupce obsahující hodnoty For Each bunka In list.columns(target.column).specialcells _ (xlcelltypeconstants) ' první blok If zamezí porovnání měněné buňky se sebou samou If Target.Address <> bunka.address Then ' druhý blok If provádí vlastní porovnání hodnot If Target.Value = bunka.value Then ' vypneme zachytávání událostí Application.EnableEvents = False ' vymažeme obsah buňky Target.Value = "" ' vybereme znovu tuto buňku, ' tím zamezíme přechodu do jiné buňky ' po stisku Enteru nebo klávesové šipky Target.Select ' znovu zapneme zachytávání událostí Application.EnableEvents = True ' zobrazíme zprávu uživateli MsgBox hlaseni, vbexclamation ' dále není třeba nic kontrolovat, ' proto ukončíme For Each Exit For End If End If Next A ještě jednu ukázku, tentokrát z oblasti formátování buněk. Jestliže bude ve druhém sloupci buňka s určitou hodnotou (zde "xxx"), bude celý řádek zbarven šedě: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 Then If Target.Value = "xxx" Then Rows(Target.Row).Interior.ColorIndex = 15 Else Rows(Target.Row).Interior.ColorIndex = xlnone End If End If 26 UDÁLOSTI V EXCELU

Událost SelectionChange Tato událost je vyvolána při změně výběru buňky nebo oblasti na listu, tedy např. při klepnutí myši do jiné než aktuální buňky, po výběru nové oblasti apod. Nový výběr je do události předán jako parametr Target. Praktické použití této události může být různé: Zobrazení či skrytí určité části pracovního prostředí. Úprava grafu (zobrazení údaje pro vybranou buňku či oblast). Posunutí listu tak, aby se nově vybraná buňka zobrazila v určité pozici, např. v levém horním rohu okna. Poslední možnost si ukážeme na příkladu. Následující kód posune list tak, aby se levý horní roh nově vybrané oblasti nacházel ve druhém řádku a druhém sloupci viditelné oblasti (vlevo a nahoře ponecháme volný prostor, s výjimkou prvního řádku či sloupce, kde to pochopitelně není možné). Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveWindow.ScrollRow = IIf(Target.Row <= 1, 1, Target.Row - 1).ScrollColumn = IIf(Target.Column <= 1, 1, Target.Column - 1) End With Další ukázka zvýrazní sloupec a řádek, ve kterém se nachází aktuální buňka. V této podobě byste kód mohli samozřejmě použít jen na listu, kde buňky nemají vnitřek obarven, protože procedura na svém začátku jakékoli podbarvení smaže. Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' vymažeme předchozí podbarvení řádku a sloupce Cells.Interior.ColorIndex = 0 ' nastavíme nové podbarvení, 19 = světle žlutá Columns(Target.Column).Interior.ColorIndex = 19 Rows(Target.Row).Interior.ColorIndex = 19 Událost Calculate Proběhne při každém přepočítání listu. Protože se přepočet týká vždy celého listu, chybí tu parametr, který by umožnil identifikovat buňku či buňky, ve kterých došlo ke změnám. Obvyklým využitím této události je změna vlastností týkajících se zobrazení listu, např. přizpůsobení šířky sloupců tak, aby nové hodnoty byly vždy vidět: Private Sub Worksheet_Calculate() ' metoda AutoFit přizpůsobí šířku sloupců Columns("A:H").AutoFit Událost BeforeRightClick Proběhne poté, co uživatel klepne pravým tlačítkem myši na některou buňku (nikoli na vložený tvar nebo graf, ty mají svou událost BeforeRightClick), ale ještě před výchozí akcí pro klepnutí, tedy ještě před zobrazením místní nabídky. Setkáváme se tu opět s para- UDÁLOSTI V EXCELU 27

metrem Cancel nastavíte-li ho v událostní proceduře na True, bude výchozí akce pro klepnutí zrušena. Tímto způsobem je tedy např. možné zakázat místní nabídku pro určitou oblast na listu, případně pro celý list: ' potlačení místní nabídky pro oblast C1:D10 Sub Worksheet_BeforeRightClick(ByVal Target As Range, _ Cancel As Boolean) If Not Application.Intersect(Target, Range("c1:d10")) _ Is Nothing Then Cancel = True End If ' potlačení místní nabídky pro celý list Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Cancel = True Zákaz zobrazení místní nabídky se týká i nabídek pro celý sloupec či řádek, které se zobrazí po klepnutí pravým tlačítkem myši na záhlaví sloupce či řádku. V nápovědě Excelu 2003 je u této události uveden příklad, jak pro určitou oblast buněk přidat do místní nabídky novou položku. My jsme ovšem nabídky prozatím neprobírali, proto si to jen zapamatujte Událost BeforeDoubleClick Proběhne poté, co uživatel poklepe myší na některou buňku (nikoli na vložený tvar nebo graf, ty mají svou událost BeforeDoubleClick), ale ještě před výchozí akcí pro poklepání, tedy před editací buňky. Parametry jsou stejné jako u události BeforeRightClick a rovněž způsob využití je obdobný. Přehled událostí grafů (listu typu graf) Závorky jsou v názvu použity pro opakované zdůraznění faktu, že s událostmi grafů vložených na pracovních listech nemůžete pracovat přímo, ale jen pomocí modulu třídy. Jinak jsou ale události obou druhů grafů stejné. Podívejme se nejdříve na přehled všech událostí grafu: Událost Activate BeforeDoubleClick BeforeRightClick Akce, která vyvolá událost Aktivace listu typu graf nebo vloženého grafu. Poklepání na vloženém grafu. Tato událost proběhne před výchozí akcí pro poklepání. Klepnutí pravým tlačítkem myši na vloženém grafu. Tato událost proběhne před výchozí akcí pro klepnutí pravým tlačítkem myši. Calculate Do grafu jsou vložena nová data nebo dojde ke změně dat původních. 28 UDÁLOSTI V EXCELU

Deactivate DragOver DragPlot MouseDown MouseMove MouseUp Resize Select SeriesChange Deaktivace grafu. Nad grafem je myší přetahována oblast buněk. Do grafu je upuštěna oblast buněk přetahovaných myší. Bylo stisknuto tlačítko myši v okamžiku, kdy je ukazatel myši nad grafem. Příklad najdete ve třetí kapitole Ukazatel myši se pohybuje nad grafem. Bylo uvolněno tlačítko myši v okamžiku, kdy je ukazatel myši nad grafem. Byla změněna velikost grafu. Byla vybrána část grafu. Byla změněna hodnota datového bodu. Jak je vidět, některé události jsou stejné jako u pracovních listů, objevuje se tu však i několik, které jsou výlučnou záležitostí grafů (především DragPlot, Select a SeriesChange). Události Activate, Deactivate Proběhne při aktivaci nebo deaktivaci grafu. Využít se dá např. pro automatický výběr určité oblasti grafu, pro skrytí některých částí nabídky apod. Chcete-li např. zabránit uživateli ve změně grafu, skryjte v panelu nástrojů pro graf nabídky Formát a Graf a zakažte uživateli zobrazit panel nástrojů Graf (práce s panelem nástrojů bude probírána v jedné z dalších kapitol): Private Sub Chart_Activate() CommandBars("Chart Menu Bar").Controls("Graf").Visible = False CommandBars("Chart Menu Bar").Controls("Formát").Visible = False CommandBars("Chart").Enabled = False Dialogová okna pro formátování grafu se dají zobrazit také poklepáním myší (nebo pomocí pravého tlačítka) na určité části grafu. Tyto akce vyvolají příslušné události, ve kterých je třeba nastavit parametr Cancel na hodnotu True (popsáno dále). Událost BeforeDoubleClick Tuto událost jsme již probírali u pracovních listů, v případě grafů se však liší počet parametrů u pracovních listů byly dva, u grafů jsou čtyři, protože v pracovním listu můžete myší poklepat na buňku, zatímco u grafů je možných částí nepoměrně více. Na kterou část uživatel poklepal, vám prozradí první parametr této události, který se jmenuje ElementID. Konkrétní hodnoty jsou popsány v nápovědě. Při výběru některých částí grafu jsou předávány i parametry Arg1 nebo Arg2, obsahující doplňkové údaje. Při poklepání na některé řadě dat obsahuje parametr Arg1 pořadové číslo této řady v kolekci SeriesCollection, parametr Arg2 pak pořadové číslo aktuálního bodu této datové řady. UDÁLOSTI V EXCELU 29

První ukázkou využití této události je zákaz zobrazení dialogového okna Formát libovolné části grafu: Private Sub Chart_BeforeDoubleClick(ByVal ElementID As Long, _ ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean) Cancel = True MsgBox "U tohoto grafu není možné měnit formát." Chcete-li výchozí akci (zobrazení dialogového okna pro formátování) potlačit pouze u některé části grafu, prověřte v kódu událostní procedury hodnotu parametru ElementID, jak ukazuje šablona kódu pro tuto událost: Private Sub Chart_ BeforeDoubleClick(ByVal ElementID As Long, _ ByVal Arg1 As Long, ByVal Arg2 As Long) If ElementId = xlcharttitle Then ' byl vybrán nadpis grafu ElseIf ElementId = xlseries Then ' byla vybrána některá datová řada Událost SeriesChange K této události dojde, změní-li uživatel hodnotu některého datového bodu. Pořadová čísla řady i bodu jsou do události předány jako parametry, je tedy možné zjistit, ve které řadě ke změně došlo. Vzhledem k tomu, že v této události není možné provedenou změnu odvolat, jsou možnosti jejího využití značně omezené. Private Sub Chart_SeriesChange(ByVal SeriesIndex As Long, _ ByVal PointIndex As Long) Událost Select Proběhne při výběru některé části grafu. Parametry této události odpovídají parametrům události BeforeDoubleClick, s výjimkou posledního parametru Cancel. Následující ukázka zabraňuje výběru kterékoli z datových řad: Private Sub Chart_Select(ByVal ElementID As Long, _ ByVal Arg1 As Long, ByVal Arg2 As Long) If ElementId = xlseries Then ActiveChart.Deselect End If Události MouseDown, MouseUp, MouseMove K úvodnímu stručnému popisu v tabulce událostí si ještě uvedeme následující: při každém klepnutí myší nebo pouhém stisknutí či uvolnění tlačítka myši jsou v grafu generovány události MouseDown a MouseUp. V těchto událostech je možné zjistit, které tlačítko myši bylo stisknuto, zda přitom uživatel nestiskl ještě klávesy SHIFT, CTRL nebo ALT a také místo, na němž bylo tlačítko stisknuto. Podrobnější výklad o práci s těmito parametry najdete ve čtvrté kapitole, věnované formulářům (u nich se tyto události vyskytují také). Jednoduchou ukázku využití této události u grafů najdete ve třetí kapitole. 30 UDÁLOSTI V EXCELU

Lze jen litovat, že uvedené události nejsou k dispozici i u pracovních listů. Události BeforeRightClick a BeforeDoubleClick jsou v tomto kontextu jen velmi slabou náhražkou detekovat můžete jen stisk pravého tlačítka myši nebo poklepání. Samozřejmě chytré hlavy programátorů dumaly a dumaly a např. vydumaly řešení, kdy je na aktivní buňku položen obdélník (nakreslený tvar) s průhledným pozadím a neviditelným rámečkem ukázku tohoto řešení si můžete stáhnout z následující adresy: www.j-walk.com/ss/excel/files/drildown.exe Další možnou, ale velmi ošemetnou obezličkou, je možnost přehodit při aktivaci určitého listu navzájem tlačítka myši. Pak by bylo možné využít pro detekci stisku levého tlačítka myši událost BeforeRightClick. Ovšem při stisku pravého tlačítka by se uživatel divil, proč se mu nezobrazuje místní nabídka takže toto řešení nedoporučuji (kdo chce, najde kód pro přehození tlačítek myši v desáté kapitole). 1.4 Události aplikace Excel V této části najdete seznam všech událostí na úrovni celé aplikace Excel. Způsob jejich využití je předveden ve třetí kapitole. V tabulce je úplný přehled všech událostí na úrovni aplikace, které můžete pomocí modulu třídy zachytávat a využívat. Odkazy na sešity nebo listy, které danou událost vyvolaly, jsou vždy předávány jako vestavěné parametry událostních procedur. Událost NewWorkbook SheetActivate SheetBeforeDoubleClick SheetBeforeRightClick SheetCalculate SheetChange SheetDeactivate SheetFollowHyperlink Akce, která vyvolá událost Je vytvořen nový sešit. Aktivace libovolného listu. Poklepání na libovolném listu. Tato událost proběhne před výchozí akcí pro poklepání. Klepnutí pravým tlačítkem myši na libovolném listu. Tato událost proběhne před výchozí akcí pro klepnutí pravým tlačítkem myši. Přepočítání libovolného listu. Obsah buněk na libovolném listu je měněn uživatelem nebo aktualizací vnějšího propojení. Deaktivace libovolného listu. Klepnutí myší na libovolný hypertextový odkaz v libovolném listu. SheetPivotTableUpdate Aktualizace listu s kontingenční tabulkou. UDÁLOSTI V EXCELU 31

SheetSelectionChange WindowActivate WindowDeactivate WindowResize WorkbookActivate WorkbookAddinInstall WorkbookAddinUninstall WorkbookAfterXmlExport WorkbookAfterXmlImport WorkbookBeforeClose WorkbookBeforePrint WorkbookBeforeSave WorkbookBeforeXmlExport WorkbookBeforeXmlImport WorkbookDeactivate WorkbookNewSheet WorkbookOpen WorkbookPivotTableClose- Connection WorkbookPivotTableOpen- Connection WorkbookSync Změna výběru buněk na libovolném listu. Aktivace kteréhokoli okna sešitu. Deaktivace kteréhokoli okna sešitu. Změna velikosti libovolného okna sešitu. Aktivace libovolného sešitu. Libovolný sešit je instalován jako doplněk. Odinstalace nějakého doplňku. Proběhne po uložení nebo exportu dat XML z libovolného sešitu. Proběhne po novém načtení dat přes existující datové připojení, nebo po naimportování dat XML do libovolného sešitu. Některý ze sešitů má být uzavřen (= byl vydán příkaz k uzavření sešitu). Některý ze sešitů (nebo jeho část) má být tištěn. Některý ze sešitů má být uložen. Proběhne předtím, než Excel uloží nebo exportuje data z libovolného sešitu do datového souboru XML. Proběhne před novým načtením dat přes existující datové připojení, nebo po naimportování dat XML do libovolného sešitu. Deaktivace libovolného sešitu. V některém sešitu je vytvořen nový list. Otevření sešitu. Proběhne poté, co kontingenční tabulka v libovolném sešitě uzavře připojení ke zdroji dat. Proběhne poté, co kontingenční tabulka v libovolném sešitě otevře připojení ke zdroji dat. Synchronizace lokální kopie sešitu, který je součástí pracovního prostoru dokumentu, s kopií na serveru. 32 UDÁLOSTI V EXCELU

2. Práce s grafy pomocí jazyka VBA 33

2. Práce s grafy pomocí jazyka VBA Ve druhé kapitole se podíváme na základní postupy pro práci s grafy, které jsou velmi vhodným nástrojem pro prezentaci tabulkových dat. 2.1 Úvod Pomocí grafů můžete zobrazit souhrnnou informaci o datech téměř libovolného typu, která jsou uložena na jednom či více listech. Excel v současné době podporuje více než 100 různých podob grafu, a pomocí VBA můžete grafy vytvářet nebo upravovat. Tajemství úspěchu při programování grafů spočívá ve znalosti jejich objektové hierarchie a vlastností či metod některých objektů (celkem je jich tolik, že je nesmysl učit se všechny vlastnosti a metody nazpaměť). Proto si nejdříve zopakujeme to, co byste měli znát jako uživatelé, nikoli jako programátoři. V Excelu je možné grafy vytvářet dvojím způsobem: Jako vložený objekt na pracovním listu (graf leží na buňkách obdobně jako obrázky či jiná grafika; na listu může být libovolné množství vložených grafů). Do samostatného listu typu graf (vždy jen jeden graf na listu). Počáteční umístění grafu není konečné, graf vložený na pracovním listu můžete převést do podoby listu typu graf a naopak (ve VBA graf převedete metodou Location). Uživatelé většinou vytvářejí grafy ručně, k tomuto účelu je v Excelu propracovaný Průvodce grafem. Nejrychlejším způsobem vytvoření grafu je ovšem následující postup vyberete zdrojová data a stisknete klávesu F11. Excel vytvoří nový list typu graf a pro formát výsledného grafu použije výchozí typ (který si můžete vybrat). Při ruční úpravě grafů uživatel nejdříve označí tu část grafu, kterou chce měnit a poté může vyvolat dialogové okno s vlastnostmi pro formát dané části grafu, případně dialogové okno pro určení typu grafu, jeho možností nebo změnu zdrojových dat. V kódu VBA vždy pracujete s příslušnou částí grafu. Grafy v objektovém modelu VBA Podívejte se nejdříve na první obrázek, který vyjadřuje různé možné umístění grafů v sešitu a názorně rozlišuje mezi dvěma základními objekty, s kterými se při práci s grafy budete setkávat: Obrázek 2.1 Vrchol objektové hierarchie grafů objekty Chart a ChartObject. 34 PRÁCE S GRAFY POMOCÍ JAZYKA VBA

Ve VBA je vlastní graf vyjádřen objektem Chart. U grafů vložených na pracovním listu se však ještě objevuje jeho kontejner objekt ChartObject. Vlastnosti a metody objektu ChartObject určují vzhled a velikost vloženého grafu. Každý objekt ChartObject je členem kolekce ChartObjects, ve které jsou uloženy všechny vložené grafy jednoho listu. Obdobně jsou všechny grafy na samostatných listech členy kolekce Charts. Počet grafů na samostatných listech zjistíte takto: ActiveWorkbook.Charts.Count Počet vložených grafů na aktivním listu se dá zjistit následujícím způsobem: ActiveSheet.ChartObjects.Count Odkaz na první graf, vložený na některém listu, získáte takto: WorkSheets("List2").ChartObjects(1).Chart Ano, je to dlouhé. Nemůže to být WorkSheets("List1").ChartObjects(1) protože se jedná o odkaz na první kontejner vloženého grafu. Každý objekt ChartObject obsahuje kromě vlastního grafu ještě další objekty, jak vidíte na následujícím obrázku: Obrázek 2.2 Objekt ChartObject a objekty v něm obsažené. Objekt Border reprezentuje okraj kontejneru ChartObject, objekt Interior pak vnitřek kontejneru. Oba tyto objekty nemají žádné metody, jen několik vlastností. Ostatně slouží jen pro určení některých součástí výsledného formátu. Představili jsme si je již v prvním dílu knihy. Poslední objekt ShapeRange představuje kolekci tvarů, ale u grafů není zajímavý ani podstatný. Zatímco objektová hierarchie u třídy ChartObject je relativně jednoduchá, u třídy Chart je podřízených objektů mnohem více: PRÁCE S GRAFY POMOCÍ JAZYKA VBA 35

Obrázek 2.3 Objekt Chart a jeho podřízené objekty. Mezi nejdůležitější podřízené objekty, se kterými budete v kódu pracovat nejčastěji, patří: Objekt Series, kolekce SeriesCollection ChartArea PlotArea Část grafu, poznámky Datová řada. Na rozdíl od běžných pravidel pro názvy objektů a jejich kolekcí se kolekce všech datových řad jmenuje SeriesCollection a k jednotlivým objektům se přistupuje odkazem SeriesCollection(x): Dim s As Series For Each s In ActiveChart.SeriesCollection ' zde budou zpracovány všechny datové řady Next Oblast grafu. U plošných grafů obsahuje osy, titulek grafu, popisky os a legendu. U prostorových grafů obsahuje titulek grafu a legendu. Nepatří do ní zobrazovaná oblast grafu. Zobrazovaná oblast, ve které je vykreslen vlastní graf. Nachází se vždy uvnitř oblasti grafu. U plošných grafů obsahuje popisky dat, mřížky, spojnice trendu a další položky umístěné v oblasti grafu. U prostorových grafů obsahuje navíc i stěny, podstavu, osy, popisky os a značky na osách. 36 PRÁCE S GRAFY POMOCÍ JAZYKA VBA

Objekt Axis, kolekce Axes ChartTitle Legend PageSetup ChartGroup Část grafu, poznámky Osa grafu. Graf může mít tři různé typy os osu kategorií, osu hodnot a osu řad. Typ osy je vyjádřen jednou z těchto konstant: xlcategory (1), xlvalue (2), xlseriesaxis (3); jen u prostorových grafů, jde o osu Z). V odkazu na osu můžete konstantu použít místo pořadového čísla jako člena kolekce Axes: Axes(xlCategory).HasTitle = True Axes(1).HasTitle = True Titulek grafu. Legenda grafu. Nastavení parametrů stránky pro náhled a tisk. Podrobně byl probrán v prvním dílu knihy. Skupina datových řad ve stejném formátu. Vyskytuje se u kombinovaných grafů, ve kterých jsou různé typy datových řad (sloupce + spojnice, sloupce + plochy). Vzhledem k tomu, že se pořadové číslo skupiny v kolekci ChartGroups může při změně formátu také změnit, je lepší používat pro přístup ke konkrétní skupině datových řad jednu z následujících metod: AreaGroups, BarGroups, ColumnGroups, DoughnutGroups, LineGroups nebo PieGroups. Na uvedené objekty se odkazujete pomocí jejich kolekce nebo stejnojmennými vlastnostmi objektu třídy Chart. 2.2 Základní postupy při práci s grafy Vytvoření nového grafu pomocí kódu VBA Při vytváření grafu pomocí VBA musíte určit oblast zdrojových dat. U všech ostatních vlastností umí Excel dosadit jejich výchozí hodnoty. Při vytváření grafu však v praxi obvykle také určujete jeho typ, název a případně i umístění. Základní kostra kódu tedy může vypadat takto: Sub NovyGraf() Application.ScreenUpdating = False ' přidáme nový graf (na samostatném listu typu graf) Charts.Add With ActiveChart ' určíme zdrojovou oblast a název grafu.setsourcedata Worksheets("Přehled").Range("A1:F2"), xlbyrows.name = "Výsledky za rok 2004" End With Application.ScreenUpdating = True PRÁCE S GRAFY POMOCÍ JAZYKA VBA 37

Oblast dat pro graf určujeme metodou SetSourceData. Její první parametr udává vlastní oblast, druhý (volitelný) parametr pak to, zda jsou datové řady orientovány po sloupcích (xlbycolumns) či řádcích (xlbyrows). Vlastnost Name určuje název grafu, u grafu na samostatném listu je to název tohoto listu. Procedura NovyGraf vytváří graf na samostatném listu. Metodu Add však můžete spustit i na kolekci ChartObjects určitého listu a vytvořit tak vložený graf. V tomto případě se ale postup trochu liší: Sub NovyGraf() Application.ScreenUpdating = False ' přidáme nový vložený graf ActiveSheet.ChartObjects.Add 100, 100, 350, 250 With ActiveSheet.ChartObjects(1).Chart ' určíme zdrojovou oblast a název grafu.setsourcedata Worksheets("Přehled").Range("A1:F2"), xlbyrows End With ActiveSheet.ChartObjects(1).Name = "Výsledky za rok 2004" Application.ScreenUpdating = True Metoda Add kolekce ChartObjects má čtyři parametry určující pozici levého horního rohu grafu a jeho šířku a výšku. Všechny parametry jsou povinné. Další odchylka od první procedury NovyGraf je u přiřazení názvu grafu. Vlastnost Name má sice kontejner ChartObject i v něm vnořený objekt třídy Chart, ale měnit ji můžete pouze u kontejneru. Umístění grafu Metoda Location umožňuje změnit výchozí umístění nového grafu (samostatný list). Vložený graf lze převést na samostatný list a naopak. První ukázka převádí graf vložený na listu Přehled do samostatného listu "GrafPřehledu": Worksheets("Přehled").ChartObjects(1).Chart.Location _ xllocationasnewsheet, "GrafPřehledu" Další příklad provádí opačný převod grafu ze samostatného listu do vloženého grafu na listu Přehled: Charts("GrafPřehledu").Location xllocationasobject, "Přehled" Druhý parametr je povinný jen při převodu grafu ze samostatného listu do vloženého grafu. Metoda Location graf nejenom převede, ale také aktivuje. Aktivace grafu Graf se dá, podobně jako jiné objekty Excelu, aktivovat metodou Activate, případně ho můžete metodou Select vybrat. Jakmile je graf aktivován, můžete se na něj v kódu odkazovat pomocí ActiveChart. Jak jsme si již zdůrazňovali v prvním dílu knihy, pro drtivou většinu operací s objekty není nutné je předem vybírat ani aktivovat, můžete přímo měnit jejich vlastnosti nebo volat jejich metody. 38 PRÁCE S GRAFY POMOCÍ JAZYKA VBA

' aktivace grafu, není nutná Charts("Graf1").Activate ActiveChart.Legend.Font.Bold = True ' následující zápis provede to samé v jednom řádku Charts("Graf1").Legend.Font.Bold = True Samozřejmě, napíšete-li proceduru, ve které neměníte vlastnosti přesně daného, ale právě aktivního grafu, je nutné, aby byl nějaký graf aktivní, jinak dojde k chybě za běhu programu. Jak si můžete zkontrolovat, zda je právě aktivní nějaký graf? Použijte např. následující funkci: Function JeAktivniGraf() As Boolean JeAktivniGraf = False On Error Resume Next x = ActiveChart.Name If Err = 0 Then JeAktivniGraf = True End If End Function Funkce využívá postup, na který jsme narazili již v prvním dílu knihy, v části věnované chybám vzniklým za běhu programu. Pokus o přiřazení názvu aktivního grafu do proměnné selže, neexistuje-li aktivní graf. Tuto chybu můžeme zachytit a testem objektu Err zjistit, jak přiřazení dopadlo. V kódu funkce samozřejmě nemusíte používat vlastnost Name, může to být libovolná vlastnost grafu. K této funkci ještě jednu poznámku. Datový typ proměnné se dá ověřit také pomocí funkce TypeName, proto se nabízí ještě jedno řešení, jak zjistit, zda je právě vybrán graf: If TypeName(Selection) = "Chart" Then Tento zápis ale nelze použít u vložených grafů, protože u nich Selection nepředstavuje celý graf, ale vždy jen jednu jeho část, tedy např. ChartTitle nebo ChartArea. Odstranění grafu Stejně jako u jiných tříd objektů, patřících do nějaké kolekce, se také grafy dají odstranit metodou Delete. Její použití se však liší podle toho, o jaký typ grafu se jedná: Application.DisplayAlerts = False ' odstranění grafu na samostatném listu Charts("Graf8").Delete ' odstranění vloženého grafu ActiveSheet.ChartObjects(1).Delete Application.DisplayAlerts = True Metodou Delete můžete odstranit i celou kolekci grafů: ' odstranění všech grafů vložených na aktivním listu ActiveSheet.ChartObjects.Delete ' odstranění všech grafů na samostatných listech ActiveWorkbook.Charts.Delete Ve všech případech nezapomeňte před voláním metody Delete nastavit vlastnost DisplayAlerts objektu Application na False, aby Excel nezobrazoval varování. Po odstranění grafu či celé kolekce zase tuto vlastnost zapněte. PRÁCE S GRAFY POMOCÍ JAZYKA VBA 39

Rychlá změna vlastností grafu pomocí metody ChartWizard Pro změnu některých vlastností grafu můžete použít metodu ChartWizard. Její název by mohl naznačovat, že při jejím volání dojde k zobrazení Průvodce grafem, ale není tomu tak. Syntaxe metody je velmi jednoduchá: výraz.chartwizard(source, Gallery, Format, PlotBy, CategoryLabels, _ SeriesLabels, HasLegend, Title, CategoryTitle, ValueTitle, _ ExtraTitle) Touto metodou tedy můžete změnit zdrojovou oblast (Source), typ grafu (Gallery), číslo vestavěného autoformátu pro daný typ (Format), orientaci datových řad (PlotBy), počet řádků či sloupců obsahujících popisky osy kategorií (CategoryLabels), počet řádků či sloupců obsahujících popisky osy hodnot (SeriesLabels), můžete zobrazit či skrýt legendu (HasLegend; hodnoty True/False), změnit titulek grafu (Title), popisek osy kategorií (CategoryTitle), osy hodnot (ValueTitle), případně osy Z u prostorových grafů nebo druhé osy Y u plochých grafů (ExtraTitle). Všechny parametry jsou nepovinné a pojmenované, můžete je tedy zadávat v libovolném pořadí. Podrobný popis včetně přípustných konstant pro parametr Gallery najdete v nápovědě k této metodě. Jednoduchá ukázka použití metody ChartWizard mění typ grafu, vypíná zobrazení legendy a nastavuje popisky os X a Y:?Charts("Chart1").ChartWizard Gallery:=xl3DBar, _ HasLegend:=False, CategoryTitle:="Rok", ValueTitle:="Výnosy" Poloha vloženého grafu Poloha a velikost vloženého grafu jsou dány vlastnostmi Top, Left, Height a Width jeho kontejneru ChartObject. Často je třeba změnit polohu či velikost grafu tak, aby přesně lícoval s hranami buněk. Protože buňka (objekt Range) má také vlastnosti Top a Left, nepředstavuje změna polohy grafu žádný problém. Další ukázka přesune graf Tržby tak, aby jeho levý horní roh překrýval buňku B25: Dim achart As ChartObject Set achart = ActiveSheet.ChartObjects("Tržby") achart.top = Range("B25").Top achart.left = Range("B25").Left Pro změnu polohy, případně velikosti grafu, si můžete napsat i obecnou proceduru: Sub PremistiGraf(graf as ChartObject, levyhorniroh as Range, _ pravydolniroh As Range) lngleft = levyhorniroh.left lngtop = levyhorniroh.top lngheight = pravydolniroh.offset(1,1).top - levyhorniroh.top lngwidth = pravydolniroh.offset(1,1).left - levyhorniroh.left With graf.left = lngleft.top = lngtop.height = lngheight.width = lngwidth End With Parametr pravydolniroh je buňka překrytá pravým dolním rohem grafu. 40 PRÁCE S GRAFY POMOCÍ JAZYKA VBA

Názvy a popisky jednotlivých částí Když vytvoříte graf, přiřadí mu Excel výchozí název. U grafů na samostatných listech je názvem grafu název samotného listu, u vložených grafů má výchozí název tvar Graf X, kde X je pořadové číslo, které Excel automaticky inkrementuje, podle toho, kolik grafů vložíte. Názvy můžete měnit (kromě vloženého grafu, jak bylo uvedeno v části Vytvoření nového grafu pomocí VBA ), a to jak manuálně, tak pomocí kódu. Jak zjistíte název vloženého grafu? Stačí stisknout klávesu SHIFT, klepnout na graf myší a pustit SHIFT. Název grafu se objeví v poli názvů (pole na levém okraji řádku vzorců), kde ho také můžete změnit. Pozor na to, že před klepnutím na graf musí být vybrána buňka; bude-li vybrán graf, po klepnutí na jiný graf se název nezobrazí. V kódu je zjištění názvů vložených grafů jednoduché, následující ukázka vypisuje názvy do okna Immediate: For Each graf In ActiveSheet.ChartObjects Debug.Print graf.name Next U grafů na samostatném listu změníte název jednoduše přejmenujete daný list. Na co je třeba ještě u názvů dávat pozor? Vložené grafy jsou obsaženy nejen v kolekci ChartObjects, ale také v kolekci Shapes, není tedy možné pojmenovat graf stejně jako třeba jiný automatický tvar. V kódu jsou názvy objektů reprezentovány vlastností Name, jejich popisky vlastností Caption. Názvy jednotlivých datových řad zadáte přímo: ActiveChart.SeriesCollection(1).Name = "Pobočky" Titulek grafu je rovněž jednoduchý: ActiveChart.HasTitle = True ActiveChart.ChartTitle.Text = "Název grafu" A konečně jednotlivé osy mohou mít také svůj popisek, pokud ho mají povolen: ' nastavení popisku pro osu X ActiveChart.Axes(xlCategory).HasTitle = True ActiveChart.Axes(xlCategory).AxisTitle.Caption = "Měsíce" ' nastavení popisku pro osu Y ActiveChart.Axes(xlValue).HasTitle = True ActiveChart.Axes(xlValue).AxisTitle.Caption = "Výkon v procentech" Kromě vlastnosti Caption se u těch objektů, které obsahují text, setkáte ještě s kolekcí Characters, která představuje všechny znaky v daném objektu. Pomocí této kolekce je možné nastavovat atributy jednotlivých znaků, na které se můžete odkázat následujícím způsobem: Characters(start, délka) Např. velikost prvních dvou znaků titulku grafu můžete změnit tímto řádkem kódu: ActiveSheet.ChartObjects(1).Chart.ChartTitle.Characters(1, 2). _ Font.Size = 18 PRÁCE S GRAFY POMOCÍ JAZYKA VBA 41

Objekt Font umožňující měnit vlastnosti písma není dostupný jen pomocí kolekce Characters, ale i přímo pro celý objekt grafu, takže změna velikosti písma celého titulku grafu vypadá takto: ActiveSheet.ChartObjects(1).Chart.ChartTitle.Font.Size = 18 2.3 Práce s datovými řadami Každá datová řada je v grafu vyjádřena objektem třídy Series, patřící do kolekce SeriesCollection. Jednotlivé body datové řady jsou vyjádřeny objektem třídy Point, všechny body jedné řady jsou obsaženy v kolekci Points. Díky objektovému modelu je tedy možné přistupovat k celé řadě nebo k jednotlivým bodům a pracovat s nimi. Kolekce SeriesCollection Obsahuje všechny datové řady a umožňuje jejich přidávání, odstranění nebo úpravu. V této části si ukážeme základní postupy, při kterých tento objekt využijete. Přidání nové datové řady do grafu Existující graf můžete rozšířit o další datovou řadu pomocí metody Add: výraz.add(source, Rowcol, SeriesLabels, CategoryLabels, Replace) Parametr výraz Source Rowcol SeriesLabels Význam Povinný výraz, vracející objekt třídy SeriesCollection. (Povinný) Data nové řady, zadaná jako objekt Range. Nápověda k této metodě sice udává i možnost zadání jako pole datových bodů, to však není pravda (dá se to obejít malým trikem, kdy po přidání nové řady z objektu Range nastavíte x-ové a y-ové hodnoty z pole). (Volitelný) Orientace datových řad. Možné hodnoty jsou xlrows (řádky) nebo xlcolumns (sloupce; výchozí hodnota). (Volitelný) Možné hodnoty True/False. Jestliže první řádek či sloupec oblasti obsahuje název datové řady, nastavte tento parametr na True. Hodnota False znamená, že v prvním řádku či sloupci je první datový bod řady. CategoryLabels (Volitelný) Možné hodnoty True/False. Jestliže první řádek či sloupec oblasti obsahuje popisek pro osu kategorie, nastavte tento parametr na True. Hodnota False znamená, že v prvním řádku či sloupci je první datový bod řady. Replace (Volitelný) Jsou-li parametry Replace a CategoryLabels nastaveny na True, budou aktuální názvy kategorií na ose X nahrazeny kategoriemi v nově přidávané oblasti. Výchozí hodnotou je False. 42 PRÁCE S GRAFY POMOCÍ JAZYKA VBA

Povinný je pouze první parametr, takže přidání nové datové řady vypadá takto: ActiveChart.SeriesCollection.Add Source:=Worksheets("Sheet1").Range("B1:B10") Jestliže chcete ponechat data v grafu beze změny, ale potřebujete jen zaměnit názvy v ose kategorií (osa X), použijte následující kód: ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Add _ Source:=Range("b6:d6"), CategoryLabels:=True, Replace:=True, _ Rowcol:=xlByRows, serieslabels:=false V tomto případě obsah oblasti B6:D6 zamění původní názvy na ose X. Jestliže nemáte nové názvy kategorií uloženy v buňkách, ale vytváříte je jako textové proměnné, použijte následující kód: ActiveSheet.ChartObjects(1).Chart.Axes(xlCategory).CategoryNames = _ Array("1985", "1986", "1987", "1988", "1989") Dalším prostředkem pro přidání nové datové řady do grafu je metoda NewSeries, která vytvoří novou, ale prázdnou datovou řadu, jejíž další vlastnosti nastavujete dodatečně. Následující ukázka přidá novou datovou řadu do grafu s jednou datovou řadou, zobrazujícího údaje z oblasti A1:B11 (v buňkách A2:A11 jsou názvy kategorií). Po vytvoření nové datové řady kód nastaví hodnoty pro osu kategorií (XValues), určí datové body (Values) a název datové řady: Dim rada As Series Set rada = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.NewSeries rada.xvalues = Range("a2:a11") rada.values = Range("C2:c11") rada.name = Range("c1") Obrázek 2.4 Graf a zdrojová oblast buněk po spuštění kódu z poslední ukázky. Rozšíření zdrojové oblasti pro existující datové řady Dojde-li ke změně velikosti zdrojové oblasti, můžete nové údaje do grafu zařadit pomocí metody Extend: výraz.extend(source, Rowcol, CategoryLabels) PRÁCE S GRAFY POMOCÍ JAZYKA VBA 43

Výraz Source Rowcol CategoryLabels Povinný výraz, vracející objekt třídy SeriesCollection. (Povinný) Nová data, zadaná jako objekt Range. Nápověda k této metodě sice udává i možnost zadání jako pole datových bodů, to však není pravda (viz metodu Add). (Volitelný) Určuje, zda jsou nové hodnoty uspořádány v řádcích nebo sloupcích zadané oblasti buněk. Možné hodnoty jsou xlrows nebo xlcolumns (výchozí). (Volitelný) Možné hodnoty True/False. Jestliže první řádek či sloupec oblasti obsahuje popisek pro osu kategorie, nastavte tento parametr na True. Hodnota False znamená, že v prvním řádku či sloupci je první datový bod řady. Jestliže tedy graf na samostatném listu Přehled zobrazuje data z oblasti A1:C7 na listu List1, přičemž datové řady jsou orientovány ve sloupcích, můžete graf rozšířit o údaje přidané do buněk A8:C11 takto: Charts("Přehled").SeriesCollection.Extend _ Source:=Worksheets("List1").Range("A8:C11"), Rowcol:=xlByColumns Obrázek 2.5 Původní zdrojová oblast a původní graf. Obrázek 2.6 Rozšířená oblast dat a graf po spuštění kódu poslední ukázky. Metodu Extend nelze použít u kontingenčních grafů. 44 PRÁCE S GRAFY POMOCÍ JAZYKA VBA