+ All Categories
Home > Documents > INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí...

INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí...

Date post: 18-Aug-2018
Category:
Upload: trinhdang
View: 213 times
Download: 0 times
Share this document with a friend
42
VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ FAKULTA STAVEBNÍ INFORMATIKA II MODUL 02 ALGORITMIZACE A PROGRAMOVÁNÍ V INŽENÝRSKÝCH ÚLOHÁCH STUDIJNÍ OPORY PRO STUDIJNÍ PROGRAMY S KOMBINOVANOU FORMOU STUDIA
Transcript
Page 1: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

FAKULTA STAVEBNÍ

INFORMATIKA II

MODUL 02

ALGORITMIZACE A PROGRAMOVÁNÍ

V INŽENÝRSKÝCH ÚLOHÁCH

STUDIJNÍ OPORY

PRO STUDIJNÍ PROGRAMY S KOMBINOVANOU FORMOU STUDIA

Page 2: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika II • Modul 02 • Algoritmizace a programování

2

© Jiří Macur, Miroslav Menšík

Page 3: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Obsah

3

OBSAH

OBSAH 3

VSTUPNÍ INFORMACE K MODULU 5

Cíle 5

Požadované znalosti 5

Doba potřebná ke studiu 5

Klíčová slova 5

Použitá terminologie 5

Metodický návod na práci s textem 5

1 OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ 7

1.1 Třída jako zobecněný typ 7 1.1.1 Instance třídy 8 1.1.2 Atributy 8 1.1.3 Metody 9

1.2 Vznik a zánik objektu 10

1.3 Zapouzdření, polymorfismus, dědičnost 11

1.4 Programování řízené událostmi 12

2 APLIKAČNÍ MODELY 15

2.1 Hierarchie objektů 15

2.2 Kolekce objektů 15

3 DŮLEŽITÉ OBJEKTY APLIKACE MS EXCEL 16

3.1 Sešity, listy, množiny buněk 17 3.1.1 Kolekce a prvky kolekce Worbooks 17 3.1.2 Procházení kolekce 19 3.1.3 Kolekce a prvky kolekce Worksheets 20 3.1.4 Kolekce buněk Range 21

3.2 List jako kontejner pro vstup a výstup dat 23

3.3 Využití grafu pro prezentaci dat 26

4 PRÁCE SE SOUBORY PROSTŘEDNICTVÍM FSO 29

4.1 Metody pro práci se složkami a soubory 31

Page 4: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Počítačové a operační systémy

4

4.2 Výběrový objekt třídy FileDialog 34

4.3 Zápis a čtení dat ze souboru 36

5 DŮLEŽITÉ OBJEKTY APLIKACE MS WORD 38

5.1 Vybrané postupy programování textu 39

5.2 Použití objektového modelu z jiné aplikace 41

Page 5: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

5

Vstupní informace k modulu

Cíle

Čtenář by měl získat základní dovednost využívat aplikační objektové knihov-

ny MS Office v prostředí jazyka Visual Basic při řešení inženýrských úloh.

Text je určen pro studenty technicky orientovaných oborů mimo oblast infor-

mačních technologií.

Požadované znalosti

K přečtení a porozumění tomuto textu jsou potřebné znalosti uvedené v modu-

lu CU01_M01 – strukturované programování v jazyce Visual Basic, práce v

prostředí VBA.

Doba potřebná ke studiu

Je velmi individuální podle znalostí čtenáře. Pro velmi skromné znalosti je

uvedená doba cca 20 hodin.

Klíčová slova

Algoritmizace, programovací jazyk Visual Basic, strukturované programování,

objektově orientované programování, objektový model aplikace, knihovny

objektů, implementace inženýrských úloh

Použitá terminologie

Diskutovaná problematika se rychle vyvíjí, proto je česká terminologie značně

neustálená. V textu je většinou uváděna i ekvivalentní anglická terminologie

spolu s příslušnými zkratkami.

Metodický návod na práci s textem

Text je určen zejména pro osvojení základů algoritmického myšlení, získání

všeobecné programátorské dovednosti a schopnosti využívat bohatých objek-

tových knihoven v běžně používaných aplikacích. Je třeba si uvědomovat tvo-

řivou podstatu programátorské práce, kdy lze dospět k cíli mnoha různými způ-

soby.

Čtenář by se neměl nechat odradit zdánlivě složitou strukturou používaných

objektových modelů. Jsou to jenom nástroje a vznikly proto, aby uživatelům

usnadnily život. Jsou koncipovány tak, aby si každý mohl vybrat (většinou

Page 6: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

6

relativně chudou) podmnožinu objektů pro své účely – je zapotřebí se oriento-

vat na logické souvislosti a nikoli na encyklopedické znalosti.

Page 7: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

7

1 Objektově orientované programování

Text v prvním modulu se týkal tzv. procedurálního programování. Od začátku

tohoto století však dominuje metoda objektově – orientovaného programování

(OOP), která se postupně stala standardem. Pro efektivní programování není

třeba zabíhat do teoretických podrobností – hlavním aspektem je používání tzv.

objektů, které mají následující rysy:

Vnitřní struktura – až dosud jsme používali skalární proměnné, později pole.

Objekt je obecnější pojem: sestává z tzv. vlastností (atributů) a metod. Vlast-

nosti jsou v podstatě datové proměnné, svázané dohromady tím, že patří k té-

muž objektu. Popis objektu pomocí určitých jeho vlastností je přirozený –

chceme-li popsat objekt reálného světa, také používáme tento přístup (např.

člověk může být popsán souborem svých fyzických a duševních vlastností).

Okamžitý soubor hodnot vlastností vyjadřuje stav objektu (např. vlastnost

"barva vlasů" člověka může postupně nabýt hodnot blond, brunet, šedivé, žád-

né). Objekt se tedy může v čase měnit prostřednictvím změn hodnot svých

vlastností.

Soubor vlastností objektu může být tvořen souborem proměnných tak, jak jsme

se s nimi seznámili v části o procedurálním programování. Vlastností objektu

však může být také jiný objekt, tj. vlastnost může být dále strukturovaná (např.

vlastnost "inteligence" může být dále vnitřně členěna jako soubor inteligence

sociální, logické, emoční ap.). Tímto způsobem vzniká určitá objektová hierar-

chie.

Metody objektu představují jeho "vnitřní dovednosti". Jsou tvořeny obvykle

podprogramy, které mj. pracují s vlastnostmi objektu. Např. člověk (zdravý) je

schopen chůze, práce atd. Výsledkem procesu metody je změna stavu objektu

(např. chůze člověka přemístí z jednoho místa – vlastnost polohy – na jiné).

Uvedený přístup k programování podstatně mění celou metodiku: zatímco v

případě procedurálního programování jsme tvořili algoritmus "shora – dolů", tj.

postupně jsme obecný problém dekomponovali až na jednotlivé příkazy, v pří-

padě OOP se spíše snažíme o "simulaci chování" navržených objektů. Výsled-

kem je pak spíše návrh "zdola – nahoru". Řešení vzniká jako výsledek chování

objektů.

1.1 Třída jako zobecněný typ

Objekt má tedy svou strukturu a chování (něco "dovede"). Tato struktura a

zmíněné chování jsou popsány v tzv. třídě objektu (class). Nejčastěji se třída

ztotožňuje se "šablonou" objektu. Na třídu však můžeme nahlížet také jako na

zobecnění datového typu. Např. datový typ Double určuje pravidla pro uložení

reálného čísla v paměti a nelze ho zaměnit s konkrétním číslem. Stejně tak třída

není vlastním objektem – nezahrnuje stav objektu (hodnoty jeho vlastností).

Tak, jako mají datové typy své názvy, mají názvy i třídy. V tomto případě jsou

však názvy tvořeny programátory (nejsou součástí jazyka). U rozsáhlejších

programů je velmi důležité, aby byly názvy tříd voleny pečlivě a byla pořizo-

vána dokumentace o jejich zamýšleném účelu (softwarová analýza).

Page 8: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

8

1.1.1 Instance třídy

Objekt dané třídy se nazývá také instance třídy. Jedná se o strukturovaná data

