← Počítač

Visual Basic for Applications,
VBScript
(Visual Basic – Scripting Edition)

David Zbíral

Ediční poznámka

Tento materiál není vyváženou učebnicí jazyků či „dialektů“ Visual Basic for Applications a VBScriptu. Mnoho věcí vynechává, obsahuje velmi nestejně propracované části a asi taky nějaké chyby, včetně chyb v terminologii, a taky různá svědectví o tom, co jsem uvést do chodu nedokázal. Pro podrobnější seznámení je dobré nahlédnout do specializovaných knih, například těch, které se uvádějí níže v Použitých zdrojích.

Pokud nějaké chyby jakéhokoli rázu najdete, dejte mi prosím vědět.

Materiál není rozdělen na části o různých edicích VB (VBA, VBS), protože jejich jádro je společné. U některých postupů se výslovně uvádí, které edice se týkají. Když něco, o čem píši, že to jde, nefunguje, tak se to dost možná týká jiné edice VB.

Někde uvádím jako syntaxi něco, co ve skutečnosti není vypsáno ve své nejobecnější podobě, např. řeknu, že syntaxe je fso.MoveFolder zdroj, cíl, místo abych vypisoval syntaxi objekt.MoveFolder zdroj, cíl s poznámkou, že se za objekt dosazuje vždy identifikátor objektu FileSystemObject.

Licence

Tento materiál ani jeho části není dovoleno převzít a publikovat jinde (např. na jiných stránkách, na CD doprovázejících časopisy o počítačích apod.) bez předchozího výslovného svolení autora. Vztahují se na něj omezení uvedená v příslušné kapitole stránky O těchto stránkách a všechna jiná, která vyplývají z mezinárodního práva a zákonů jednotlivých zemí. Lze si pořídit jeho kopii (uložit si jej), pro vlastní potřebu vytisknout atd., ale ne jej jakkoli distribuovat či publikovat. Totéž se týká i kódů maker a skriptů.

Základní a obecné informace

Doprovodná makra a skripty ke stažení

Desítky mých maker jsou ke stažení zde. Ledacos se z nich pochopí a tvoří doprovodný materiál k tomuto dokumentu; na makra se v dalším textu příležitostně odkazuje. Kromě toho jsou mnohá z nich široce využitelná, takže vám mohou ušetřit práci.

Skripty ve VBS (zčásti moje, zčásti převzaté z jedné přílohy časopisu PCWorld a mnou upravené) najdete tady. Vedle své praktické funkce mohou rovněž posloužit jako výukové ukázky. Podrobné komentáře jsou přímo v kódu těchto skriptů, stručné anotace jsou na základní stránce Počítač.

Editory

Obecná poznámka

Editor jazyka Visual Basic

Konvence zápisu, komentáře

Skriptovací stroj

Spouštění skriptů a maker

Spouštění skriptu ve Windows

Spouštění a běh makra (VBA)

Různé

Události ve Wordu

Kam kód napsat a jak ho upravovat?

Terminologie

Objekty, metody a vlastnosti

Obecné informace

Objekt Wscript: vlastnosti a metody

Objekt Wscript.Shell: spouštění programů, otvírání souborů aj.

Operátory

Zástupné znaky

Proměnné

Různé

Ověřování či zjišťování hodnoty a datového typu proměnné (IsArray, IsEmpty apod.)

Konstanty

Datové typy

Řetězce

Různé

Konverzní funkce

Řetězcové konstanty

Znaky: Chr, ChrW

Konkrétní tipy a triky týkající se řetězců

Úsporný zápis nahrazení řetězců přes Replace: užití pole

Následující příklad ukáže, jak lze nahrazování většího počtu položek v řetězci zapsat do kódu úsporně pomocí pole. O polích se dovíte víc v kapitole Pole.

 

