Lekce 1 - Úvod do VBA pro Excel
V předchozím kurzu VBA jsme se seznámili s celým rozsahem jazyka, který je obecně užíván k řízení aplikací v rámci MS Office. Jazyk je vystavěn z tradičních procedurálních prvků, které dovolují manipulace s daty klasickými postupy programování. Pro práci s aplikacemi Office je jazyk VBA rozšířen o práci s objekty. Obecněji jsme o této části VBA pojednali v kapitole o objektech a kapitole následující základního kurzu. Protože objektový model jednotlivých aplikací MS Office je odlišný, soustředíme v této sérii lekcí pozornost na práci s Excelem, speciálně se zaměřením na objektovou strukturu této aplikace.
Excel má více než dvě stovky objektů. K hlavním objektům ve struktuře aplikace existují desítky a v některých případech i stovky vlastností, metod, událostí a parametrů. Většina uživatelů, pokud nezpracovávají zcela specifický problém, se setká s desítkami vlastností a metod, ale i to je dost, protože mnohé mají variantní formy zápisu, parametry, které dovolují další rozdílné zápisy a použití.
Z tohoto důvodu, než přistoupíme k práci v Excelu pomocí objektů VBA, seznámíme se podrobně se zápisem odkazů na jednotlivé objekty a adresování cílů tak, abychom mohli pracovat s jednotlivou buňkou, nebo jejich zvolenou množinou, tedy oblastí. V této lekci uvedené objekty mají další vlastnosti, metody a události, které budou probrány v kontextu s cílem práce později.
Názvosloví
U příkazů pracujících s objekty užíváme popisu:
- vrací objekt
- ukazuje na objekt
- odkazuje na objekt
V podstatě jde o různé vyjádření téhož výsledku příkazu, používané v různých kontextech. Pokud výsledek příkazu dosazujeme do proměnné, používáme většinou vrací objekt, v jiných případech další dva popisy - ale ve finále jde o shodný příkaz, kde výsledkem je objekt.
Hierarchie objektů v Excelu pro přístup k buňce
- Application
- Workbook
- Worksheet
- Range
Objekt Application
Jde o implicitní objekt na vrcholu hierarchie, vždy se vztahuje k právě otevřené části MS Office, v našem případě k Excelu, a proto se často ve výčtu objektu při volání objektů neuvádí. Je jediný a některé speciální případy použití budou uvedeny později v kontextu jiných řešení.
Objekt Workbook
Druhým objektem v hierarchii Excelu je sešit, tvoří kolekci sešitů Workbooks. Opět jde převážně o objekt implicitní, i když s ním už nemusí být práce úplně jednoznačná, pokud máme otevřeny například dva sešity. Pracujeme sice s jedním, ale můžeme se obracet k hodnotám i druhého otevřeného sešitu, takže postup již nemusí být jednoznačný. V tom případě se musíme na druhý sešit odkazovat přes kolekci Workbooks.
Application.Workbooks("Schema3.xlsm").Worksheets("Pracovni").[K1].Value
Nebo také jiným způsobem přes pořadí indexu v kolekci:
Workbooks(1).Worksheets("Pracovni").[K1].Value
Objekt Worksheet
Dalším níže položeným objektem je list Worksheet. Listy sešitu tvoří kolekci listů Worksheets. Běžný sešit obsahuje více listů a proto v tomto případě je odkaz na konkrétní list v kolekci nezbytný. Odkaz:
- číslem = vlastnost Index, které reprezentuje index v rámci kolekce
- názvem = vlastnost Name, ten je názvem listu, který vidíme v běžné aplikaci Excel, je uvedeno v předchozích příkladech
Pokud v hierarchii u nižších objektů list nespecifikujeme, implicitně se pracuje s aktivním listem. V případě, že takový není, je hlášena chyba.
Při práci se složitějším sešitem může být výhodné indexy a názvy listů získat, například si je uložit do pole, nebo jako výpis:
Public Sub subIdentListu() 'vypíše indexy a názvy listů do okna Immediate Dim vW As Worksheet 'cyklus přes každého člena kolekce Wokrsheets For Each vW In Worksheets Debug.Print vW.Index, vW.Name Next vW End Sub
Dalšími možnostmi, jak se odkazujeme na konkrétní list, se kterým chceme pracovat, jsou vlastnosti:
- ActiveSheet je vlastnost, vracející objekt Worksheet, který je právě aktivní. Je to jeden z mála případů, kde se obracíme ke konkrétnímu listu bez odkazu na kolekci. Pokud v sešitu není aktivní list, vrací se objektová hodnota Nothing.
- Next je vlastnost, vracející objekt Worksheet následující v kolekci za listem, na který právě odkazuje zapsaný objekt Worksheet. Pokud ukazuje na neexistující další list, je hlášena chyba.
Příklady použití:
Debug.Print ActiveSheet.Name Debug.Print ActiveSheet.Index MsgBox Sheets("List1").Next.[K1].Value
Metoda Add
kolekce Worksheets vytvoří nový
list. Pokud ji použijeme bez parametrů, přidá list před list aktivní, tím
nový list získá index listu právě aktivního.
i = ActiveWorkbook.ActiveSheet.Index 'index aktivního listu v kolekci ActiveWorkbook.Worksheets.Add 'přidá další list s indexem aktivního „Before=Před“ ActiveWorkbook.Worksheets(i).Name = "Novy" 'přejmenujeme přidaný list
Další vlastnosti a metody objektu Worksheet budou probrány v kontextu učiva, současně s jinými podobnými případy.
Objekt Range
Objekt Range je oblastí buněk na listu Excelu. Vymezuje jednu buňku nebo blok buněk na listu, může ale ukazovat i na několik různých souvislých oblastí buněk. O objektu Range pojednává také kurz o makrech v MS Office .
POZOR! Range je nejenom objekt, ale také vlastnost objektů Application, Worksheet a Range, která vrací objekt Range. Tuto nejednotnost je nutno pochopit pro ty uživatele, kteří chtějí ve VBA napsat více než jednu nebo dvě krátké procedury.
Obecný popis vlastnosti Range
Objekt.Range(Začátek, Konec)
- Objekt může být Application, Worksheet nebo Range. Pokud není objekt uveden, je implicitně dosazen objekt ActiveSheet představující aktivní list.
- Začátek je proměnná typu
Variant
a je povinná. Může to být objekt Range nebo textově vA1
notaci zapsané ohraničení objektu. Nejčastěji je uváděno ve tvaru, jak jej známe z Excelu, v textové formě. Může obsahovat kvalifikátory dvojtečka = rozsah, mezera = průnik a čárka = sjednocení. Může obsahovat znaky$
, které jsou ignorovány. - Konec je proměnná typu
Variant
a je nepovinná. Může to být objekt Range nebo textově vA1
notaci zapsaná konečná buňka v oblasti.
'příklad použití vlastnosti Range, která vrací objekt Range Dim vRng as Excel.Range Set vRng = Sheets("List1").Range("A1:F6") vRng.Range("C1:D5").Select
Rozlišme:
Jeden parametr s kvalifikátorem sjednocení vymezí dvě nesouvislé oblasti
Range("A2, B6").Select
Dva parametry oddělené čárkou, které vymezují souvislou oblast
Range("A2", "B6").Select
totéž zapíšeme klasicky s jedním parametrem pomocí rozsahu
Range("A2:B6").Select
Range, ale i Cells, Row, Column, Offset, Union a Intersect jsou vlastnosti, které náležejí různým objektům, ale ve výsledku vracejí objekt Range. Nejsou to jediné vlastnosti vracející objekt Range, ale ty nejčastěji používané.
Objekt list - Worksheet má hlavní vlastnosti, které vracejí objekt Range:
- Range
- Cells
- Rows
- Columns
Objekt oblast - Range má hlavní vlastnosti, které vracejí objekt Range:
- Range
- Cells
- Rows
- Columns
- Offset
Objekt aplikace Application má metody, které vracejí objekt Range, nejčastější:
- Union, která spojuje více objektů Range a vrací opět objekt Range. Odpovídající si zápisy:
Union(Range("A10"), Range("A12")).Select 'vybere dvě buňky A10 a A12 Range("A10, A12").Select 'vybere dvě buňky A10 a A12
- Intersect, která vrací průnik dvou, nebo více v parametrech zapsaných objektů Range. Odpovídající si zápisy:
Intersect(Range("A1:A9"), Range("A9:A10")).Select 'vybere buňku A9 Range("A1:A9 A9:A10").Select 'vybere buňku A9
To je v dnešní lekci vše.
V příští lekci, Objekt Range ve VBA, probereme seznam vlastností a metod Range a pokročíme v adresování buněk.