v paměti obsahující konkrétní hodnoty (stav). Stav objektu se v čase mění, ať

už prostřednictvím metod objektu nebo přímou změnou ze strany jiných pro-

gramů a objektů v paměti. Současně můžeme používat libovolný počet objektů

stejné třídy. Budou se lišit umístěním v paměti (budou mít různé identifikátory)

a také stavem. Instance třídy se vytváří speciálním operátorem New (viz dále).

Název (identifikátor) objektu se od názvu třídy liší (stejně jako nevytváříme

proměnnou s názvem Integer). Identifikátor objektu obsahuje adresu umístění

objektu v paměti obdobně jako u proměnné typu String. Důvodem je vnitřní

struktura objektu a možnosti změny rozsahu objektu za doby jeho života v pa-

měti počítače.

1.1.2 Atributy

Třída je tvořena množinou vlastností objektu. Ve skutečnosti jsou zde atributy

objektu deklarovány, tj. je uveden jejich název a datový typ. Třídu definujeme

ve VB v modulu tříd, který musíme nejprve do projektu vložit:

Následně musíme třídu vhodně pojmenovat postupem podle níže uvedeného

obrázku, implicitní název Class1 rozhodně není vhodný:

Nyní lze do modulu třídy vložit atributy:

Page 9: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

9

Vidíme, že atributy mají charakter deklarace, pouze klíčové slovo Dim je na-

hrazeno klíčovým slovem Public (tím povolujeme přístup k atributům třídy z

vnějšího prostředí; atributy lze také znepřístupnit klíčovým slovem Private,

pro naše účely je však tato problematika nepodstatná).

Nyní je již možné s třídou programově pracovat, např. takto:

Deklarace proměnné zamestnanec třídy osoba pro práci s objektem nesta-

čí. Musíme ještě vytvořit instanci třídy příkazem Set s použitím operátoru

New (viz 3. řádek programu). Od této chvíle existuje v paměti objekt s názvem

zamestnanec a lze pracovat s jeho atributy, které identifikujeme názvem

objektu a atributu odděleným tečkou. Znak "." se někdy nazývá také selektor –

vybírá z objektu patřičnou část.

1.1.3 Metody

Dále třída objektu obsahuje definici jeho metod – soubor podprogramů. Pů-

vodní myšlenka OOP byla založena na principu skrývání stavu objektu –

všechny vlastnosti definující stav měly být pro vnější prostředí (jiné objekty a

programy) černou skříňkou, k nimž by byl přístup pouze prostřednictvím me-

tod objektu. Význam tohoto opatření tkví zejména v bezpečnosti – metody mo-

hou ověřit oprávnění vnějšího objektu přistupovat (číst, či měnit) vlastnosti

daného objektu. V dnešní době však toto pravidlo není rigidně dodržováno.

Programátor (tvůrce třídy) určuje, zda lze obsah vlastnosti přečíst nebo změnit

přímo, bez prostředníka v podobě metody objektu.

K definici třídy přidáme metodu pro výstup atributů např. takto:

Page 10: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

10

Protože metoda bude součástí objektu, má k dispozici všechny jeho atributy.

Proto při jejich používání nepoužíváme žádná bližší určení pomocí selektoru.

Nyní lze použít novou metodu třídy v programu:

Vidíme, že použití metody se ze syntaktického hlediska neliší od používání

atributů – opět používáme tečkový selektor pro výběr potřebné metody. Meto-

da však může mít parametry, pro které platí vše, co bylo uvedeno v modulu

CU01_M01 v kapitole o předávání parametrů. Upravíme metodu naší třídy pro

různé druhy tisku:

Použití upravené metody pak může být následující:

1.2 Vznik a zánik objektu

Vznik objektu (instance třídy) v našem případě vyvolal příkaz

Set zamestnanec = New osoba

Atributy zaměstnance však nejsou po vzniku objektu naplněny definovanými

hodnotami, což může vést ke zmatkům při použití objektu. Proto bývá zvykem

použít v definici třídy speciální metodu, která při vzniku objektu automaticky

definuje jeho počáteční stav (naplní atributy počátečními hodnotami). Metoda

takové inicializace objektu se nazývá konstruktor a v jazyce VB musí být na-

zvána Class_Initialize:

Page 11: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

11

Nyní můžeme vyzkoušet automatické uplatnění konstruktoru:

Pokud potřebujeme za běhu programu existenci objektu ukončit (uvolnit pa-

měť), použijeme příkaz

Set zamestnanec = Nothing

Poznámka

Klíčové slovo Nothing ve skutečnosti pouze odstraní ukazatel na objekt v paměti (objektová

proměnná zamestnanec obsahuje speciální prázdnou adresu). V prostředí VB se periodicky

aktivuje tzv. garbage collector, který likviduje takové objekty v paměti, na které neexistuje

žádný odkaz.

1.3 Zapouzdření, polymorfismus, dědičnost

Na stav objektu se lze dívat jako na černou skřínku, k níž máme pouze omeze-

ný přístup zejména pomocí metod objektu. Tento princip "zapouzdření" (en-

capsulation) dat i metod do jednoho kompaktního celku je pokládán za jednu z

významných výhod OOP.

V této souvislosti je uváděna také vlastnost polymorfismu operací s objekty. V

podstatě jde o různé chování různých objektů ve stejných souvislostech. Na

polymorfismus jsme již narazili např. při používání operátoru "+". Sečítáme-li

celá čísla, je výsledkem celé číslo. Sečítáme-li reálná čísla, bude výsledkem

reálné číslo – operátor "+" tedy pracuje jinak pro různé datové typy. Nejvýraz-

nější je však tato vlastnost při "sečítání" řetězců, kdy je výsledkem operace

spojený řetězec (i když bychom měli v této roli používat raději operátor "&").

Stejně tak si můžeme představit např. objekt obsahující v podobě atributů koe-

ficienty matice, který obsahuje metodu tisk pro výstup (zobrazení) vhodně

zformátované matice. Stejnou metodu tisk však může obsahovat objekt obsahu-

jící vektor, nebo odstavec textu. Způsob provedení metody se stejným názvem

tedy určuje objekt.

Dědičnost je mechanizmus, kterým lze z definice jedné třídy odvozovat jiné

podobné třídy. Používá se zejména v souvislosti s hierarchií obecnosti. Např.

Page 12: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

12

třída osoba obsahuje obecné atributy člověka, avšak třída pacient obsahuje

navíc atributy chorobopisu a metody léčení. Abychom nemuseli definovat po-

řád znovu stejné atributy a metody, nabízí OOP mechanizmus dědění (inheri-

tance), kdy definujeme v podstatě pouze rozdíly mezi třídami.

1.4 Programování řízené událostmi

Volání metod objektů je standardně dáno sekvenčním prováděním algoritmů.

Objekt v paměti však podléhá určitému vývoji (evoluci), který často v algorit-

mu předvídat nemůžeme – nejčastěji se jedná o asynchronní zásahy v době

života objektu vyvolané operačním systémem nebo jinými objekty. Pro pro-

gramovou reakci na vybrané změny stavu objektu máme k dispozici mechani-

zmus událostí (angl. events).

Pozorný čtenář si jistě domyslel, k čemu tato kapitola směřuje: prakticky vše,

s čím manipulujeme v aplikacích, lze považovat za objekty, které mají své

vlastnosti a metody. Např. okno aplikace je objektem, který má své atributy

(geometrii, barvu rámečku apod.) a metody (schopnost zobrazit se na obrazov-

ce, změnit svůj tvar apod.). Některé z metod jsou však závislé na činnosti uži-

vatele – ten prostřednictvím myši okno přesune nebo minimalizuje; metody

okna pak musí reagovat na požadavky, které oknu zasílá operační systém. Prá-

vě operační systém se totiž stará o zobrazení grafického kurzoru, sleduje polo-

hu myši a jejích tlačítek a vyhodnotí, kterého objektu v paměti se vzniklá udá-

lost týká.

Mechanizmus událostí je založen na vazbě mezi typem události a speciální