knahrazeni = Array("cosi|něco jiného", "cosi2|něco jiného2") 'Sem si naskládejte jakékoli řetězce; před znak | dejte vždy to, co se má nahradit, za znak dejte, čím se to má nahradit.
For i = 0 To UBound(knahrazeni)
    Polozka = knahrazeni(i)
    oddelovac = InStr(Polozka, "|")
    co = Left(Polozka, oddelovac - 1)
    zaco = Mid(Polozka, oddelovac + 1)
    Retezec = Replace(Retezec, co, zaco)
Next

 

Tento kód lze využít i k nahrazení zpátky, stačí prohodit proměnné co a zaco.

Pole

Kolekce

Kolekce obecně

Zabudované kolekce

Cykly a podmínky

Obecné a základní informace

Do ... Loop

While ... Wend

If ... Then ... ElseIf ... Else ... End If

Select Case

For ... Next, For Each ... Next

With ... End With

Podprogramy (procedury a funkce)

Procedury

Funkce

Nevestavěné funkce

Vestavěné funkce

Volání funkcí a procedur a předávání argumentů

Rekurze

Datum a čas

Matematické operace

Běh skriptu či makra

Ladění, testování, odstraňování chyb

Chyby

Komunikace s uživatelem: získávání informací, informační a chybová hlášení, MsgBox

Vestavěné funkce

Formuláře ve VBA

Textový soubor: načítání, vytváření, zapisování atd.

Správa souborů: práce se soubory, adresáři a disky

Základní informace a postupy

Disky

Adresáře (složky)

Soubory

Zástupci

Registr Windows

Prostředí

Spolupráce makra s prostředím a různými aplikacemi

Přepínání klávesnice

Programy, okna aplikace (spouštění, aktivace, ukončení, stav okna)

SendKeys: posílání sekvence kláves libovolné aplikaci

Word a dokumenty Wordu

Úvodní informace

Otevření a zavření Wordu, Word jako objekt

Dokumenty: otvírání, ukládání, zavírání atd.

Okna wordovských dokumentů

Dialogová okna Wordu

Přesun po dokumentu

Načítání z dokumentu do proměnných

Schránka

Psaní a úprava textu

Formátování textu, styly

Kontrola pravopisu

Tabulky

Hledání a nahrazování: vlastnost Find (Selection.Find apod.)

Řádky, stránky, statistika dokumentu

Excel

Internet Explorer a skriptování na straně klienta

Různé

Navigace, historie

Události

Objektový model Internet Exploreru

Objekt Document

HTML: VBA užívaný pro přípravu stránek k publikaci (z Wordu, Excelu...)

Tipy, triky a řešené příklady

Odkazy na další materiály

Automatické zavření dialogu po určité době

Sub AutoReply()
'Výuková ukázka na automatickou odpověď po 3 vteřinách čekání.
'Přes MsgBox to ve VBA 6 nejde, tak použijeme Wscript. DZ.
Set wshshell = CreateObject("Wscript.Shell")
Odpoved = wshshell.Popup("Máte rádi čokoládu?", 3, "Dotaz", 4 + 32)
Select Case Odpoved
Case -1
    MsgBox "Mlčení po dobu tří sekund znamená souhlas."
Case 6
    MsgBox "Já taky."
Case 7
    MsgBox "Vida, nemáte."
End Select
End Sub

Abecední seřazení prvků pole

Následující příklad je převzat s drobnými změnami z knihy Kocich, Pavel – Gürtler, Martin, 1001 tipů a triků pro Visual Basic, s. 308-309.

 

Public Function AbecedníSeřazeníPole(pole, Optional l, Optional r)
'Provede abecední seřazení pole a vrátí je v seřazené podobě.
'VB ale neřadí správně podle české abecedy; "z" je pro něj menší než "ř" či "é".

'Převzato s malými změnami z knihy Kocich, Pavel - Gürtler, Martin,
'1001 tipů a triků pro Visual Basic, 308-309.
'DZ dodal optional, aby nebylo nutné l a r posílat; pokud chybí, je přiřazeno.

'Kontrola, zda jde o pole.
If Not IsArray(pole) Then
    MsgBox "Nejde o pole."
    Exit Function
