VBA a Microsoft Office Word-ben Bevezetés A gyakran használt műveletek segítésére használhatunk makrókat a Microsoft Office Word alkalmazásban, ezáltal automatizálhatjuk ezeket a műveleteket. A makró parancsok és utasítások sorozata, amelyeket egy konkrét művelet automatikus végrehajtására egyetlen paranccsá fűz össze. Néhány probléma, amit könnyen megoldhatunk makrók használatával: •
Az ismétlődő szerkesztési és formázási feladatok meggyorsítása
•
Több parancs egyesítése: például adott méretű, szegélyű, sor-, és oszlopszámú táblázat beszúrása
•
Párbeszédpanel-beállítás elérésének megkönnyítése
•
Bonyolult feladatsor elvégzésének automatizálása
Kétféleképpen készíthetünk makrókat: a műveletsort leírhatjuk a makró rögzítővel, vagy készíthetünk teljesen új makrót a Visual Basic Editor programban, Visual Basic nyelven megírva. A makrók szerkesztéséhez először a Fejlesztőeszközök lapot kell megjelenítenünk. Ezt a következőképpen tehetjük meg, a Microsoft Office gombra kattintunk, ezen belül A Word beállításai gombra, majd a Népszerű elemek fülre. Az Alapvető beállítások a Word használatához csoportban jelöljük be a Fejlesztőeszközök lap megjelenítése a szalagon jelölőnégyzetet. Ha ezt megtettük a következő lap jelenik meg a Microsoft Office Word-ben:
Mint már korábban említettem makró rögzítővel és Visual Basic Editorral hozhatunk létre makrókat. Most az utóbbival fogunk részletesen foglalkozni. A Visual Basic Editort kétféleképpen nyithatjuk meg, az egyik lehetőség a Fejlesztőeszközök lap bal első ikonjára kattintva, a másik lehetőség pedig az Alt + F11 billentyűkombináció leütése. Most tekintsük meg a Visual Basic Editor ablak elemeit:
A képernyő elemei: − Project ablak •
Dokumentumok, ahova makrókat készíthetünk/menthetünk
− Properties ablak •
Az objektumok tulajdonságai állíthatók itt be
− Szövegszerkesztő ablak •
Ide készíthetjük el a kódot, a szubrutinok futtathatók
•
Egyes szintaktikai hibákat jelez a fordító a beírás után
− Immediate (futtatási) ablak •
Egyes futási eredmények megtekintésére
− Watch ablak •
Nyomkövetésre, hibakeresésre, mi nem nagyon fogjuk használni
− Locals ablak •
Szintén változók nyomon követésére alkalmas
− Kis eszköztár, fontosabb lehetőségek: •
Makró futtatása, szüneteltetése, leállítása, váltás (mindezt persze menüből is lehet, és gyorsbillentyűk is vannak, pl. F5 – futtatás)
Minden kulcsszóról infót kaphatunk az F1 lenyomására a Súgóban és ugyanitt tematikusan is kereshetünk.
Térjünk vissza egy kicsit a Fejlesztőeszközök laphoz, tehát zárjuk be a Visual Basic Editort. Új makró felvételéhez kattintsunk a Fejlesztőeszközök lap Kód csoportjában a Makrók gombra. A Makrónév mezőbe írjuk be a létrehozandó makró nevét, a példában elsoMakro, itt fontos megemlíteni, hogy amennyiben mi olyan nevű makrót kívánunk létrehozni, amely már szerepel a Microsoft Office Word beépített makrói között, akkor az általunk írt makró műveletei felülírják a beépített makró műveleteit. A beépített makrók listájának megjelenítéséhez kattintson a Makró helye listában a Word parancsok elemre. A létrehozás folytatásához a Makró helye listában kattintsunk arra a sablonra vagy dokumentumra, amelyben a makrót tárolni szeretnénk, itt alapértelmezetten a Minden aktív sablon és dokumentum van kijelölve. A Visual Basic Editor megnyitásához kattintsunk a Létrehozás gombra. A program a Létrehozás gomb lenyomása után 3 műveletet végez el, melyek a következők: 1. Készít egy elsoMakro nevezetű új modult a Normal sablonban, amely makrónk kódját tartalmazza majd. 2. Elindítja a Visual Basic szerkesztőt (Visual Basic Editor). 3. A Word automatikusan megadja a makró első és utolsó sorát, valamint néhány megjegyzést is készít a makróhoz. (Ezek a megjegyzések másoknak nyújtanak segítséget a program megértésében. A VBA-ban a megjegyzések mindig aposztróffal kezdődnek.) És most tekintsük át a Visual Basic nyelv alapjait.
A Visual Basic programozási nyelv Mint több más programozási nyelvben itt is szükség van a változók deklarációjára, ezt a Dim kulcsszó használatával tehetjük meg, ami után megadjuk a változó nevét, ezután következik az As kulcsszó majd a változó típusa. A Visual Basicben a következő típusokat használhatjuk: Típus
Változó tartalma
Integer
egész szám
Single
egyszeres pontos, lebegőpontos szám
Double
dupla pontos, lebegőpontos szám
String
sztring: karakter, karaktersorozat
Boolean logikai érték (True - igaz, False – hamis) Visual Basic változónévre névadási szabályok vonatkoznak. A változónév betűvel (angol ábécé betűi) kezdődik, tartalmazhat számokat, aláhúzás jeleket, és további betűket, a hossza maximum 255 karakter. A Visual Basic nem különbözteti meg egymástól a kis- és a nagybetűket. Például: Osszeg, Atlag, Max_index, db A Visual Basic nyelvben a hosszú utasítást vesszőnél új sorba folytathatjuk szóköz aláhúzás és újsor alkalmazásával. Lásd az alábbi deklarációs utasítást! Program sorának folytatása új sorban: Option Explicit Dim Osszeg As Integer, Atlag As Double, _ Max_index As Integer
Példák a különböző típusú változók értékeinek megadási módjaira: szám: 12, -3, 56, 4E-2, 5E4 (Tizedes pont vagy vessző operációs rendszer beállítástól függ.) szöveg: „alma” logikai érték: True, False Numerikus változó: egész, vagy valós számot tartalmaz. Az E után hatványkitevőt adhatunk meg. Szöveges változó: "" jelek között karaktersorozat. A konstansokat a Const kulcsszó segítségével deklaráljuk. Az értékadás szintaktikája: változónév = konstans vagy kifejezés Végezhetünk különböző átalakításokat is: Numerikus adatokat átalakíthatjuk szöveggé a CStr függvény használatával. Dim adat As Integer, szoveg As String Adat = 2 Szoveg = Cstr(Adat)
Karaktersorozatokat fűzhetünk össze a + vagy az & jellel. MsgBox eredmény megjelenítésére alkalmas: MsgBox "szöveg1","szöveg2","szöveg3"
InputBox segítségével értékeket is kérhetünk be a műveleteinkhez:
valtozo = InputBox("Amit kérünk", "A bekérő ablak fejléce", "Alapértelmezett érték")
Tekintsük meg most a nyelv operátorait is:
Operátorok A műveletek képzéséhez az alábbi operátorokat használhatjuk:
Példa:
Eredmény:
Összeadás:
+
2.6+ 3
5.6
Kivonás:
–
8-13
-5
Szorzás:
*
3*2
6
Osztás:
/
15/2
7.5
Egészek osztása:
\
15\2
7
Mod
16 Mod 2
0
^
2^3
8
Maradék képzés (modulus) Hatványozás:
Az összes általunk írt, valamint a rögzített makrók legtöbbje az eljárásokra (Sub) épül. Ezek mindegyike az alábbi sorral kezdődik: Sub MakróNév A MakróNév itt értelemszerűen a makró neve. Az eljárások kivétel nélkül a következő sorral érnek véget: End Sub A Word számára kiadott utasítások e két sor között kapnak helyet. Amennyiben szeretnénk, hogy az általunk írt kódot a Word ellenőrizze, kódunkat kezdjük az alábbi sorral: Option Explicit Ez a kódsor arra utasítja a Word-öt, hogy ellenőrizze valóban minden általunk használt változót deklaráltunk e. Ezzel elkerülhetjük a változók elgépeléséből adódó problémákat. A Visual Basic Editor segítségünkre van kódunk szerkesztésében, ugyanis teljes értékű fejlesztői környezet révén, biztosít számunkra IntelliSense-t, vagyis lehetőségek listáját kínálja a kód írása közben, amit a Ctrl + Space billentyű lenyomásával is előhozhatunk
Ezzel végére értünk az alapvető deklarációk és operátorok sorának, a később szükséges ismereteket a példafeladatokkal fogom demonstrálni. A Microsoft Office Wordben természetesen nagyrészt nem numerikus kifejezéseket fogunk írni, de ez a bevezetés szükséges a nyelv szintaktikájának megismerésében. Most következzenek gyakorlati példák.
VBA a gyakorlatban Az alábbi feladatokat a Visual Basic Editorban írjuk meg. 1. A kijelölt szöveg legyen Times New Roman, 12-es betűméretű, dőlt és piros színű. Sub betuform() Selection.Font.Name = "Times New Roman" Selection.Font.Color = wdColorRed Selection.Font.Size = 12 Selection.Font.Italic = True End Sub
2. Egy adott bekezdést állítsunk sorkizárttá, előtte és utána legyen 6 pontos térköz, sorai közt 1.5-es sorköz álljon. Ebben a feladatban újdonság a With használata, mely megspórol nekünk jópár billentyűleütést azzal, hogy meghatározza a használt osztályt az End With parancsig. Ebben a blokkban az adott osztály alosztályaira és mezőire egyszerűen tudunk hivatkozni, ha leütünk egy pontot, majd a beírjuk a kívánt objektum nevét, nem kell újra és újra beírnunk a With után írt, esetenként igen hosszú teljes hivatkozási formát. Sok beállítás módosításakor sokkal célszerűbb ezt a módszert alkalmazni.
Sub bekezdform() With Selection.ParagraphFormat .SpaceBefore = 6 .SpaceAfter = 6 .Alignment = wdAlignParagraphJustify .LineSpacingRule = wdLineSpace1pt5 End With End Sub
3. Az egész dokumentumban cseréljük ki az ékezetes betűket a megfelelő ékezet nélküli párjukra. Ehhez meg kell ismernünk pár parancsot. Az előző programmal már megismerhettük a With használatának előnyeit. Ezek után meg kell ismernünk az Execute függvényt, amely a blokkjában lévő utasítást hajtja végre. Ennek paramétere egy opcionális változó, mely esetünkben maga a csere lesz. A Find Text mezőjének értékül adjuk a keresendő betűt majd a Replacement Text mezőjébe a kicserélendő betűt, ezután következhet a while ciklus, amely addig fut, míg az összes találatot nem módosította. Sub betucsere() With ActiveDocument.Content.Find .Text = "ő": .Replacement.Text = "o": While .Execute(Replace:=wdReplaceAll): Wend .Text = "ó": .Replacement.Text = "o": While .Execute(Replace:=wdReplaceAll): Wend .Text = "ö": .Replacement.Text = "o": While .Execute(Replace:=wdReplaceAll): Wend .Text = "á": .Replacement.Text = "a": While .Execute(Replace:=wdReplaceAll): Wend .Text = "í": .Replacement.Text = "i": While .Execute(Replace:=wdReplaceAll): Wend .Text = "é": .Replacement.Text = "e": While .Execute(Replace:=wdReplaceAll): Wend .Text = "ú": .Replacement.Text = "u": While .Execute(Replace:=wdReplaceAll): Wend .Text = "ü": .Replacement.Text = "u": While .Execute(Replace:=wdReplaceAll): Wend .Text = "ű": .Replacement.Text = "u": While .Execute(Replace:=wdReplaceAll): Wend End With End Sub
4. A következő makró segít nekünk a sokszor monoton táblázatlétrehozásban. Elsőként bekéri hány sor és oszlop legyen a táblázatunkban, majd alapvető beállításokat is alkalmaz rá: az első sor nagyobb betűméretet kap, félkövér lesz és középre igazított, a külső
szegély
méretét
az
alapértelmezettnél
nagyobbra
állítja,
keretet
adva
táblázatunknak. A kódban felhasználunk egy új elemet is, a CLng függvényt, ez arra való, hogy a paraméterlistájában elhelyezett adatot Long típusúra alakítja, persze nem csak Long típusra tudunk konvertálni, létezik a konverter sok egyéb típusra is. Sub tablazat() ActiveDocument.Tables.Add Range:=Selection.Range, _ NumRows:=CLng(InputBox("Sorok Száma", "Táblázat adatai", 5)), _ NumColumns:=CLng(InputBox("Oszlopok Száma", "Táblázat adatai", 5)) _ DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:=wdAutoFitFixed With Selection.Tables(1) With .Borders(wdBorderLeft) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth225pt End With With .Borders(wdBorderRight) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth225pt End With With .Borders(wdBorderTop) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth225pt End With With .Borders(wdBorderBottom) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth225pt End With End With With Options .DefaultBorderLineStyle = wdLineStyleSingle .DefaultBorderLineWidth = 1 End With Selection.MoveRight Unit:=wdCharacter, Count:=5, Extend:=wdExtend Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter Selection.Font.Bold = wdToggle Selection.Font.Size = 14 End Sub
5. Írjunk egy AlapvetoTisztitas nevű makrót, amely a következő műveleteket végzi el: − minden bekezdés elejéről és végéről a szóközöket és tabulátorokat, − törli az üres sorokat − minden szóközsorozatot egy darab szóközre cserél A tisztítás megkezdése előtt tájékoztassuk a felhasználót az elvégzendő műveletekről és kérdezzük meg, hogy biztos futtatni szeretné-e és csak abban az esetben futtassuk le, ha igen. Sub AlapvetoTisztitas() Dim Valasz As Integer Valasz = MsgBox("Ez a makró a teljes dokumentum alapvető tisztítását végzi, azaz:" & vbNewLine & "-
minden bekezdés elejéről és végéről törli a szóközöket, tabulátorokat;" &
vbNewLine & "-
törli az üres sorokat;" & vbNewLine & "-
az egymást közvetlenül követő
szóközöket egy szóközre cseréli." & vbNewLine & vbNewLine & "Biztos futtatni akarja a makrót?", vbYesNo Or vbQuestion, "Alapvető tisztítás") If Válasz = vbYes Then With ActiveDocument.Content.Find .ClearFormatting: .Replacement.ClearFormatting: .Format = False .Forward = True: .Wrap = wdFindContinue .Text = " ^p": .Replacement.Text = "^p" ' Most egy olyan ciklus következik, melyben nincs ciklusmag! ' A hasznos tevékenység a ciklusfeltételben zajlik. While .Execute(Replace:=wdReplaceAll): Wend .Text = "^p ":
.Replacement.Text = "^p": While .Execute(Replace:=wdReplaceAll): Wend
.Text = "^p^t": .Replacement.Text = "^p": While .Execute(Replace:=wdReplaceAll): Wend .Text = "^t^p": .Replacement.Text = "^p": While .Execute(Replace:=wdReplaceAll): Wend .Text = "^p^p": .Replacement.Text = " ": While .Execute(Replace:=wdReplaceAll): Wend .Text = "
": .Replacement.Text = " ": While .Execute(Replace:=wdReplaceAll): Wend
End With ' ActiveDocument.Content.Find End If End Sub
Formok Meg kell említenünk egy pár sorban, hogy formok létrehozására is van lehetőségünk. Ezek vizuális felületet biztosítanak a műveletek végrehajtására, gombokat, textboxokat és egyéb objektumokat helyezhetünk rájuk, ezáltal könnyebben kezelhetjük például a makróink által nyújtott új funkciókat. Sokat lehetne írni a form nyújtotta lehetőségekről, de most csak az alapokat mutatom be. Új formot a projectablakba jobb klikkel kattintva az Insert/UserForm menüpont segítségével szúrhatunk be. Ezután rögtön meg is jelenik a formunk és a Toolbox ami a felrakható objektumok kezelésében segít.
A képen a Toolbox 3. sorának 2. ikonja jelzi a felrakható gombot, ha rákattintunk és lenyomva tartjuk az egérbillentyűt, majd a kurzort a form fölé mozgatjuk a gomb körvonalai rajzolódnak ki, ha megtaláltuk a megfelelő helyet csak engedjük el a gombot és megjelenik egy gomb. Ezután a gomb tulajdonságait a Properties ablakban módosíthatjuk, ilyen tulajdonságok például a Name (amivel hivatkozhatunk a gombra), BackColor, ForeColor, Font és az egyik legszembetűnőbb a Caption, azaz a gomb felirata. Miután már kellőképp megformáztuk első gombunkat, klikkeljünk rá kétszer, így megjelenik a „gomb mögött rejtőző tartalom”, azaz a gombnyomáskor lefutó kód. Ebben a kódban olyan utasításokat hajthatunk végre amilyeneket csak szeretnénk, próbaképp például használhatjuk a már korábban megírt makrókat is. Ahhoz viszont, hogy ezt a formot a későbbiekben bármikor megnyithassuk írnunk kell egy makrót mely a form neve után írt Show metódussal megjeleníti a formot a képernyőn.