metodou objektu, která je automaticky spuštěna při výskytu této události (tato

metoda se někdy nazývá také událostní procedura). Ve VB je uvedená vazba

realizována předepsaným názvem metody a my jsme se již s tímto mecha-

nizmem setkali – konstruktor s předepsaným názvem Class_Initialize

lze také pokládat za událostní proceduru, která se automaticky spustí při udá-

losti vzniku objektu.

Page 13: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

13

V levém horním rohu obrázku vidíme seznam událostí, pro které lze vytvořit

událostní procedury. Události se týkají objektu listu s názvem "Data". Lze tedy

vytvořit metody tohoto objektu, které se spustí při aktivaci listu (za předpokla-

du, že list "Data" předtím nebyl aktivní), při změně dat v listu, při poklepání

myší apod.

Vytvořit událostní proceduru lze jednoduše výběrem názvu události (např.

Change) – v modulu listu je automaticky vytvořena prázdná metoda

Worksheet_Change, do které zbývá vepsat kód:

Pak otevřeme list a zapíšeme libovolný údaj do libovolné buňky listu. Po opuš-

tění buňky se automaticky vykoná událostní procedura. Totéž se bude opakovat

při jakékoli změně v obsahu listu:

Page 14: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

14

Důležitá poznámka

V našich příkladech nebudeme tvořit ani nové třídy, ani reakce na události. Budeme však pou-

žívat třídy a objekty již hotových aplikací. Je proto nutné osvojit si stručné teoretické zázemí

OOP.

Page 15: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

15

2 Aplikační modely

Moderní aplikace jsou vyvíjeny tak, aby byly uživatelsky rozšiřitelné – výrob-

ce pak nemusí poskytovat různé mutace pro nejrůznější specializace, kde je trh

příliš úzký, a přesto lze aplikaci přizpůsobit na míru nejrůznějším potřebám.

Vzhledem k tomu, že objektový přístup je dnes při vývoji aplikací dominantní,

je i prostředí pro rozšiřování a přizpůsobení programových produktů vytvořeno

v podobě množiny objektů.

Tato množina má obvykle hierarchickou strukturu a nazývá se objektovým mo-

delem aplikace, někdy též objektové aplikační rozhraní nebo objektová

knihovna.

Kvalita návrhu struktury objektů rozhoduje o tom, zda bude možné tvořit rozší-

ření a nadstavby aplikace snadno, nebo bude tento proces průchodný jen pro

hrstku profesionálů. Aplikační model obsahuje často desítky až stovky objektů,

není proto možné, aby měl programátor detailní znalosti o všech jejich schop-

nostech a vazbách. Mnoho informací musí mít intuitivní charakter, aby se daly

logicky odvodit a případně dohledat pouze detaily.

2.1 Hierarchie objektů

Na vrcholu hierarchického modelu aplikace bývá tradičně objekt třídy Ap-

plication, který reprezentuje běh aplikace. V podobě atributů pak obsahuje

další podobjekty, které realizují dílčí činnosti aplikace.

Objekt třídy Application je přímo k dispozici v době, kdy je aplikace spuš-

těna. V případě potřeby však můžeme objekt třídy Application také vytvo-

řit – většinou tehdy, když potřebujeme v programu použít objekty jiné aplikace

(viz dále).

Objekt, který v podobě vlastností obsahuje jiné objekty, se někdy nazývá také

objektový kontejner.

2.2 Kolekce objektů

Často je zapotřebí pracovat s "polem" objektů stejné třídy. Pro tyto účely se

používá speciální objekt nazývaný kolekce. Kromě možnosti přistupovat k prv-

kům kolekce pomocí indexu má kolekce obvykle metody umožňující zejména

přidat další prvek, odstranit prvek z kolekce apod.

Page 16: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

16

3 Důležité objekty aplikace MS Excel

Objektový model aplikace MS Excel je poměrně složitý:

Obr. 3.1 – Začátek a konec první úrovně objektů, které obsahuje

třída Application jako své vlastnosti

Většina vlastností, za nimiž se skrývá kolekce jiných objektů, se nazývá množ-

ným číslem (-s na konci názvu).

Některé podobjekty obsahují jako svou vlastnost z pragmatických důvodů opět

nadřízený objekt (kruhové odkazy). Vzhledem k tomu, že vlastnost v podobě

objektu obsahuje ve skutečnosti pouze adresu objektu, je tato konstrukce na-

prosto legitimní.

Některé objekty jsou umístěny v hierarchii současně více způsoby, např. aktiv-

ní sešit ActiveWorkbook je vlastností Application, ale zároveň je čle-

nem kolekce Workbooks, která je také vlastností třídy Application.

Naštěstí k našim účelům bude zapotřebí osvojit si práci jen s velmi malým po-

čtem kolekcí a objektů.

Page 17: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

17

3.1 Sešity, listy, množiny buněk

Naše programy spouštíme ve vývojovém prostředí MS Excel, který musí být

v dané chvíli pochopitelně spuštěn. Zastupuje ho objekt třídy Application,

který máme v našich programech k dispozici. K ostatním objektům aplikačního

modelu se dostaneme prostřednictvím jeho vlastností.

3.1.1 Kolekce a prvky kolekce Worbooks

V běžící aplikaci mohou být otevřeny různé soubory se sešity, které jsou pří-

stupné pomocí kolekce Workbooks. Tato kolekce má (podobně jako většina

ostatních kolekcí objektů) obecnou vlastnost Count, která obsahuje počet po-

ložek v kolekci (zde počet současně otevřených souborů v aplikaci MS Excel):

Obr. 3.2 – Programové určení počtu položek v kolekci

Otevřeli jsme tedy tři soubory a krátkým programem zobrazili obsah vlastnosti

Count. Všimněte si hierarchického zápisu: objekt Application má objek-

tovou vlastnost Workbooks, která má vlastnost Count. Při výběru používá-

me posloupnost vnořených tříd s použitím tečky, není třeba používat žádné

závorky.

Vzhledem k tomu, že Application zastupuje samotnou aplikaci, lze ho při

identifikaci vynechat – v programu použijeme zkráceně Workbooks.Count

Důležité metody objektu Workbooks jsou následující:

Add – vytvoří nový sešit

Open – otevírá existující soubor se sešitem

Close – zavře všechny otevřené sešity

Na metodě pro vytvoření nového sešitu můžeme demonstrovat základní postu-

py práce s objektovou knihovnou. Metoda Add provede programově stejnou

činnost, jako tlačítko "Nový" v základní nabídce aplikace, tj. vznikne nový

sešit se třemi listy a implicitním názvem. Avšak metoda je funkcí – vrací nově

vytvořený objekt sešitu v paměti, který můžeme uložit do objektové proměnné

správné třídy (Workbook) a dále pracovat s jeho vlastnostmi, aniž bychom

byli svazováni vazbami na hierarchickou síť.

Vytvořili jsme tedy nový objekt sešitu (instanci třídy Worbook) a nepotřebo-

vali jsme žádný operátor New ani konstruktor – metoda Add se o vše potřebné

k vytvoření a inicializaci datové struktury postará.

Page 18: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

18

Proto nemusíme konstruovat nové objekty, obvykle nám nabídka poskytovaná

aplikačním modelem stačí.

Obr. 3.3 – Programové přidání nové sešitu

V příkladu nejprve deklarujeme objekt třídy Workbook. Dalším příkazem

zavoláme metodu Add a výsledek přiřadíme naší objektové proměnné. V tomto

přiřazení se obsahem proměnné stane ve skutečnosti adresa datové reprezenta-

ce (objektu) sešitu. Příkaz je rozšířen o klíčové slovo Set, které zatím nelze

vynechat a zdůrazňuje jiný vnitřní mechanizmus operací s objekty, než se ska-

lárními proměnnými.

Nový objekt sesit má již velmi mnoho vlastností a metod – v příkladu jsme

použili pouze obecnou vlastnost Name obsahující název sešitu (po uložení to

bude jméno souboru).

Metoda Open pracuje obdobně jako metoda Add, používá se však s paramet-

rem označujícím jméno souboru, v němž je sešit uložen:

Obr. 3.4 – Programové otevření sešitu a zjištění jeho vlastnosti