End If
If IsMissing(l) Then l = LBound(pole)
If IsMissing(r) Then r = UBound(pole)
i = l
j = r
x = pole((l + r) / 2)
Do
Do While pole(i) < x
    i = i + 1
Loop
Do While pole(j) > x
    j = j - 1
Loop
If i <= j Then
    tmp = pole(i)
    pole(i) = pole(j)
    pole(j) = tmp
    i = i + 1
    j = j - 1
End If
Loop Until i > j
If l < j Then Call AbecedníSeřazeníPole(pole, l, j)
If i < r Then Call AbecedníSeřazeníPole(pole, i, r)
End Function

 

K testování se může hodit tento kód:

Sub zk()
pole = Array("a", "x", "c", "b", "1", "2", "*")
Call AbecedníSeřazeníPole(pole)
souhrnpole = Join(pole, "")
MsgBox souhrnpole
End Sub

 

Následuje jiné řešení. Původní autor mi není znám. Kombinuje dva druhy řazení – podle abecedy a podle frekvence výskytu slova (vybere si uživatel v předchozím, zde neuvedeném kódu). Komentáře označené DZ jsem doplnil já. Řešení je o něco pomalejší. Ale při použití v jednom z mých maker fungovalo dobře, kdežto předchozí řešení řadilo trochu defektně (možná kvůli nějaké mé chybě).

'ABECEDNÍ SEŘAZENÍ
'DZ abecední seřazení slov. k = j. l je slovo následující. Každé slovo
'DZ porovnáváme se všemi ostatními slovy (j = 1 to WordNum - 1).
'DZ potom přeřadíme slovo na jiné místo: pokud splňuje tu složitou podmínku,
'DZ tak se posouvá jinam, výš: je rovno l, tj. posouvá se o místo nahoru (snad).
'DZ Pokud se podmínka nesplní, tak zůstává na svém místě.
For j = 1 To WordNum - 1
    k = j
    For l = j + 1 To WordNum
    'DZ pokud (nebylo nastaveno řazení podle frekvence a následující slovo
    'DZ je menší než toto slovo) nebo (se řadí podle frekvence a frekvence
    'DZ následujícího slova je větší než frekvence zpracovávaného slova)
    'DZ tak udělej první krok k přeřazení indexů zpracovávaného a následujícího
    'DZ slova v poli Words: tímto prvním krokem je "k = l".
    'DZ viz níže, jak se s tím dál pracuje. Protože cyklus probíhá se všemi
    'DZ následujícími slovy (l = j + 1 To WordNum), je to úspornější
    'DZ než kdyby se porovnávalo v tomto cyklu For ... Next jen s jedním
    'DZ následujícím slovem. Zaráz se prostě porovná se všemi následujícími
    'DZ slovy a l a j se popřehazují.
    If (Not ByFreq And Words(l) < Words(k)) Or (ByFreq And Freq(l) > Freq(k)) Then     k = l
Next l
'DZ pokud se podmínka splnila (a tudíž k <> j), tak dojde k posunu
'DZ v pořadí. Zpracovávané slovo j se posune o 1 výš (na místo k) a "k" se
'DZ položí jako rovné zpracovávanému slovu ("j"), tj. si prohodí index v poli
'DZ Words. Předají si také svoje frekvence, pochopitelně: frekvence se musí
'DZ přeřadit taky, jinak by neodpovídala.
If k <> j Then
    tword = Words(j)
    Words(j) = Words(k)
    Words(k) = tword
    Temp = Freq(j)
    Freq(j) = Freq(k)
    Freq(k) = Temp
End If
StatusBar = "Sorting: " & WordNum - j
Next j

Použití dialogového okna Procházení k výběru souboru

Cestu k souborům lze od uživatele získávat přes InputBox. Uživatelsky mnohem příjemnější je však použít klasický dialog Procházení. Zde je postup (velký dík jednomu čtenáři) – který ale nefunguje v Office 2000, zřejmě je použitelný až v novějších verzích:

