Při přidání nového členu do kolekce Workbooks je výhodné využít objektovou proměnnou, která bude nový sešit reprezentovat. Při založení nového sešitu to provede kód Dim novy_sesit As Workbook Set novy_sesit = Workbooks.Add
a při otevření sešitu (parametr metody je v tomto případě nutné zapsat do závorek) pak kód: Dim novy_sesit As Workbook Set novy_sesit = Workbooks.Open(ActiveWorkbook.Path + "\Přehled.xlsx")
Při otevírání sešitu a jeho ukládání pod jiným názvem je také možné využít objekt Application, který umožňuje zobrazit dialogová okna pro otvírání a ukládání souboru (viz dále). V sešitu Listy_sesity.xlsm vytvořte makro, které založí nový sešit, první list v tomto sešitu přejmenuje na Data a uloží jej pod názvem Souhrn.xlsx do stejného umístění, jako je soubor s makrem. Při spuštění makra je otevřen pouze soubor s makrem. V sešitu Listy_sesity.xlsm je toto makro vytvořeno pod názvem Novy_sesit. Tabulka 7.2 Vlastnosti a metody sešitů Vlastnost Count (u kolekce) Name Path FullName Saved Metoda Activate Protect Unprotect Save SaveAs SaveCopyAs Close RefreshAll SendMail Add (u kolekce) Open (u kolekce)
7.3
Význam počet otevřených sešitů jméno sešitu umístění sešitu název sešitu s úplnou cestou test na uložení sešitu Význam aktivace sešitu zamknutí sešitu odemknutí sešitu uložení sešitu uložení sešitu pod jménem vytvoření kopie sešitu zavření sešitu aktualizace všech propojení odeslání sešitu e-mailem vytvoření nového sešitu otevření sešitu
Hodnota číslo text text text True/False Parametr heslo heslo název nového sešitu s cestou název nového sešitu s cestou uložení adresa, předmět, potvrzení název sešitu s cestou
Aplikace Excelu
Spuštěný Excel reprezentuje objekt Application. V předchozím textu jste se již setkali s vlastností CutCopyMode, která určuje stav schránky (dosazením hodnoty False do vlastnosti se schránka vymaže). Kromě práce se schránkou se objekt Application nejčastěji využívá pro přístup ke standardním funkcím Excelu a k zobrazení dialogových oken pro práci se soubory.
7.3.1
Použití standardních funkcí Excelu
Ve Visual Basicu je k dispozici řada standardních funkcí, jejichž výběr se však od standardních funkcí Excelu liší. Značná část standardních funkcí Excelu není do jazyka Visual Basic zařazena, 98 Programování v Excelu 2019
Ukázka elektronické knihy, UID: KOS507118
jedná se zejména o funkce pracující s oblastmi buněk. Aby bylo možné v kódu makra využívat všechny standardní funkce Excelu, v objektu Application je k dispozici odkaz WorksheetFunction, který tyto funkce obsahuje. Do kódu zapíšete objekt Application a tečku, z kontextové nabídky vyberte odkaz WorksheetFunction a zapíšete další tečku. V další kontextové nabídce se zobrazí seznam standardních funkcí Excelu v originální anglické verzi. Funkci vyberte klepnutím a do závorek napište potřebné parametry.
Obrázek 7.2 Použití standardních funkce Excelu v kódu
Tímto způsobem je možné vložit do kódu VBA libovolnou standardní funkci Excelu. Vypočtený výsledek se do buňky zapíše jako pevná hodnota, nikoliv jako vzorec. Následující příklad zapíše do buňky B2 údaj z buňky C4, zaokrouhlený na celé stovky dolů: Range("B2") = Application.WorksheetFunction.RoundDown(Range("C4"), -2)
V praxi je často zapotřebí provést vyhledávání v ceníku nebo jiné podobné tabulce podle hodnoty obsažené v prvním sloupci oblasti. To provádí funkce VLookup (v české verzi Excelu funkce SVYHLEDAT). Příklad (hledaná hodnota je v buňce F2, hledání se provádí podle přesné shody): Range("G2") = Application.WorksheetFunction.VLookup(Range("F2"), _ Range("B2:D40"), 2, False)
Pokud by použitá funkce vrátila chybovou hodnotu, běh makra skončí chybou. Z tohoto důvodu je nutné pojistit použití funkce tak, aby se při chybné vstupní hodnotě makro nezhroutilo. Řešení tohoto problému je popsáno v kapitole 9. Při použití standardních funkcí Excelu dodržujte tyto zásady: ◾◾ Parametry se oddělují čárkou. ◾◾ Pro odkazy na buňky nebo oblasti použijete odkaz Range. ◾◾ Čísla je třeba psát s desetinnou tečkou. ◾◾ Jako parametry můžete použít i proměnné. Visual Basic však není v tomto případě schopen automaticky konvertovat text na číslo. Jestliže například pro číselný parametr použijete proměnnou získanou funkcí InputBox, nastane chyba, protože tato funkce vrací textovou hodnotu. Proměnnou proto musíte převést na číslo pomocí funkce Val a v případě desetinného čísla převést čárku na tečku: promenna = Val(Replace(promenna, ",", "."))
Názvy funkcí v originále naleznete například na stránkách https://www.abecedapc.cz/microsoft-excel-prehled-funkci. Je také možné využít záznamník maker, který ve vytvořeném kódu používá vždy originální anglické názvy funkcí.
Práce s listy, sešity a aplikací Excelu 99
Ukázka elektronické knihy, UID: KOS507118
Použití standardních funkcí Excelu je pomalejší než použití standardních funkcí VBA. Proto je vhodné používat standardní funkce Excelu pouze v případě, že obdobná funkce VBA neexistuje. Platí to zejména u zpracování velkého množství dat. V sešitu Listy_sesity.xlsm vytvořte makro, které použije kód výrobku zadaný funkcí InputBox, v tabulce na listu Ceník nalezne potřebný výrobek a kód, název a cenu zapíše do tabulky na listu Kalkulace do prvního prázdného řádku. V sešitu Listy_sesity.xlsm je toto makro vytvořeno pod názvem Vyhledavani.
7.3.2
Dialogy pro otevření a uložení sešitu
Při otvírání sešitu nebo jeho ukládání pod jiným jménem by bylo často výhodné použít standardní dialogové okno Windows. Objekt Application k tomu nabízí dvě metody: GetOpen Filename pro otevření souboru a GetSaveAsFilename pro uložení souboru. Obě metody fungují jako funkce a vrací textový řetězec s úplnou cestou a názvem sešitu. Metoda GetOpenFileName má parametr FileFilter, který umožňuje nastavit filtr pro otvírané soubory. Parametrem je textový řetězec, který sestává ze dvou částí oddělených čárkou: první část je popisek zobrazený v dialogovém okně, druhá část je přípona otevíraného souboru (s tečkou a hvězdičkou). V parametru je možné zadat i více přípon oddělených středníkem, popřípadě použít hvězdičku i v textu přípony (přípona *.xls* umožní otevřít sešit libovolného typu). Příklad: sesit = Application.GetOpenFilename("Sešity Excelu (*.xlsx;*.xlsm;*.xls),*.xls*")
Parametr v metodě GetOpenFileName tvoří jeden textový řetězec. Metoda sama dialogové okno nezobrazuje, ale používá k tomu prostředky systému Windows – proto je nutné použít tento poněkud nezvyklý zápis. Textový řetězec vrácený metodou GetOpenFileName můžete bez dalších úprav použít v metodě Open pro otevření sešitu. Při tomto použití metody Open je výhodné využít objektovou proměnnou, z níž lze snadno získat název otevíraného sešitu pomocí vlastnosti Name. Jestliže uživatel použije v dialogovém okně tlačítko Storno místo tlačítka Otevřít, metoda GetOpenFileName vrátí hodnotu False (tedy nikoliv řetězec s nulovou délkou!). Součástí kódu by měl být tedy i test na vrácenou hodnotu, aby pokus o otevření sešitu neskončil chybou: Dim otevreny_sesit As Workbook sesit = Application.GetOpenFilename("Sešity Excelu (*.xlsx;*.xlsm;*.xls),*.xls*") If sesit = False Then MsgBox "Sešit není otevřen !",48,"CHYBA" Exit Sub End If Set otevreny_sesit = Workbooks.Open(sesit) nazev_sesitu = otevreny_sesit.Name
Metoda GetSaveAsFilename funguje obdobně, ale má dva parametry: ◾◾ InitialName je nabízený název ukládaného sešitu. Zapisujete jej bez přípony. Pokud parametr vynecháte, položka pro název sešitu se zobrazí prázdná.
100 Programování v Excelu 2019 Ukázka elektronické knihy