Kolekce nám tedy pomáhá při vytváření a zavírání nových sešitů. Potřebujeme

ještě mechanizmus, jak pracovat s konkrétním prvkem v kolekci.

Nejjednodušeji můžeme použít vlastnost Workbooks.Item(index), která

si nese index analogicky jako při práci s polem.

Page 19: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

19

Obr. 3.5 – Člen kolekce určený pomocí indexu

Členy kolekce jsou objekty třídy Workbook, s nimiž lze pracovat pomocí

jejich indexu (postupně otevírané soubory jsou číslovány od jedničky výše).

Tento způsob se však používá zřídka. Indexy jsou přiřazovány postupně, takže

po sérii zrušení a otevření souborů již nevíme, který sešit má který index. Čas-

těji hledáme objekt kolekce pomocí jména (vlastnost Name bývá k dispozici ve

všech objektech, kde má smysl). Zobrazování vlastnosti jména v našich pro-

gramech tedy nebylo samoúčelné. Vidíme, že vlastnost jména je naplněna ná-

zvem souboru (bez cesty). Toto jméno může sloužit rovněž v roli indexu.

Vlastnost Item lze v této souvislosti navíc vynechat a dostáváme se k nejčas-

těji používanému způsobu zpřístupnění objektu z kolekce:

Set sesit = Workbooks("sesit.xls")

Poznámky

Zavádět objektovou proměnnou bychom v posledním příkladu nemuseli, protože instance

Workbook existuje. Programátor VB by patrně použil bez deklarací přímo příkaz:

MsgBox("Nový sešit má jméno: " & Workbooks(2).Name)

Dále je zapotřebí striktně rozlišovat mezi kolekcí a jejími prvky. Kolekce je objekt, který má

obvykle úplně jiné vlastnosti než mají objekty, které jsou v kolekci obsaženy. Tyto techniky je

zapotřebí vstřebat, budou nás doprovázet prakticky ve všech programech.

3.1.2 Procházení kolekce

Velmi často potřebujeme provést nějakou operaci se všemi prvky kolekce.

K tomu máme k dispozici variantu počítaného cyklu

For Each <objekt vhodné třídy> In <kolekce>

… tělo …

Next

V těle takového cyklu používáme název proměnné, do které je postupně dosa-

zován další a další prvek kolekce, dokud zpracováním v těle neprojdou všech-

ny prvky.

Pohodlí, které tento druh cyklu poskytuje v souvislosti s procházením kolekcí,

přivedlo vývojáře k implementaci tohoto cyklu i v jiných, rigidnějších progra-

movacích jazycích.

Page 20: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

20

Obr. 3.6 – Procházení všech členů kolekce

Cyklus procházení kolekce. Proměnná sesit postupně reprezentuje všechny

prvky v kolekci. V těle cyklu tak můžeme použít metody a vlastnosti ve sku-

tečnosti různých objektů, i když jsou pojmenovány stejně.

3.1.3 Kolekce a prvky kolekce Worksheets

V otevřeném souboru máme k dispozici kolekci pracovních listů

Worksheets, která má obdobnou strukturu jako kolekce Workbooks. Ob-

sahuje také vlastnost Count s počtem listů v sešitu a metodu Add pro přidání

nového pracovního listu. Spektrum metod kolekce je samozřejmě bohatší,

v našich programech však s nimi pracovat nebudeme.

Prvky kolekce jsou pracovní listy (třída Worksheet). Pokud potřebujeme

pracovat s konkrétním listem, můžeme ho identifikovat stejně jako v předchá-

zejícím případě indexem nebo názvem. Nejčastěji použijeme konstrukci:

Dim list As Worksheet

Set list = Worksheets("List1")

kde řetězec "List1" obsahuje název listu. Vidíme, že mnoho údajů lze při iden-

tifikaci objektu v objektovém modelu vynechat, ve skutečnosti by celý identi-

fikátor objektu listu mohl vypadat následovně:

Application.Workbooks.Item("mujSesit.xls").Worksheets.Item("List1")

Page 21: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

21

(aplikace obsahuje kolekci sešitů, z nichž jeden s požadovaným názvem obsa-

huje kolekci listů, z nichž jeden s požadovaným názvem je list, s nímž chceme

pracovat)

Vynechání objektů Application a Item jsme již diskutovali, jak ale mů-

žeme vynechat identifikaci sešitu? Při zamlčeném nadřízeném objektu v celé

hierarchii doplní VB automaticky tzv. aktivní objekt. V tomto případě sešit, s

nímž pracujeme (jeho okno je aktivní). Stejně tak může být aktivní jeden list v

rámci sešitu, buňka v listu apod. Takové objekty obvykle obsahují metodu

Activate, kterou lze objekt prohlásit za aktivní programově (samozřejmě lze

při interaktivní práci dosáhnout téhož výběrem myší). Při tvorbě programů,

které využívají v identifikátorech metodu zamlčených objektů, musíme být

opatrní – pokud nevíme, zda uživatel programu nebude používat více prvků

kolekce současně, měli bychom používat co nejúplnější část hierarchie.

Třída pracovního listu Worksheet obsahuje desítky vlastností a desítky me-

tod.

Výběr užitečných vlastností:

Cells – kolekce všech buněk v listu (má dva indexy: řádek, sloupec)

Rows – kolekce všech řádků v listu

Columns – kolekce všech sloupců v listu

Range – vybraný soubor buněk v listu

Name – název listu

Index – index listu v rámci kolekce sešitu

Visible – vlastnost určující, zda je list viditelný nebo skrytý

Uvedené vlastnosti budou blíže diskutovány při použití v programech.

Výběr užitečných metod:

Activate – nastaví list jako aktivní

Copy – zkopíruje list na jiné místo v sešitu

Delete – odstraní list i s daty z kolekce

Move – přesune list na jiné místo v kolekci

PrintOut – vytiskne list

SaveAs – uloží list i s daty do souboru

Metody mohou mít mnoho parametrů, my však programovou práci s listy pro-

vádět nebudeme. Zájemce si snadno dohledá příklady použití.

3.1.4 Kolekce buněk Range

Objekty této třídy, které budeme používat prakticky v každém programu, re-

prezentují soubor buněk v listu. Objekt této třídy není dále dělen na jednotlivé

buňky – každá buňka je opět kolekcí buněk, i když obsahuje pouze jedinou.

Tuto koncepci tvůrců objektového modelu si musíme osvojit – i když budeme

pracovat pouze s jednou buňkou, bude to objekt třídy Range.

Pokud tedy budeme potřebovat údaje uložené v určité buňce nebo souboru bu-

něk, identifikujeme je prostřednictvím kolekce Range. Kolekce má opět vlast-

nosti Count a Item (a mnoho dalších), indexovat prvky v kolekci lze pomo-

Page 22: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

22

cí dvojice čísel řádku a sloupce, nebo názvem, který je zadán standardně podle

konvencí aplikace MS Excel:

Obr. 3.7 – Vytvoření kolekce buněk v listu

Z listu s indexem 1 tedy vybereme pravoúhlou oblast buněk 3 x 3, která se sta-

ne naší kolekcí rozsah.

Pokud v našem příkladu potřebujeme, aby rozsah obsahoval jedinou buňku,

můžeme použít příkaz

Set rozsah = Worksheets(1).Range("C2")

Pro určení jediné buňky můžeme použít ještě jednu možnost:

Set rozsah = Worksheets(1).Cells(2,3)

Tímto způsobem určíme tutéž buňku v notaci Cells(číslo řádku, číslo sloupce).

Tento způsob je užitečný zejména tam, kde potřebujeme určit souřadnice buň-

ky pomocí výpočtu.

Vybrat do rozsahu celý sloupec lze např. takto:

Set rozsah = Worksheets(1).Range("C:C")

analogicky řádek

Set rozsah = Worksheets(1).Range("2:2")

Existuje mnoho dalších možností, jak vytvořit množinu buněk třídy Range,

množina se může skládat z více oblastí, dokonce může být rozložena na více

listech apod. Pro naše programy budou však výše uvedené postupy dostačující.

