Makra Původně bylo makro chápáno jako posloupnost příkazů, kterou lze automaticky a opakovaně vykonávat. Sloužilo k automatickému provádění často se opakujících akcí. „Nahráli“ jste posloupnost příkazů, vhodně uložili, a když bylo potřeba provést akci, makro jste spustili. Jak makro vznikne: · nahráním · zápisem v makrojazyce (VisualBasic) · kombinací obou Makro ve VisualBasicu je procedura. Jak nahraji makro: · pořádně si rozmyslet a nacvičit celý postup · spustit nahrávání (Nástroje/ Makro/ Záznam nového makra) · vyplnit údaje o makru (jméno, popis, klávesová zkratka, uložení makra – naše vždy tento sešit) · provedu jednotlivé akce – vše se nahrává · ukončení nahrávání makra (panel) · prohlédnutí si nahraného makra v editoru VB Vyzkoušejte a prohlédněte, co jste nahráli
Orámování oblasti Nahrajte makro, které orámuje vybrané buňky tabulky. · pokud má makro pracovat s vybranou oblastí je potřeba mít oblast vybranou před spuštěním makra · vybraná oblast je v kódu makra označována jako Selection a odkazuje nás na objekt stejného typu jako Range, můžeme tedy pro práci s vybranou oblastí používat stejné vlastnosti jako u objektu Range. Sub Oramuj() ' ' Oramuj Makro ' Makro zaznamenané 15.5.2003, Lucie Pelikánová ' ' Klávesová zkratka: Ctrl+o ' With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThick
.ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub
Asi si již poradíte se zvládáním následujících úkolů, které se týkají vybrané oblasti. Projděte buňky vybrané oblasti a pokud je buňka prázdná dosaďte hodnotu 0. Tuto úlohu zvládnete bez nahrání. Sub Dosad() ' ' Dosad Makro ' Makro zaznamenané 15.5.2003, Lucie Pelikánová ' ' Klávesová zkratka: Ctrl+d Dim o As Range For Each o In Selection If IsEmpty(o) Then o.Value = 0 End If Next o End Sub
Nahrávání maker v relativní adresaci Řada čísel Vytvořte makro, které od zadané pozice (zadává uživatel výběrem buňky) objekt ActiveCell, vytvoří řadu čísel. Jejich počet zadá uživatel pomocí dialogového okna InputBox. Nejprve zkusíme nahrát makro, které by od zadané buňky jen napsalo 5 čísel směrem dolů. Po nahrání si makro prohlédneme a zkusíme několikrát spustit, zjistíme, že takto nahrané makro nepracuje správně, neboť hodnoty píše pořád do stejných buněk, bez ohledu na buňku vybranou. Nechceme aby makro pracovalo s absolutními adresami buněk, potřebovali bychom používat přepnutí do relativních adresy relativní. Nahrávání maker nám umožňuje přepínat do relativní adresace. odkazů Pokud tedy chceme zajistit relativní pohyb vzhledem k ActiveCell (vybraná buňka), musíme se před daným pohybem přepnout do relativních odkazů. Nahrané makro pak vypadá takto: Sub Vypln() ActiveCell.FormulaR1C1 = "1" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "2" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "3"
ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "4" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "5" ActiveCell.Offset(1, 0).Range("A1").Select End Sub
Teď několik vysvětlení k používaným objektům a jejich vlastnostem. ActiveCell – objekt typu Range, představující aktivní buňku FormulaR1C1 – vlastnost objektu typu Range, umožňující zapisovat do buňky hodnoty, vzorce a funkce v adresaci R1C1(R jako radek, C jako sloupec). Pro naši potřebu, bychom asi lépe využívali vlastnost Value. OffSet – vlastnost vrací objekt typu Range posunutý o zadaný počet řádek a sloupců (první parametr jsou řádky, druhý sloupce), kladné hodnoty směrem dolů a doprava, záporné nahoru a doleva. Nahraná makra nejsou nikdy příliš elegantní a nám by spíše měla sloužit jako inspirace nebo seznámení s názvy objektů a jejich použití. Jak makro zjednodušit? · vypustíme volání vlastnosti Range – (náš výběr je jedna buňka, nemá smysl tedy znovu ji specifikovat) · Vlastnost FormulaR1C1, nahradíme vlastností Value · zabalíme do cyklu (For) · místo konkrétní hodnoty použijeme v tomto případě řídicí proměnnou cyklu
Sub Vypln() Dim i As Integer For i = 1 To 5 ActiveCell.Value = i ActiveCell.Offset(1, 0).Select Next i End Sub
Je opravdu nutné aby naše makro realizovalo i fyzický posun po buňkách? Chceme přece jen vyplnit hodnoty. Spojíme tedy oba řádky v těle cyklu do jednoho, adresovat budeme pořád vůči původní aktivní buňce, ale již ji nebudeme vybírat. Sub Vypln() Dim i As Integer For i = 1 To 5 ActiveCell.Offset(i1, 0).Value = i Next i End Sub
Ještě zbývá načtení počtu čísel pomocí InputBoxu: Sub Vypln() Dim i As Integer Dim N As Integer N = InputBox("Zadej počet čísel:", "Rada", 5) For i = 1 To N ActiveCell.Offset(i 1, 0).Value = i Next i End Sub
Další vlastnosti objektu Range Cells – tato vlastnost opět vrací objekt typu Range, používá se na konkrétní specifikaci buněk v dané oblasti. Jak pracuje: Pokud neurčím konkrétní objekt na který vlastnost Cells aplikuji, jedná se o všechny buňky právě aktivního sešitu. Označ Ve sloupci A jsou uloženy zkoumané hodnoty. Tvoří souvislou oblast, jejich konec poznám pomocí prázdné buňky. Chci projít všechny tyto hodnoty, a ty které jsou větší než první hodnota barevně označit. Sub Oznac() Dim i As Integer Dim Hod As Double Hod = Cells(1, 1).Value i = 2 Do While Not (IsEmpty(Cells(i, 1))) If Hod < Cells(i, 1).Value Then With Cells(i, 1).Interior .ColorIndex = 35 .Pattern = xlSolid End With End If i = i + 1 Loop End Sub
Výběr oblasti Jak vyberu oblast. Nejlépe pomocí objektu Range a jeho parametrů, asi nejvýhodnější je použití opět vlastnosti Cells, kdy oblast stanovím pomocí dvou buněk.
Range(Cells(1,1),Cells(8,1) – oblast prvních 8 buněk z prvního sloupce sešitu.
Mohla bych také použít, určení oblasti pomocí adresy bloku, ale toto určování je v makrech velmi neprakticeké: Range(„A1:A8“), uplatnilo by se pokud bych opravdu měla přesně stanovenou oblast dat. Pokud bych se již v makrech chtěla odkazovat na přesně definované oblasti je lepší označit je názvy (pojmenování oblasti buněk). Range(„mojedata“)
Není moc výhodně v programu se dlouze odkazovat na vybranou oblast dat, pokud pomocí vybraných kritérii určím oblast dat je výhodnější pak tuto oblast přiřadit do proměnné typu Range. Dim r As Range Set r = Range(Cells(1,1),Cells(8,1)
a v programu již dále pracovat pomocí proměnné r. Odstranění buněk Vytvořte makro, které odstraní ty řádky tabulky jménem Data, které mají v prvním sloupci datum menší než je aktuální datum. Sub Odtsran() Dim r As Range Dim i As Integer Set r = Range("Data") For i = 1 To r.Rows.Count If r.Cells(i, 1) < Date Then r.Cells(i, 1).EntireRow.Delete End If Next i End Sub
Rows kolekce zahrnující všechny řádky daného objektu typu Range, využila jsem pro určení počtu řádek ve vybrané oblast. Podobně Columns –kolekce sloupců. EntireRow – vlastnost, která vrátí celou objekt reprezentující celou řádku (nebo řádky), které obsahují danou buňku, buňky. Takto bychom ve výčtu vlastností a příkladech mohli pokračovat dále. Neprobrali jsme celou řadu vlastností. Zatím jsme se pořád věnovali jen jednotlivým buňkám listu. V VBA jde samozřejmě pracovat i s celými listy, sešity, soubory. Nám s našim omezeným časem musí stačit tyto ukázky jak v rámci Excelu zacházet s buňkami, jak si vytvářet vlastní funkce a vlastní jednoduchá makra