Programování aplikací v Excelu Aplikační software na PC EXCEL VBA RNDr. Jan Preclík preclik@ksvi.mff.cuni.cz Objektem v Excelu se rozumí cokoli, co může být programováno nebo řízeno Excel obsahuje přibližně 130 objektů se kterými můžeme pracovat Každý objekt má své vlastnosti (~proměnné) a metody (~procedury, funkce) Pomocí VBA nastavujeme tyto vlastnosti a voláme metody těchto objektů za účelem jejich řízení Vlastnosti objektů Vlastnosti objektů Přístup k vlastnostem objektu tečková notace <objekt>.<jméno vlastnosti> Některé objekty mají předdefinované (default) vlastnosti (ty není třeba explicitně vypisovat) Application.WorkBooks("Makra.xls"). _ WorkSheets("List1").Range("A1").Value = 10 Vlastnosti je možné buď nastavovat nebo naopak zjišťovat jejich hodnoty Existují vlastnosti, které jsou určeny buď jen pro čtení nebo jen pro zápis nebo Range("A1").Value = 10 Range("A1") = 10 Metody objektů VBA objekty -2- -3- -4- -5- -6- Volání metod objektu tečková notace <objekt>.<jméno metody> Selection.Copy Range("A1").Copy Range("B1") Metody mohou mít různý počet povinných i nepovinných parametrů (viz. nápověda pro VBA) Pro přiřazení hodnoty proměnné typu objekt je nutno použít klíčové slovo Set hodnota Nothing nenastavená objektová proměnná Pro uvolňování paměti; objekt je uvolněn, pokud všechny na něj ukazující proměnné mají hodnotu Nothing Rovnost odkazů na objekty Is Dim Oblast As Range Set Oblast = Range("A1:B3") If Oblast Is Nothing Then End If 1
Kolekce objektů Kolekce objektů Kolekce = soubor objektů stejného typu Název kolekce je shodný s názvem objektu + s Přístup k prvkům kolekce Indexem (indexováno od 1) Worksheets(2).Name = "Druhý list" Jménem Worksheets("List2").Name = "Druhý list" Pomocí metody Item Worksheets.Item(2).Name = "Druhý list" Metoda Count počet prvků kolekce nelze nastavit hodnotu, jen číst Metoda AddItem přidá položku do kolekce -7- -8- -9- - 10 - Kolekce a cyklus For Each Cyklus přes všechny prvky kolekce Dim List As Worksheet For Each List In Worksheets List.Name = List.Name & List.Name Next List 'řešení ne ve stylu VBA (ala Pascal) Dim I As Integer For I = 1 To Worksheets.Count Worksheets.Item(I).Name = _ Worksheets.Item(I).Name & _ Worksheets.Item(I).Name Next I Spouštění makra Automaticky Při otevření sešitu (AUTO_OPEN) Při uzavření sešitu (AUTO_CLOSE) Klávesová zkratka (Nástroje / Makro / Makra / Možnosti) Seznam dostupných maker (Nástroje / Makro / Makra / Spustit) Vlastní položka menu přetáhnout do menu (Zobrazit / Panely nástrojů /Vlastní/Příkazy / Makra) Vytvoření nové nabídky/podnabídky v menu (Zobrazit / Panely nástrojů /Vlastní/Příkazy / Nová nabídka) - 11 - - 12 - Spouštění makra Vlastní tlačítko přetáhnout na lištu (Zobrazit / Panely nástrojů /Vlastní/Příkazy / Makra) Vytvoření nového panelu nástrojů (Zobrazit / Panely nástrojů / Vlastní / Panely nástrojů / Nový) Kliknutím na libovolný grafický objekt (místní nabídka objektu / Přiřadit makro) Ladění makra Editor jazyka Visual Basic, panel nástrojů Ladění (Debug) Spustit (Run Sub/Userform) Stop (Reset) Přepnout zarážku (Toggle breakpoint) Rychlé kukátko (Quick Watch) Pro proměnnou na které je kurzor Lze přidat do Watch 2
Ladění makra - 13 - Ladění makra - 14 - Okno kukátek (Watches) Možno modifikovat hodnotu i při běhu Krokovat s vnořením (Step Into) Při krokování sestupuje do podprogramů Krokovat bez vnoření (Step Over) Nekrokuje podprogramy Krok ven (Step Out) Provedení všech příkazů až do konce podprogramu a jeho opuštění Okamžité okno (Immediate Window) Příkaz na řádku se provede po stisku klávesy Enter Pro ladění apod. Zásobník volání právě aktivních procedur (Call Stack) Hierarchie objektů v Excelu Objekt Application Reprezentuje celou aplikaci Excelu ActiveWindow aktuálníokno ActiveWorkbook aktuální sešit Caption nadpis Cursor ukazatel myši CutCopyMode FALSE = zrušení mihotajícího se rámečku při kopírování Dialogs kolekce dialogových oken DisplayAlerts potlačí zobrazení některých hlášení DisplayFormulaBar skrytířádku vzorců DisplayStatusBar skrytístavového řádku - 16 - Objekt Application - 17 - Objekt Application - 18 - OperatingSystem název a verze oper. systému StandardFont StandardFontSize StatusBar vrací nebo nastavuje text na stavové řádce, FALSE = vrací řízení Excelu ThisWorkbook sešit ve kterém je zapsán právě prováděný příkaz makra Windows kolekce všech otevřených dceřiných oken v aplikaci WindowState stav okna (xlmaximized, xlminimized, xlnormal) Workbooks kolekce otevřených sešitů Calculate přepočítání vzorců ve všech sešitech FindFile spustí akci otevírání souboru včetně dialogového okna Quit ukončení aplikace Excel Run umožňuje spustit makro z jiného excelovského sešitu Wait přeruší makro do času uvedeného jako parametr 3
Objekt Workbook - 19 - Objekt Workbook Reprezentuje právě otevřený sešit ActiveSheet aktuální list FullName jméno souboru včetně cesty Name jméno sešitu Names kolekce pojmenovaných oblastí buněk Path cesta, kde je soubor uložen (bez posledního oddělovače) Saved True, je-li soubor uložen Sheets kolekce listů v sešitě, obsahuje objekty typu Chart a Worksheet Worksheets kolekce tabulkových listů, objektů typu Worksheet Activate aktivuje daný sešit Close uzavírá sešit Protect uzamčení sešitu, lze zadat heslo jako parametr Save uloží sešit na disk SaveAs UnProtect odemkne daný sešit Objekt Worksheet -21 - Objekt Worksheet Reprezentuje jeden list sešitu Cells kolekce všech buněk sešitu ActiveSheet.Cells(2,3) '= buňka C2 (řád., sloup.) ActiveSheet.Cells(2) '= druhý řádek Columns kolekce sloupců Name vrací nebo nastavuje jméno listu Names kolekce pojmenovaných oblastí buněk Range parametr vymezuje požadovanou oblast Rows kolekce řádků UsedRange vrací objekt typu Range reprezentující využitou oblast listu Visible skrytí listu Activate aktivuje daný list Calculate přepočítává všechny buňky v listě Copy kopíruje list před nebo za uvedený list v sešitě Delete odstraní zadaný list ze sešitu Paste vloží obsah schránky na parametrem určené (nebo aktuální) místo v sešitě, nelze použít na vkládání objektů z jiných aplikací PasteSpecial vloží obsah schránky, možno určit další podmínky vložení PivotTables kolekce kontingenčních tabulek Objekt Worksheet Objekt Window -20- -22- -23- -24- Protect uzamkne list Unprotect odemkne daný list Reprezentuje okno v Excelu Caption nastavuje nebo vrací jméno okna DisplayFormulas zobrazuje vzorce v buňkách DisplayGridlines nastavuje zobrazení mřížky DisplayHeadings nastavuje, zda bude zobrazeno záhlaví řádků DisplayWorkbookTabs v sešitě se zobrazí záložky listů ScrollColumn nastaví nebo zjistí sloupec, který je zobrazen u levého okraje okna dokumentu ScrollRow stejné jako u sloupce 4
Objekt Window Objekt Window Height vrací nebo nastavuje výšku okna v bodech Left nastavuje nebo vrací polohu okna od levého okraje využitelné oblasti Width, Top WindowState mění stav okna Zoom nastavuje nebo vrací zvětšení okna v procentech Activate aktivuje okno Close uzavře okno LargeScroll posunuje okno po stránkách SmallScroll posunuje obsah okna po jednotlivých řádcích nebo sloupcích Reprezentuje buňku nebo výběr buněk tabulky Dva zápisy syntaxe jeden parametr zápis celé oblasti: Range("A1:B3") dva parametry rohové buňky vymezují oblast: Range("A1","B3") Operátor průniku mezera průnik oblastí A1:C3 a B2:D5, tj. oblast B2:C3 Range("A1:C3 B2:D5") Sjednocení více souvislých oblastí UNION (vrací objekt Range) Union(Range("A1:A2"), Range("B2:B3")) Lze použít i lib. pojmenovanou oblast buněk (Vložit / Název / Definovat) Range("Oblast1") -25- -26- -27- -28- -29- -30- Address obsahuje adresu dané oblasti, zapsanou ve tvaru určeném parametrem Borders kolekce orámování buněk Characters kolekce znaků uvnitř buňky, objekt Range musí odpovídat jediné buňce Cells objekt typu Range reprezentující všechny buňky oblasti Column vrací číslo prvního sloupce v první oblasti Column(Range("C2:E4,A2:B5")) ' = 3 Columns kolekce sloupců ColumnWith šířka sloupce CurrentRegion vrací objekt Range aktuální oblasti, to je oblast ohraničená prázdným řádkem a sloupcem nebo okraji tabulky Count počet buněk v oblasti End poslední buňka aktuální oblasti ve směru určeném parametrem, podobně jako klávesová zkratka CTRL+šipka EntireColumn, EntireRow reprezentuje celý řádek, či sloupec ve vybrané oblasti Font objekt určující vlastnosti písma 5
Formula vrací nebo nastavuje vzorec - anglické názvy funkcí FormulaLocal vrací nebo nastavuje vzorec - názvy funkcí dle lokalizace nainstalovaného Excelu a oddělovače nastavené v ovládacím panelu Hidden skrýt/zobrazit buňky, lze použít pouze na celé sloupce a řádky HorizontalAlignment zarovnání textu ve vodorovném směru Interior objekt určující formát výplně buňky Name vrací nebo nastavuje jméno buněk -31 - NumberFormat formát čísla, nutno zadat anglický zápis, nezávislé na lokalizaci instalace Excelu NumberFormatLocal formát čísla, závislé na lokalizaci Offset vrací objekt typu Range posunutý o požadovaný počet řádků a sloupců ActiveCell.Offset(1,0).Value = 7 zapíše hodnotu 7 do buňky ležící hned pod buňkou aktivní pokud se tímto způsobem dostanu na neexistující buňku (mimo oblast listu), dojde k běhové chybě Resize objekt typu Range zmenšený / zvětšený dle parametrů oproti původnímu objektu Row vrací číslo prvního řádku v první oblasti Rows kolekce řádků Value vrací nebo nastavuje hodnotu v buňce nebo v oblasti buněk VerticalAlignment zarovnání textu ve svislém směru Activate aktivuje jednu buňku ve vybrané oblasti AutoFit přizpůsobí šířku sloupce AutoFilter nastaví automatický filtr Calculate přepočítá buňky ve vybrané oblasti Clear, ClearContents, ClearFormat... - vymaže vše, obsah, formáty... Copy kopíruje oblast buněk do schránky Cut kopíruje oblast buněk do schránky nebo na určené místo, na původním místě vymaže obsah Delete zruší buňky a provede posun buněk v okolí Objekt Font -32- -33- -34- -35- -36- Find, FindNext, FindPrevious prohledávání obsahu buněk Insert vloží buňky a provede posun buněk v okolí PasteSpecial vloží obsah schránky na místo dané objektem Select označí oblast buněk Sort setřídí oblast podle zadaných podmínek Reprezentuje font (buněk, oblasti, objektu ) Bold, Italic, Underline... tučné, kurzíva, podtržené... Color barva písma, možno použít funkci RGB nebo konstanty vbred, vbgreen... ColorIndex vrací nebo nastavuje barvu písma z palety barev Name jméno fontu Size vrací nebo nastavuje velikost písma v bodech 6
Objekt Border Objekt Interior Reprezentuje okraj (ohraničení) buněk Color ColorIndex LineStyle styl čáry (plná, čárkovaná...) Weight tloušťka čáry Reprezentuje vnitřek buněk Color barva výplně ColorIndex barva vybíraná z palety InvertIfNegative booleovská, zobrazení v doplňkových barvách Pattern vzorek výplně buňky PatternColor barva vzorku PatternColorIndex číslo barvy vzorku z palety barev Dialogy Dialogy MsgBox (prompt,buttons,title,helpfile, context): stisknuté_tlačítko funkce InputBox (prompt,title,default, xpoz,ypoz,helpfile,context): string If MsgBox("Chcete ukončit práci makra?", _ vbyesno + vbquestion, "Konec") = vbyes Then Exit Sub End If zobrazí dialogové okno se vstupní řádkou a se dvěma tlačítky OK a Storno, pokud uživatel ukončí tlačítkem OK, vrací text zapsaný ve vstupní řádce, jinak vrací prázdný řetězec Dialogy -41 - Uživatelské formuláře -37- -38- -39- -40- -42- metoda Aplications.InputBox (prompt, title,default,left,top,helpfile, helpcontextid,type):variant Jako funkce InputBox ale má více možností 'Načtení oblasti od uživatele (včetně 'možnosti výběru myší) Dim Oblast As Range Set Oblast = Application.InputBox(Prompt:= _ "Zadej adresu zpracovávané oblasti.", _ Type:=8) ~ tvorba vlastních dialogových oken Postup při tvorbě vložíme nový formulář v editoru jazyka VBA volba Insert / UserForm v okně Properties lze měnit vlastnosti formuláře (jméno ) na formulář přidáme ovládací prvky a nastavíme v okně Properties jejich vlastnosti ošetříme události generované ovládacími prvky (tj. napíšeme příslušné procedury) 7
Uživatelské formuláře Uživatelské funkce použitelné na listu Postup při tvorbě (pokračování) napíšeme proceduru, které formulář zobrazí UserForm1.Show na konec formulář uvolníme: UnLoad UserForm1 potom se veškeré nastavení na něm zničí nebo pouze schováme: UserForm1.Hide s nastaveními na formuláři lze i po schování pracovat Funkce, která má být použitelná v buňce na listu, nesmí být deklarovaná jako Private! Funkce nesmí manipulovat s oblastmi, hodnotami buněk na listě! Uživatelské funkce použitelné na listu Uživatelské funkce použitelné na listu -43- -44- -45- -46- Řízení volání funkce = kdy se bude funkce na listu přepočítávat volatile přepočítává se při každé změně na listu nonvolatile přepočítává se pouze pokud se změní buňky na které se odkazuje Function XY (Obl As Range) As Integer Application.Volatile ( False )... End Function Určení kategorie funkce do jaké kategorie bude naše funkce v dialogu Vložit funkci zařazena (standardně kategorie Vlastní) při otevření sešitu je nutno provést kousek VB kódu (vloží se k objektu Workbook, resp. Tento_sešit), který funkci zařadí do příslušné kategorie (0 = vše, 1 = finanční,, 14 = vlastní) Private Sub Workbook_Open() Application.MacroOptions Macro:="Obrat", _ Category:=7 End Sub 8