Z desítek vlastností obsažených ve třídě Range nám v programech většinou

postačí jediná: Value – vlastní obsah objektu.

Vlastnosti určující velikost buněk, font a barvu písma, pozadí apod. budeme

používat jen zřídka. V tomto případě lze totiž vše potřebné obvykle nastavit

interaktivně přímo v listu. Naše použití programů bude orientováno zejména na

výpočty orientující se na obsah buněk.

Obr. 3.8 – Nastavení obsahu buněk v kolekci Range

Page 23: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

23

3.2 List jako kontejner pro vstup a výstup dat

List Excelu lze využít jako prostředí pro vstup a výstup dat z našich programů.

Dále je často výhodné do listu zařadit graf, který ihned interpretuje vypočítané

výsledky. Jak programy, tak uvedené listy lze uložit do jednoho souboru, který

pak lze chápat jako interaktivní aplikaci:

Obr. 3.9 – List jako výpočetní miniaplikace

Příklad předpokládá vložení koeficientů rovnice do naformátovaných vstup-

ních polí B1:B3. Po kliknutí na tlačítko "výpočet kořenů" se z vložených koe-

ficientů zformuluje tvar rovnice, který se zapíše do buňky D1. Nakonec se vy-

počítá hodnota kořenů a uloží do buněk B7 a B8.

Hodnoty vložené do listu načteme do proměnných programu například takto:

Obr. 3.10 – Vložení dat z listu do proměnných

Pokud uživatel do patřičných buněk vloží nevhodné znaky, program zhavaruje:

(hodnotu buňky nelze vložit do proměnné deklarovaného typu Single).

Page 24: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

24

Pokud potřebujeme uvedený typ havárií ošetřit, můžeme použít např. následu-

jící konstrukci:

If IsNumeric(Worksheets("QE").Range("B1").Value) Then

a = Worksheets("QE").Range("B2").Value

Else

MsgBox ("V poli B2 musí být číselný údaj!")

Exit Sub

End If

Vestavěná funkce isNumeric testuje, zda lze parametr převést na číselnou

hodnotu. Vrací logickou hodnotu. Příkazy Exit … umožňují násilně ukončit

prováděnou část programu, v níž jsou zařazeny (např. Exit Do, Exit

Function, Exit For). Program pak pokračuje až za touto částí. Zde jsme

příkaz použili pro ukončení celého programu.

Výstupní hodnoty kořenů vložíme do předformátovaných buněk listu analogic-

kým způsobem:

Obr. 3.11 – Vložení dat do listu

Při vkládání obsahu proměnné do buňky listu není třeba provádět žádná při-

způsobení, obsah se automaticky naformátuje stejně, jako bychom data do

buňky vkládali interaktivně.

Pro vložení tlačítka, spouštějícího program z listu, použijeme nabídku interak-

tivních formulářových prvků v záložce Vývojář:

Page 25: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

25

Obr. 3.12 – Vložení tlačítka pro spuštění programu

Vložené tlačítko lze přizpůsobit pomocí pravého tlačítka myši (umístění, veli-

kost, text na tlačítku).

Obr. 3.13 – Manipulace s tlačítkem

Nejdůležitější je však nastavení vazby mezi aktivací tlačítka a spuštěním po-

třebného programu:

Obr. 3.14 – Přiřazení podprogramu k události aktivace tlačítka

V zobrazeném formuláři vybereme program, který se má spustit (pokud by-

chom vytvořili v sešitu více programů, nabídnou se všechny). Uvedený postup

ve skutečnosti není nic jiného, než vytvoření vazby mezi událostní procedurou

Page 26: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

26

a událostí "kliknutí na tlačítko". V tomto případě se stane událostní procedurou

náš program.

3.3 Využití grafu pro prezentaci dat

Pro vizualizaci programově generovaných dat lze s výhodou využít nástroje

pro vytváření grafů. V rámci aplikačního modelu odpovídá grafu objekt třídy

Chart. Třída obsahuje vlastnosti a podobjekty, které umožňují programově

zkonstruovat všechny prvky grafu, nastavit popisky os, legendy apod. Většinou

je však zbytečné vytvářet graf programově. Pro zobrazení dat totiž používáme

většinou pouze jeden graf, který můžeme zkonstruovat v listu interaktivně a

programově přizpůsobíme pouze data, která jsou v grafu prezentována.

V našich programech budeme pracovat výhradně s bodovými X-Y grafy, tj.

takovými, které prezentují datové řady se dvěma částmi: řadou hodnot nezávis-

le proměnné X a řadou závisle proměnné Y:

Obr. 3.15 – Vložení bodového grafu do pracovního listu

Je výhodné vložit graf do téhož listu, v němž vkládáme parametry programu,

resp. spouštíme program tak, aby uživatel při prohlížení vypočtených dat ne-

musel přepínat mezi listy.

Při tvorbě grafu můžeme použít libovolnou oblast dat pro vytvoření potřebné

datové řady (může to být jediná buňka). Naše programy tuto oblast při svém

běhu automaticky aktualizují.

Po vložení grafu do listu je objekt grafu přístupný pomocí hierarchie

Worksheets(1).ChartObjects(1).Chart

neboli v listu je k dispozici kolekce grafů ChartObjects, s nimiž pracujeme

pomocí indexu (v případě jediného grafu v listu má index hodnotu 1). Samotný

graf (objekt Chart) je vlastností prvku této kolekce.

Page 27: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

27

Poznámka

Graf není přímo členem kolekce ChartObjects proto, že může být uložen také ve speciál-

ním samostatném listu sešitu (kolekce těchto listů se nazývá Charts). Pokud je graf uložen

samostatně, má poněkud jiné geometrické vlastnosti než v případě, že je jedním z vložených

grafů v pracovním listu.

V rámci objektu grafu budeme obvykle pracovat pouze s datovou řadou, která

je uložena jako prvek v kolekci SeriesCollections (datových řad může

být více) a má vlastnosti

Chart.SeriesCollections(1).XValues

Chart.SeriesCollections(1).Values

Chart.SeriesCollections(1).Name

První z nich označuje řadu hodnot nezávisle proměnné, druhý hodnoty závisle

proměnné (pozor, název této vlastnosti je Values, nikoli YValues). Třetí

uvedená vlastnost umožňuje změnit název datové řady, což se projeví v pří-

padné legendě grafu apod.

Hodnotu vlastnosti s obsahem datové řady lze zadat několika způsoby. Jedno-

duše lze použít rozsah buněk Range obsahující potřebná data. Např.

With Worksheets("vstup").ChartObjects(1).Chart.SeriesCollection(1)

.XValues = Worksheets("data").Range("A1:A" & i)

.Values = Worksheets("data").Range("B1:B" & i)

End With

V tomto případě graf v listu s názvem "vstup" použije data v listu "data" ve

sloupci A pro nezávisle proměnnou X a data ve sloupci B pro proměnnou Y

počínaje prvním řádkem pracovního listu. Počet bodů bude dán obsahem pro-

měnné i. Tento způsob použijeme v případě, že program předtím uvedené

sloupce naplnil relevantními hodnotami.

V roli hodnot datové řady lze však použít také pole, jehož prvky bude objekt

grafu automaticky považovat za hodnoty bodů v grafu. Jedná se o jeden z mála

případů, kdy lze pracovat s polem jako celkem:

Dim poleX(100) as Single, poleY(100) as Single

… naplnění prvků polí …

With Worksheets("vstup").ChartObjects(1).Chart.SeriesCollection(1)

.XValues = poleX

.Values = poleY

End With

Uvedený způsob je elegantní a rychlý – pokud program nemusí plnit obsah

listu, ušetří se množství času.

Poznámka

Bohužel, je tento postup omezený na malý rozsah polí (max. několik set prvků). Je to dáno tím,

že pole jsou grafu předávána v podobě textového řetězce seznamu hodnot, jehož délku tvůrci

aplikace omezili na 4096 znaků.

Pokud nechceme do grafu v listu interaktivně vkládat "prázdné" datové řady,

můžeme po vytvoření prázdného grafu (bez dat) použít metodu Add kolekce