Sub UseFileDialogOpen()
    Dim lngCount As Long
    ' Open the file dialog
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        .Show
        ' Display paths of each file selected
        For lngCount = 1 To .SelectedItems.Count
          MsgBox .SelectedItems(lngCount)
        Next lngCount
    End With
End Sub

Jak otevřít adresář v Průzkumníkovi

To je snadné. Stačí mít objekt Wscript.Shell a užít jeho metodu Run. Adresu lze samozřejmě zadat i v podobě proměnné.

Set ws = CreateObject("Wscript.Shell")
ws.run ("explorer.exe /n, C:\Program Files\")

Jak otevřít Internet Explorer a někam se dostat

Set ie = CreateObject("InternetExplorer.Application")
ie.navigate ("http://www.david-zbiral.cz")
ie.visible = True

Lze použít proměnnou: ie.navigate(cesta). Funguje to i na diskové cesty. Použití ukazuje např. můj stahovač stránek z internetu, který najdete mezi skripty. Pozorně si přečtěte komentáře skriptu; používáte jej výhradně na vlastní nebezpečí.

Jak vypisovat do okna Internet Exploreru

Nový dokument v IE (kam např. ze skriptu posíláme výpis souborů), otevřeme následovně:
Set ie = CreateObject("InternetExplorer.Application")
ie.navigate ("about:blank")
ie.visible = True

Vypisování do okna IE: navážeme např. následovně: ie.document.body.innerHTML="<p id='vystup'>" a pak průběžně vypisovat začleněním řádku ie.document.all.vystup.insertAdjacentHTML "BeforeEnd", promenna do funkce, která přidává nové prvky (například načítá názvy souborů a ukládá je do proměnné promenna).

Místo "beforeEnd" se může někdy hodit dát "afterBegin".

Kontrola, zda zadaná cesta existuje

Procedura, které se předá cesta a ona zkontroluje, zda tato cesta existuje. Pokud ne, vyžádá si od uživatele novou přes InputBox.

 

Sub kontrola(cesta)
If cesta = "" Then
    wscript.echo "Cesta nebyla zadána. Skript se nyní ukončí."
    wscript.quit
End If
If Not fso.FolderExists(cesta) Then
    cesta = InputBox("Adresář neexistuje. Zadejte jinou cestu:")
    Call kontrola(cesta)
End If
End Sub

Výpis do souboru HTML

Vytvořit dokument HTML, do kterého se např. mohou vypsat výsledky prohledávání složek na disku, pěkně přehledně a barevně, je snadné: použijí se postupy tvoření textového souboru a zapisování do něj:
Set txt = fso.CreateTextFile(fso.BuildPath(cesta, nazev & ".html", True))
txt.WriteLine("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"">")

atd., pokračujeme dále podle potřeby. Samozřejmě že je možné použít pevný název a cestu; zde jsou použity proměnné.

Otevření souboru v Poznámkovém bloku

Pokud jde o soubor takové přípony, která je asociována s Poznámkovým blokem, stačí užít prostě metodu Run objektu Wscript.Shell:

Set ws = CreateObject("Wscript.Shell")
ws.run ("C:\test.txt")

Pokud tomu tak není, tak je potřeba dát:

Set ws = CreateObject("Wscript.Shell")
ws.run ("notepad C:\test.tmp")

Následující příklad otvírá právě běžící skript, v němž je tento postup zařazen, v Poznámkovém bloku:

Set ws = CreateObject("Wscript.Shell")
ws.run ("notepad " & Wscript.ScriptFullName)

Výpis do textového souboru a jeho otevření v Poznámkovém bloku

Následující příklad ukazuje, jak zobrazit uživateli výstup přes Poznámkový blok, ale zároveň soubor smazat, aby zbytečně nezůstával na disku. Uživatel si může výstup sám uložit či někam zkopírovat přes schránku. WriteLine lze samozřejmě zařadit do cyklu a výstup rozšiřovat postupně.

Set fso = CreateObject("Scripting.FileSystemObject")
tempdir = fso.GetSpecialFolder(2)
tempname = fso.GetTempName
tempfile = fso.BuildPath(tempdir, tempname)
Set txt = fso.CreateTextFile(tempfile)
txt.WriteLine "Výstup skriptu."
Set txt = Nothing
Set ws = CreateObject("Wscript.Shell")
ws.run ("notepad " & tempfile)
wscript.sleep 5000
Kill tempfile

Zkratky

API

Application Programming Interface

FSO

FileSystemObject

IE

Internet Explorer

MS

Microsoft

VB

Visual Basic

VBA

Visual Basic for Applications

VBS

Visual Basic – Scripting Edition (VBScript)

WSH

Windows Script Host

Použité zdroje

Níže uváděné zdroje pochopitelně nezodpovídají za chyby tohoto dokumentu. Velká část textu vznikla vlastním testováním.

Někde výslovně uvádím, že zdrojem jsou moje testy („testoval DZ“ a podobné poznámky). Neznamená to pochopitelně, že ostatní části dokumentu nepocházejí ode mě; je to jen poznámka, která příležitostně naznačuje, že jsem to opravdu vyzkoušel (uvádím to často mimo jiné u překvapivých výsledků).

Mezi zdroje je třeba zahrnout různá makra získaná v časopisech, na internetu aj.

Za cenné rady děkuji Petru Pecháčkovi a Miroslavu Babinskému.

 

Aitken, Peter G., Windows Script Host 1.0. Dávkové soubory pro Windows, Grada Publishing, Praha 2001.

Kocich, Pavel – Gürtler, Martin, 1001 tipů a triků pro Visual Basic, Computer Press, Praha 2000.

Kol., Nápověda pro Microsoft Visual Basic, in: Microsoft Office 2000.

Kol., VBScript. Průvodce vývojáře, UNIS Publishing, Brno 2000.

Kvoch, Martin – Pokorný, Jan, Programování ve Visual Basicu 5.0, Kopp, České Budějovice 1999.

PC World.


Publikování této verze: 28. 2. 2011 15:42

Sepsání: průběžně 2002-2004

Poslední celková revize: červenec 2004

Počet normostran (v přepočtu): 109

Počet slov: 29385

Umístění: http://www.david-zbiral.cz/vb.htm



[1] Kol., VBScript. Průvodce vývojáře, UNIS Publishing, Brno 2000, s. 29-30.

[2] Martin Kvoch – Jan Pokorný, Programování ve Visual Basicu 5.0, s. 11, 14.

[3] Property = vlastnost: vysouzeno spolehlivě z knihy 1001 tipů a triků pro Visual Basic a z nápovědy: co zve nápověda „property“, zve kniha „vlastností“.

[4] To uvádí nápověda. Někde se nepřesně uvádí, že je to proměnná, jejíž obsah zůstane zachován i po skončení procedury či funkce: to sice platí, ale jen tehdy, když je takováto procedura či funkce součástí vyššího celku, například skriptu; ve wordovských makrech to naopak neplatí.

[5] Podle Martin Kvoch – Jan Pokorný, Programování ve Visual Basicu 5.0, s. 49, s mírnými úpravami a doplněními, a nápovědy pod „User-defined Data Types“.

[6] Modifikace, která nepracuje s ASCII, nýbrž s bajty; má význam hlavně u národních prostředí s dvoubajtovou tabulkou znaků (Martin Kvoch – Jan Pokorný, Programování ve Visual Basicu 5.0, s. 128), což není případ češtiny ani angličtiny. Délka je tu v bajtech a vstupní řetězec je v ANSI.

[7] Jedna úroveň závorek je nadbytečná, protože rovnítko se standardně vyhodnocuje dřív než logické operátory.

[8] Pavel Kocich – Martin Gürtler, 1001 tipů a triků pro Visual Basic, Computer Press, Praha 2000.

[9] Martin Kvoch – Jan Pokorný, Programování ve Visual Basicu 5.0, s. 183.

← Počítač