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 1 2 3
Jak na č ítat a ukládat data.........................................156
Č innosti p ř i otev ř ení formulá ř e....................................157 5 6
Programování v Excelu 2000, 2002, 2003
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í pom ocí VBA.................................................166
7.2 Panely nabídek a panely nástroj ů –možnosti manipulace s nimi........................................170
Kolekce CommandBars, objekty Comma ndBar ...............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
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 7 8 9
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ém em Windows.....................................219 API pro práci se sítí..................................................221
Další vhodné ukázky..................................................222
Kde hledat dále?......................................................223
Ú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“.
Vložit → Rám 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 .
KLÁVESA Názvy kláves a klávesových zkratek ozna č ujeme K APITÁLKAMI – nap ř . E NTER nebo A LT +S.
Program 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 ř í j emností. 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.
Události v Excelu
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ýskyt u 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
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.
Programování v Excelu 2000, 2002, 2003
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()
End Sub
Veškerý kód zapsaný mezi tyto dva ř ádky bude proveden p ř i každém vyvolání dané události.
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)
End Sub
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
End Sub
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
End Sub
Excelu 2000, 2002, 2003
Programování
Programování v Excelu 2000, 2002, 2003
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)
End Sub
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 End Sub
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:
' 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 End Sub
Private Sub Workbook_Open()
lPotlaceni = True End Sub
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
BeforeClose
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 WindowActivate).
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.
Probíhá p ř ed uzav ř ením sešitu (= byl vydán p ř íkaz k uzav ř ení sešitu).
Programování v Excelu 2000, 2002, 2003
Událost
BeforePrint
BeforeSave
BeforeXmlExport
BeforeXmlImport
Deactivate
NewSheet
Open
PivotTableCloseConnection
PivotTableOpenConnection
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.
SheetActivate 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 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.
SheetCalculate P ř i p ř epo č ítání obsahu libovolného listu.
SheetChange Obsah libovolného sešitu je m ě n ě n uživatelem nebo aktualizací vn ě jšího propojení.
SheetDeactivate
P ř i deaktivaci libovolného listu v sešitu.
SheetFollowHyperlink Při klepnutí myší na libovolný hypertextový odkaz v libovolném listu.
SheetPivotTableUpdate Po aktualizaci listu s kontingen č ní tabulkou.
SheetSelectionChange Změna výběru na libovolném listu, s výjimkou listů typu graf.
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 S HIFT , není událostní procedura Workbook_Open spušt ě na (jde o jednu z možností, jak se bráni t 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
Worksheets(varMesice(Month(Date))).Activate End Sub
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.
Programování v Excelu 2000, 2002, 2003
Programování v Excelu 2000, 2002, 2003
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 End Sub
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 End Sub
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 ).
' 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 End Sub
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 End Sub
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"
End Sub
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.