SeriesCollection:

With Worksheets("vstup").ChartObjects(1).Chart

.SeriesCollection.Add Range("A1:B1")

.SeriesCollection(1).XValues = Worksheets("data").Range("A1:A" & i)

.SeriesCollection(1).Values = Worksheets("data").Range("B1:B" & i)

End With

Page 28: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

28

Příkazy automaticky přidají do grafu datovou řadu s irelevantním rozsahem dat

(uvedený rozsah buněk A1:B1 lze zvolit libovolně). Rozsah buněk (zdroj dat

pro graf) totiž vzápětí program přepíše na relevantní vypočtené hodnoty.

Page 29: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

29

4 Práce se soubory prostřednictvím FSO

Všechny programovací jazyky mají nástroje pro práci se složkami a soubory v

podobě nejrůznějších příkazů a knihoven. V prostředí VB jsou k dispozici pří-

kazy Open, Close, Seek apod., s jejichž pomocí lze pracovat se vstupně-

výstupními zařízeními a tedy i se soubory. Tento přístup je však z programá-

torského hlediska náročný, výhodnější je použít univerzální objektovou

knihovnu firmy Microsoft, poskytující mj. přístup k souborovému systému

počítače. Knihovna poskytuje objekt třídy FileSystemObject, jejíž model

umožňuje programově provádět prakticky všechny operace se systémem sou-

borů (vytvářet, rušit a kopírovat složky a soubory, číst, zapisovat a měnit jejich

atributy apod.). Zároveň lze na použití knihovny ilustrovat postup při používání

tzv. ActiveX komponent z prostředí VB.

Vytvořit objekt, který není součástí VB ani aplikace s vývojovým prostředím,

lze dvěma způsoby:

Způsob časné vazby (early binding)

Dim fso As FileSystemObject

Set fso = New FileSystemObject

Deklarujeme objektovou proměnnou patřičné třídy. Dále vytvoříme objekt (in-

stanci třídy) pomocí operátoru New, kterému předáme název třídy. Od této

chvíle lze s objektem a jeho vlastnostmi a metodami pracovat. Uvedený způsob

má však jednu nevýhodu: abychom mohli pracovat s knihovnou tříd, musíme ji

v prostředí VB zaregistrovat. V nabídce "Tools – References…" vyhledáme a

zatrhneme potřebnou knihovnu s názvem Microsoft Scripting Runtime podle

obrázku:

Obr. 4.1 – Registrace knihovny v prostředí VB pro práci s jejími objekty.

Page 30: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

30

Registrace se bohužel netýká sešitu, ale nastavení vývojového prostředí jako

celku. V příštích programech používajících knihovnu již nic registrovat nemu-

síme, ale pokud soubor s programy použije jiný uživatel, který knihovnu ve své

verzi registrovánu nemá, dojde k chybě.

Proto častěji používáme metodu zvanou pozdní vazba (late binding):

Dim fso As Object

Set fso = CreateObject("Scripting.FileSystemObject")

V tomto případě použijeme vestavěnou funkci VB CreateObject, která

vyhledá potřebnou knihovní třídu až při běhu programu, a poté vytvoří instanci

knihovního objektu stejně jako v případě včasné vazby. Knihovnu nyní již ne-

musíme registrovat a vše bude funkční i při přenosu souboru s aplikací na jiný

počítač. Malá nevýhoda je v tomto případě v zanedbatelném zpomalení a

v absenci kontextové nápovědy VB pro použité třídy knihovny (prostředí "ne-

ví", že v programu jsou použity knihovní objekty). Všimněme si také obecné

deklarace objektové proměnné, kterou lze použít, pokud třída objektu není v

době překladu k dispozici. Třídu FileSystemObject v deklaraci použít

nemůžeme, neboť nebyla zaregistrována.

Obě uvedené metody použití cizí knihovny nebo aplikace v programu VB lze

použít jen u produktů, které podporují technologii tzv. rozhraní Automation

(také ActiveX) – u produktů Microsoft jsou to prakticky všechny.

Třída FileSystemObject obsahuje jedinou vlastnost – kolekci připojených

svazků Drives. Kolekce má pouze vlastnosti Count a Item (jako všechny

dosud probírané kolekce). Prvky kolekce jsou dle očekávání objekty třídy

Drive, jejíž atributy popisují připojené disky, např.:

AvailableSpace – použitelný prostor na disku

DriveLetter – přiřazené písmeno disku

DriveType – typ disku (číselník rozlišující např. optický, síťový,

pevný disk apod.)

FileSystem – instalovaný souborový systém na disku (NTFS,

FAT32 apod.)

FreeSpace – volný počet bajtů

IsReady – logická hodnota určující, zda lze s diskem pracovat

SerialNumber – sériové číslo disku

ShareName – název síťového svazku v případě, že je připojen jako

sdílený

TotalSize – celková kapacita disku v bajtech

VolumeName – název disku

Page 31: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

31

Příklad

Obr. 4.2 – Využití objektu FileSystemObject pro výpis připojených disků

Program vypíše pro připojené a aktivní disky vybrané atributy a shromáždí je v

řetězci seznam, který nakonec zobrazí. Neaktivní disky je třeba při zjišťování

jejich vlastností vyloučit (pomocí atributu IsReady), jinak dojde k chybě za

běhu programu.

4.1 Metody pro práci se složkami a soubory

Spektrum metod třídy FileSystemObject je na rozdíl od jediného atributu

bohatší. Pomocí klávesy F2 si můžeme ve vývojovém prostředí zobrazit pro-

hlížeč objektů (object browser), který všechny metody objektu souhrnně uvádí

takto:

Page 32: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

32

Obr. 4.3 – Vlastnost a metody třídy FileSystemObject

Činnost většiny uvedených metod je zřejmá z jejich názvu. Strukturu jejich

základního použití znázorňuje následující tabulka:

Správa souborů a složek

CopyFile

MoveFile

DeleteFile

CopyFolder

MoveFolder

DeleteFolder

Vytvoření souboru a složky

CreateTextFile CreateFolder

Práce s existujícím souborem a složkou

GetFile GetFolder

Testy na existenci souboru a složky

FileExists FolderExists

Práce s textovým souborem

OpenTextFile

Page 33: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

33

Použití metod ozřejmíme na několika příkladech:

Kopírování souboru

Program ověřuje, zda soubor a cílová složka existují, potom vytvoří vlastní

kopii souboru. Metoda CopyFile má tři parametry: určení zdrojového soubo-

ru, určení cílové složky; třetí parametr určuje, zda bude přepsán soubor v cílo-

vé složce, pokud již existuje. Uvedeme-li hodnotu False u třetího parametru,

dostaneme při pokusu o další kopii téhož souboru do stejné cílové složky ná-

sledující chybové ukončení programu:

Program samozřejmě skončí chybou také v případě, že k operaci se soubory

chybí dostatečné oprávnění:

Při kopírování lze použít v názvech souborů rovněž zástupné znaky. Příkaz

fso.CopyFile "C:\pracovni\*.doc", "C:\dopisy\", True

zkopíruje všechny dokumenty ze složky pracovni do složky dopisy.

Uživatelské vkládání názvů souborů včetně cesty je pracné; později si ukážeme

komfortnější metodu výběru souboru či složky.

Page 34: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

34

Odstranění složky

Metoda DeleteFolder je značně destruktivní – odstraní složku i s případ-

nými soubory a podsložkami. Proto je v programu vložen jednoduchý dotaz na

potvrzení požadované operace. Konstanty VB modifikující funkci MsgBox

jsou vysvětleny v modulu CU01_M01.

4.2 Výběrový objekt třídy FileDialog

Pro uživatelsky komfortní výběr programu nebo složky máme k dispozici ob-

jekt třídy FileDialog, který je k dispozici ve všech aplikacích MS Office.

Při použití objektu se zobrazí standardní panel, v němž lze procházet souboro-

vým systémem počítače a vybrat požadovaný prvek. Výsledkem je kolekce

názvů souborů (resp. složek), které uživatel vybral (může označit i více prvků

než jeden). Pro vytvoření objektu použijeme metodu

Application.FileDialog(<typ panelu>)

která vrací požadovaný objekt (instance třídy FileDialog). Parametr určuje typ

panelu – k dispozici je číselník konstant:

msoFileDialogFilePicker – panel umožní vybrat soubor

msoFileDialogFolderPicker – panel umožní vybrat složku

msoFileDialogOpen – panel umožní otevření souboru

msoFileDialogSaveAs – panel umožní uložení souboru

Vytvořený objekt se zobrazí až při volání jeho metody Show, která vrátí logic-

kou hodnotu, zda uživatel výběr provedl, nebo stiskl tlačítko "Storno" (resp.

"Cancel").

Po provedení výběru panel na obrazovce zanikne, ale objekt je dále k dispozici

a názvy vybraných souborů (resp. složek) jsou včetně cesty uloženy v kolekci

SelectedItems.

Použití objektu je zřejmé z následujícího příkladu:

Page 35: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

35

Po vytvoření objektu fd můžeme nastavit jeho vlastnosti. V této fázi objekt

ještě není zobrazen, jeho rozkreslení provede až metoda Show. Program nyní

čeká na výběr souborů uživatelem a pokračuje až po uzavření panelu. Po pře-

vzetí názvů vybraných souborů můžeme objekt zrušit (v paměti existuje, i když

není žádný panel zobrazen) – šetříme tím zdroje (paměť) počítače.

Obr. 4.4 – Panel objektu FileDialog

Obr. 4.5 – Procházení kolekce SelectedItems

Page 36: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

36

4.3 Zápis a čtení dat ze souboru

Programové čtení dat ze souboru použijeme zejména při zpracování textových

dat z různých typů automatizovaných měření apod. Prostředí VB není příliš

vhodné pro přímou práci s binárními soubory – tam používáme spíše aplikace,

v nichž byly souboru vytvořeny.

Abychom mohli s textovým souborem pracovat, musíme ho nejdříve vytvořit

nebo otevřít (pokud existuje). K tomu používáme metodu CreateTextFi-

le, resp. OpenTextFile třídy FileSystemObject. Obě metody vyža-

dují jako parametr název otevíraného souboru a vracejí nový objekt třídy

TextStream, který obsahuje potřebné nástroje pro práci s textovým soubo-

rem. V našich úlohách budeme potřebovat následující metody tohoto objektu:

Read – přečte ze souboru zadaný počet znaků

ReadLine – přečte ze souboru jeden řádek

Write – zapíše do souboru zadaný počet znaků

WriteLine – zapíše do souboru jeden řádek

Close – uzavře soubor

Z vlastností objektu použijeme pouze AtEndOfStream – logická hodnota

vyjadřuje, zda jsme při čtení dosáhli konec souboru.

Příklad vytvoření souboru a vložení znaků do souboru:

Vidíme, že metoda CreateTextFile má ještě další parametr s logickou hodno-

tou. Hodnota True povolí přepsání souboru, pokud vytváříme soubor se jmé-

nem, které už v dané složce existuje.

Metoda soubor vytvoří a otevře – nyní do něj lze zapisovat znaky metodami

Write nebo WriteLine. Metoda WriteLine se od metody Write liší

pouze tím, že za vložené znaky přidá ještě znak konce řádku (již zmiňovaná

konstanta vbCrLf).

Po ukončení zápisu musíme soubor zavřít metodou Close. V opačném přípa-

dě riskujeme, že po ukončení programu zůstane soubor poškozený.

Pokud program v pořádku proběhne, nalezneme v patřičném adresáři nový

soubor, jehož obsah si můžeme prohlédnout libovolným textovým editorem.

Programové čtení souboru provedeme podle následujícího příkladu:

Page 37: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

37

Program načítá jednotlivé řádky ze souboru a zapisuje jejich obsah do buněk

v prvním sloupci listu. Vlastní čtení ze souboru probíhá následovně: metoda

ReadLine přečte znaky ze souboru až po řídící znak nového řádku (vbCrLf).

Při dalším volání metody ReadLine pokračuje čtení od tohoto znaku dále.

Soubor si tedy udržuje informaci o počtu přečtených znaků a volání metody

ReadLine vždy pokračuje ve čtení dalších znaků od této pozice. Atribut

AtEndOfStream objektu informuje, zda jsme při čtení již dosáhli konce

souboru. Pokud bychom se po dosažení konce souboru pokusili o další volání

metody ReadLine, dojde k chybě.

Alternativní méně užívané metody Read (resp. Write) vyžadují jako parame-

tr číslo určující počet přečtených znaků.

Page 38: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

38

5 Důležité objekty aplikace MS Word

Vývojové prostředí VB je k dispozici rovněž v aplikaci MS Word. Objektový

model textového procesoru je pochopitelně odlišný od MS Excel, určité logické

souvislosti zde nicméně nalezneme. Na vrcholu hierarchie pod objektem Ap-

plication je zde kolekce dokumentů Documents se zcela obdobnými

vlastnostmi a metodami, jako má kolekce sešitů Worksheets v aplikaci MS

Excel. Prvky této kolekce tvoří objekty třídy Document. V rámci dokumentu

hraje stejně jako v Excelu důležitou roli objekt třídy Range – tentokrát však

neodpovídá množině buněk, ale spojité oblasti znaků. Kromě toho máme k

dispozici důležité kolekce odstavců (Paragraphs), vět (Sentences), slov

(Words) a znaků (Characters). Aplikace si pochopitelně vytváří uvedené

kolekce podle oddělovacích znaků – v případě odstavců je oddělovačem znak

nového řádku, v případě vět tečka, v případě slov mezera (resp. čárka, tečka

apod.).

Programová práce v rámci zpracování textů není tak častá jako v případě sešitů

tabulkových kalkulátorů, někdy je však užitečná a může ušetřit hodiny času

zejména při speciálních úpravách rozsáhlých dokumentů.

Použití si ukážeme na několika jednoduchých příkladech, komplexnější pro-

gram nalezne čtenář v modul CU01_M03.

Většinu programových změn v dokumentu provádíme tak, že nejprve vybere-

me oblast znaků Range, s níž pak provedeme zamýšlené operace.

Objekt třídy Range lze vytvořit mnoha způsoby. Nejjednodušeji lze použít

metodu Range(<Start>,<End>) třídy Document (všimněme si poly-

morfismus stejného názvu, označujícího jak třídu Range, tak metodu vedoucí

k její instanci):

Dim oblast As Range

Set oblast = ActiveDocument.Range(0, 100)

Rozsah oblasti v dokumentu zde definujeme počáteční a koncovou pozicí zna-

ků, které vytvoří danou oblast.

Poznámka

Objekt ActiveDocument zde označuje aktivní dokument aplikace. Objekt třídy Document

lze samozřejmě zpřístupnit i pomocí kolekce, například:

Documents("mujDokument.docx"), Documents(1) apod.

Vytvořit instanci Range lze také pomocí prvků kolekce odstavců:

Set oblast = ActiveDocument.Paragraphs(1).Range

V tomto případě ovšem identifikátor Range neznamená metodu, ale objekt,

který zahrnuje celý první odstavec dokumentu.

Zmíněné kolekce vět, slov, znaků lze použít v rámci oblasti např. takto

Dim oblast As Range, slovo As Range

Set oblast = ActiveDocument.Paragraphs(2).Range

Set slovo = oblast.Words(2)

Page 39: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

39

Vidíme, prvky kolekce slov (jako i dalších výše uvedených kolekcí) jsou přímo

objekty typu Range. Výběr druhého slova v druhém odstavci lze samozřejmě

provést také přímo příkazem

Set oblast = ActiveDocument.Paragraphs(2).Range.Words(2)

(bez vytváření objektu odstavce).

5.1 Vybrané postupy programování textu

Třída Range obsahuje množství vlastností a metod, jejich použití ilustrují ná-

sledující příklady:

Sub triOdstavce()

Dim oblast As Range

Set oblast = ActiveDocument.Range( _

ActiveDocument.Paragraphs(1).Range.Start, _

ActiveDocument.Paragraphs(3).Range.End)

oblast.Font.Name = "Times New Roman"

oblast.Font.Italic = True

oblast.Font.Size = 12

End Sub

Pro definici oblasti jsme zde využili vlastnosti Start a End třídy Range,

které obsahují aktuální pozici začátku a konce objektu této třídy. Z pozice za-

čátku prvního odstavce a konce třetího odstavce jsme tedy zkonstruovali novou

oblast třídy Range. Z objektu oblasti využijeme podobjekt Font, jehož vlast-

nosti určují formát písma podle příkladu.

Analogií třídy Font pro nastavení vlastností písma je třída ParagraphFor-

mat určena pro nastavení vlastností odstavce (např. řádkování, zarovnání,

ohraničení, stínování apod.):

Sub formatOdstavce()

Dim oblast As Range

Set oblast = ActiveDocument.Paragraphs(1).Range

oblast.ParagraphFormat.Alignment =

wdAlignParagraphCenter

oblast.ParagraphFormat.SpaceBefore = 12

End Sub

Uvedený příklad zarovná první odstavec na střed a před první řádek vloží ver-

tikální odsazení 12 bodů (pointů).

V rámci dokumentu lze programově pracovat ještě s jedním typem oblasti, kte-

rý reprezentuje výběr při interaktivní práci. Odpovídající třída Selection

má podobné vlastnosti jako Range, lze ji dále použít pro kopírování, vkládání

a jiné operace prováděné pomocí schránky (clipboard) – obsahuje metody Co-

py, Cut a Paste, jejichž použití je zřejmé.

Jak ve třídě Range, tak i Selection je k dispozici vlastnost Text, která

zhruba odpovídá vlastnosti Value, s níž jsme pracovali dříve. Jedná se o tex-

tový obsah oblasti:

Page 40: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

40

Sub obsahVyberu()

MsgBox "Vybraný text: " & Selection.Text

End Sub

V jednoduchém případě lze tuto vlastnost použít pro změnu obsahu oblasti

prostým přiřazením:

Selection.Text = "toto je text vložený programem"

Vybraný text je pak programem nahrazen textem na pravé straně přiřazení.

Častěji se však pro dynamické vložení textu do dokumentu používají metody

InsertBefore(<řetězec>) a InsertAfter(<řetězec>), které

definovanou oblast rozšíří na začátku, resp. na konci o zadaný text v podobě

parametru. Formátování v oblasti se zachová.

Následující příklad před každý odstavec vloží řádek s obsahem §n, kde n je

číslo odstavce:

Sub vlozPredOdstavce()

Dim odstavec As Paragraph

Dim i As Integer

i = 0

For Each odstavec In ActiveDocument.Paragraphs

i = i + 1

odstavec.Range.InsertBefore ("§" & i & vbCrLf)

Next

End Sub

Velmi krátkým programem jsme dosáhli úpravy dokumentu, která by se manu-

álně prováděla pracně. Výsledek běhu programu je změněný dokument, který

lze dále běžně upravovat včetně programem vložných částí.

Navzdory různým metodám automatických oprav v aplikaci MS Word je často

jednodušší vytvořit program řešící náš problém přesně tak, jak potřebujeme.

Následující program odstraní krátké sekvence znaků na konci řádku (např.

osamělé předložky):

Sub osamelePredlozky2()

Dim slovo As Range, znak As Range,

Dim obsah As String, delka As Integer

For Each slovo In Selection.Words

delka = slovo.End - slovo.Start

If delka <= 3 Then

Set znak = slovo.Characters(delka)

If slovo.Text <> ". " _

And slovo.Text <> ", " _

Page 41: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Objektové modely

41

And znak.Text = " " Then

znak.Text = ChrW(160)

end if

End If

Next

End Sub

Program pracuje následovně: ve vybraném textu prochází jednotlivá slova (ko-

lekce Words). Délku slova stanoví jako rozdíl poslední a první pozice oblasti

slova. Jestliže je slovo kratší než tři znaky, nahradí mezeru za slovem pevnou

mezerou (kód 160). Na takové mezeře pak MS Word řádek nezalamuje, tj. slo-

va před tímto druhem mezery nebudou stát na konci řádku. Oblast posledního

znaku slova nalezneme snadno pomocí kolekce Characters (vlastnost kaž-

dé oblasti), jejíž poslední prvek má zřejmě index s hodnotou delka. Poslední

podmíněný příkaz je založen na následující konstrukci: součásti slova (prvku

kolekce Words) je i oddělovací znak ukončující slovo, většinou tedy mezera.

Tato mezera je oním posledním znakem, jehož hodnotu vyměníme za kód ne-

zlomitelné mezery. Bohužel, tvůrci aplikace za další slovo považují i inter-

punkci (čárka, tečka, středník apod.). Za tato "slova" pochopitelně pevnou me-

zeru dávat nesmíme.

5.2 Použití objektového modelu z jiné aplikace

Občas je výhodné využít známý objektový model i z jiné aplikace, která má

objektový model jiný. Používáme přitom obvykle postup pozdní vazby (použili

jsme ho již v objektu FileSystemObject). Předpokládejme, že potřebuje-

me v programu v prostředí MS Excel načíst věty z textového dokumentu a vlo-

žit je do série buněk v listu. Implementace řešení problému může být následu-

jící:

Sub CtiVety()

Dim nazev As String, i As Integer

Dim mujWord As Object, mujDokument As Object

Dim slovo As Object

nazev = InputBox("zadej název dokumentu .docx")

Set mujWord = CreateObject("Word.Application")

mujWord.Visible = True

Set mujDokument = mujWord.Documents.Open _

(Filename:=nazev, ReadOnly:=True)

i = 0

For Each veta In mujDokument.Sentences

i = i + 1

Worksheets(1).Cells(i, 1).Value = veta.Text

Next

mujDokument.Close

mujWord.Quit

Set mujDokument = Nothing

Set mujWord = Nothing

End Sub

Page 42: INFORMATIKA IIlences.cz/domains/lences.cz/skola/subory/Skripta/CU51-Algoritmizace... · prostředí VBA. Doba potřebná ke studiu Je velmi individuální podle znalostí čtenáře.

Informatika • Modul 01 • Algoritmizace a programování

42

V programu vytvoříme instanci aplikace MS Word metodou pozdní vazby:

Set mujWord = CreateObject("Word.Application")

Objekt mujWord nyní zastupuje spuštěnou aplikaci, kterou v této fázi nalez-

neme rovněž v seznamu procesů operačního systému.

Celá aplikace může být spuštěna ve skrytém režimu, tj. není zobrazeno žádné

okno ani jiný viditelný vizuální prvek. Pokud však chceme vidět, jak náš pro-

gram funguje, nastavíme atribut Visible objektu na hodnotu True.

Potřebný dokument otevřeme metodou Open kolekce Documents:

Set mujDokument = mujWord.Documents.Open(nazev)

kde parametr nazev obsahuje název souboru včetně cesty. (Pro jeho komfort-

nější zjištění lze použít objekt FileDialog – viz dříve.)

Bezpečnostní bariéry nám však obvykle povolí programově otevřít dokument

pouze v režimu "jen pro čtení" (Read Only). K tomu se zobrazí panel žádající o

povolení operace. Pokud spustíme aplikaci ve skrytém režimu, nevidíme ani

okno s dokumentem ani panel, přesto bude aplikace čekat na odpověď uživate-

le. Abychom se těmto problémům vyhnuli, otevřeme dokument přímo v režimu

pro čtení:

Set mujDokument = mujWord.Documents.Open _

(Filename:=nazev, ReadOnly:=True)

Metoda Open má množství parametrů, proto použijeme jejich názvy, abychom

mohli naplnit pouze požadované hodnoty.

Ostatní příkazy programu jsou již snadno pochopitelné, procházíme kolekci vět

v dokumentu a jejich obsah ukládáme do patřičných buněk listu. Nakonec uza-

vřeme dokument metodou Close a ukončíme aplikaci metodou Quit. Objek-

tové proměnné uvolníme přiřazením klíčového slova Nothing (není nezbyt-

né, ale programátoři se snaží nic neponechat náhodě).


Recommended