Content extract
Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Tartalomjegyzék BEVEZETÉS . 1 AZ OFFICE PROGRAMOZÁSÁNAK ALAPJAI . 2 OBJEKTUMOK . 2 OBJEKTUMOK HIVATKOZÁSAI . 3 PROGRAMOZÁSI ALAPOK . 4 VÁLTOZÓK, KONSTANSOK . 4 Változók hatóköre . 5 Konstansok. 6 ELJÁRÁSOK, FÜGGVÉNYEK . 6 ELSŐ „PROGRAMUNK”. 7 MAKRÓRÖGZÍTÉS FELVÉTELLEL . 7 EGY VBA PROJEKT FELÉPÍTÉSE . 9 A VBE FELÜLETE . 9 A PROJEKT RÉSZEI. 10 A MAKRÓK HELYE . 11 A MAKRÓK MÓDOSÍTÁSA . 11 FELADAT: LOTTÓHÚZÁS . 13 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Bevezetés Az Office programcsomag használata során sokszor előfordul, hogy bizonyos műveleteket, legyen az szerkesztési, formázási vagy esetleg valamilyen számítási művelet, újra és újra el kell végeznünk. Mivel az Office programozói nem tudhatták előre, az egyes felhasználók milyen műveleteket ismételnek, ezért bevezették a makróprogramozást, amely
betölti a feladat-automatizálás és a testreszabás szerepét. Az Office 97 makrónyelv alapjául – kézenfekvő módon – a Visual Basic-et választották. Teljes neve Visual Basic for Applications (VBA) A következő alkalmazásokban használhatjuk ezt a nyelvet: Word, Excel, PowerPoint, Access, Outlook, Project 98. A VBA-t már több, nem Microsoft által fejlesztett alkamazásba is beépítették, például az AutoCAD 2000-be. 1 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Az Office programozásának alapjai Objektumok Amikor az Office-t programozzuk, általában valamilyen objektummal dolgozunk, annak tulajdonságait és metódusait (eljárásait) használjuk . Objektumnak tekinthető egy Excel munkalap, egy Word dokumentumban lévő szövegdoboz, de maguk az alkalmazások is. Egy Word dokumentum tulajdonságai például a lapméret vagy a bekezdések száma, egy metódusa pedig a dokumentum bezárását végrehajtó utasítás-sorozat.
Legtöbb esetben a gyárilag elkészített objektumokat használjuk, de természetesen mi magunk is készíthetünk ilyet. Egy egyszerű hétköznapi példa a könnyebb megértés kedvéért: tekintsünk objektumnak egy mikrohullámú sütőt. Ebben az esetben az objektum tulajdonsága a színe, súlya, térfogata, ára stb. A különböző mikrohullámú sütők különböző módszereket használnak a behelyezett étel felmelegítésére, ez a folyamat a melegítés metódusa (eljárása). A fenti példák egy fontos részben különböznek egymástól, nevezetesen az utóbbinak nem, vagy csak nagyon nehezen lehet változtatni a tulajdonságain (a metódusán pláne nem), míg az Office ’97 objektumtulajdonságait gyakorlatilag tetszés szerint alakíthatjuk át. Az objektumokat egy előre elkészített minta alapján lehet létrehozni. Ebből a mintából veszi az újonnal létrehozott objektum a saját tulajdonságait és metódusait. Ezt a mintát az objektum osztályának
nevezzük. Gyakran fordul elő, hogy több objektumot is hozunk létre ugyanabból a mintából (osztályból). Ilyenkor az adott objektumok gyűjteményéről beszélünk Például Excelben a munkafüzet egyetlen lapja egy objektumnak tekinthető, az összes lap viszont már gyűjtemény. Elmondhatjuk tehát, hogy az Office alkalmazások programozása során az előre elkészített objektumok lehetőségeit használjuk annak érdekében, hogy a mindennapi munka során felmerülő feladatokat automatizálhassuk. Minél több objektumot, illetve annak tulajdonságait, viselkedését ismerünk meg, annál nagyobb gyakorlatot szerzünk az alkalmazások programozásában. 2 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Objektumok hivatkozásai Egy objektumra, illetve azon belül annak valamilyen tulajdonságára vagy metódusára a következő szintaxis szerint hivatkozhatunk: objektumnév.tulajdonságnév vagy objektumnév.metódusnév([paraméterek])
Minden esetben a „pont” az elválasztó karakter. A „paraméterek” szögletes zárójelbe tétele azt jelenti, hogy nem minden metódusnak vannak paraméterei, valamint a paraméterek közül nem mindegyik lehet kötelező. Például Wordben az aktív dokumentum első bekezdésére az ActiveDocument.Paragraphs(1) utasítással lehet hivatkozni. Ha a zárójeleket és az 1-est elhagytuk volna, akkor a dokumentumban lévő összes bekezdés gyűjteményére hivatkozunk, így azonban csak a gyűjtemény első elemére. A fent említett bekezdésnek a stílusát az ActiveDocument.Paragraphs(1)Style utasítással lehet lekérdezni vagy módosítani. A következőben egy metódusra hivatkozunk. A C: meghajtó gyökérkönyvtárában lévő Irat.doc fájlt az Application.DocumentsOpen("C:Iratdoc") utasítással nyithatjuk meg. Itt a metódus az Open, paramétere pedig a megnyitandó dokumentum teljes elérési útvonala. Elemezzük a következő példát: Bekezdés =
ActiveDocument.Paragraphs(1) Itt egy értékadásra láthatunk példát. A Bekezdés nevű változó egy objektumnak a változója, amely objektum a Paragraphs (Bekezdések) gyűjtemény első eleme. Innentől kezdve az első bekezdés stílusára a következőképpen is hivatkozhatunk: Bekezdés.Style 3 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Programozási alapok A előző fejezetben említettem több olyan fogalmat is, amely egy kezdő programozó számára idegennek tűnhet. E jegyzet terjedelme nem engedi meg, hogy teljes részletességgel ismertessem meg a hallgatóval a programozás alapfogalmait, de röviden tekintsük át a legfontosabbakat. Változók, konstansok A programok futása során sokszor előfordul, hogy bizonyos értékeket le kell tárolnunk újbóli felhasználás miatt. Erre a célra valók a változók Mivel az adatokat többféleképpen kódolhatjuk, ezért a változóknak is többféle típusa van. Akkor van
egyértelműen definiálva egy változó, ha a neve mellett az adattípusa is meg van adva. A VBA nyelvben kétféleképpen adhatunk meg változót: implicit és explicit módon. Implicit megadás esetén a használatba vételt nem előzi meg deklaráció, pontosabban maga a használatba vétel egyben deklaráció is. Sub Gyökvonás() Gyok=Sqr(9) B=Gyok * 2 Cells(1, 1).Value = B End Sub Itt éppen 9 négyzetgyökének az értékét tároltuk le a „Gyok” nevű változóba, ennek értékét használjuk fel a B értékadásához végül az eredményt az aktív Excel munkalap A1-es cellájában tároljuk. Ez a fajta változóhasználat megnehezítheti a nagyobb programokban a hibakeresést. Pl ha a B kiszámításakor „Gyok” helyett például „Gyök”-öt írtunk volna, B értéke 0 lenne, hiszen semelyik új változónak nincs értéke. Az explicit deklaráció esetében használatba vétel előtt deklaráljuk a változó nevét és adattípusát is. Option Explicit Dim Gyok
As Double Dim B As Long Sub Gyökvonás() Gyok = Sqr(9) B = Gyok * 2 Cells(1, 1).Value = B End Sub 4 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Így már minden egyértelműen meg van adva, és ha véletlenül elírjuk egy változó nevét (vagy deklarálni elfelejtettük), hibaüzenetet kapunk. Változók hatóköre A változókat több helyen is definiálhatjuk: eljáráson belül és kívül. A különböző eljárásokban definiált változók egymástól függetlenek lesznek, értékük nem látható más eljárás számára. Sub Egyik() Dim Szöveg1 As String Szöveg1=”Ez egy szöveges változó” MsgBox Szöveg2 End Sub Sub Másik() Dim Szöveg2 As String Szöveg2=”Másik szöveg” MsgBox Szöveg1 End Sub Ha mindkét eljárásban „látni” szeretnénk a két változót, akkor kívül kell definiálni: Dim Szöveg1 As String Dim Szöveg2 As String Sub Értékadás() Szöveg1=”Ez egy szöveges változó” Szöveg2=”Másik
szöveg” End Sub Sub Egyik() MsgBox Szöveg2 End Sub Sub Másik() MsgBox Szöveg1 End Sub 5 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Konstansok Hosszabb programoknál gyakran előfordul, hogy egy bizonyos érték nem változik, azaz konstans (állandó). Nem célszerű rendszeresen leírni az értéket, hiszen ha valamilyen okból mégis változtatnunk kell rajta, az egész programon keresztül végig kell vezetnünk a változást. Konstanst a következőképpen definiálunk: Const Állandó As Byte Eljárások, függvények Az eljárások (szubrutinok) és függvények szerepe az, hogy egy bizonyos utasítássorozatot tároljanak, amely sorozatra azután egy névvel hivatkozhatunk például egy másik eljárásban. A későbbiekben a makrórögzítés során fogunk még a gyakorlatban találkozni eljárással, amikor a rögzítendő makró neve egyben az eljárás neve is lesz. Van olyan eljárás, amely csak statikus utasítások sorát
dolgozza fel, de lehet olyat is deklarálni, amely kap valamilyen bemenő adatot is. Nézzünk rá példákat: Sub Levélvége() Selection.TypeText "Miskolc, " & Date End Sub Az eljárásnak tehát van egy neve, amit megelőz a SUB kulcsszó. Ha nincs paramétere, akkor a név után „üres” zárójelet teszünk. (Ez utóbbit – ha majd a gyakorlatban kipróbáljuk az eljárás-írást – megteszi helyettünk a VB editora). A fenti példa az aktuális Word dokumentumban az aktuális kurzorpozíciótól kezdve kiírja a „Miskolc, AktuálisDátum” szöveget. Ugyanez a feladat egy másik megoldással: Sub Kiirás() Levélvége ("yyyy. mmmm dd, dddd") End Sub Sub Levélvége(Dátumforma As String) Selection.TypeText "Miskolc, " & Format(Date, Dátumforma) End Sub Ebben az esetben a Levélvége eljárást a Kiirás eljárásból hívjuk meg, ráadásul egy paramétert is átadunk, amely meghatározza majd a kiírandó dátum megjelenési
formáját (a példában 2000.október 10, Kedd lesz az eredmény) Függvényeket is hasonlóképpen definiálhatunk. A különbség az, hogy a nevet a FUNCTION kulcsszó vezeti be. Mivel a függvények szerepe az, hogy valamilyen 6 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz bemenő adat(ok) ismeretében visszaadjon egy értéket, ezért a függvény adattípusát is meg kell adnunk (ugyanúgy, ahogyan a változókét). Function NagySzóköz(BejövőSzöveg As String) As String NagySzóköz = UCase(Trim(BejövőSzöveg)) End Function A fenti példa a „Nagyszóköz” függvény bemenő paramétereként egy szöveges változót ad meg (Bejövőszöveg), majd ezt felhasználva a szöveg elejéről és végéről levágja a szóközöket (Trim függvény) majd utána nagybetűssé alakítja (Ucase függvény). A „Nagyszóköz” függvény felhasználása a következő lehet: Sub Próba() Selection.TypeText NagySzóköz(" ez Itt egy PRóba
szÖveg ") End Sub Az aktuális kurzorpozícióba beilleszti az „EZ ITT EGY PRÓBA SZÖVEG” szöveget. Első „programunk” Makrórögzítés felvétellel Első gyakorlati feladatként indítsuk el a Word-öt, és az üres dokumentumba gépeljünk be egy tetszőleges szöveget. Ezután jelöljük ki, majd a TOOLS – MACROS – RECORD NEW MACRO parancsot válasszuk. A megjelenő párbeszédablakban a MACRO NAME: alatt gépeljük be a rögzítendő makrónk nevét (emlékezzünk, ez egyben egy eljárás neve is lesz), majd OK. 7 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Ekkor megjelenik egy eszköztár (ne tüntessük el, szükségünk lesz rá a felvétel leállításához.) Ezután figyeljünk arra, hogy NE tüntessük el a kijelölést sem, mert ezt a műveletet is rögzítenénk. Formázzuk meg a szöveget a FORMAT – FONT menüparanccsal. Álltsuk le a felvételt az imént megjelent eszköztár (Stop) gombjával. Most
éppen az történt, hogy az iménti formázási beállításainkat a makrórögzítő VBA utasítások formájában felvette, és egy eljárásba helyezte. Ezt az eljárást (és a későbbiekben az általunk megírtakat is a VB Editorában (VBE) tekinthetjük meg. Ide többféleképpen léphetünk: 1. A TOOLS – MACRO – MACROS parancs kiválasztása után jelöljük ki az imént felvett makrónk nevét, majd kattintsunk az EDIT gombra. 2. Üssük le az ALT+F11 billentyűkombinációt! Ez utóbbi művelet hatására bejutunk a VBE felületére. 8 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Egy VBA projekt felépítése A VBE felülete 1 3 4 2 1. Project Explorer (Projekttallózó) – Itt lehet látni az összes nyitott projektet Minden nyitott dokumentum egyben egy projekt is, amely tartalmazza a makrórögzítő által felvett (vagy az általunk rögzített) eljárásokat, űrlapokat (Form). Az ábrán a Word-höz tartozó VBE felülete
látható, így a megnyitott Word dokumentum (Document3) mellet a Normal sablon projektje is látszik. 2. Properties Window (Tulajdonságablak) A kijelölt modul vagy űrlapelem tulajdonságait tartalmazza, de csak azokat, amelyeket tervezési időben módosíthatunk. 3. Code (Kód) vagy űrlapablak Itt módosíthatjuk a makrórögzítő által felvett kódrészletet. 4. Immediate Window (Próba ablak) Ez egy nagyon hasznos része a VBE-nek, hiszen az itt beírt utasításokat azonnal végrehajtja a VB, és meg is lehet tekinteni az eredményt. Későbbiekben sokat használjuk majd 9 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Ezenkívül látszik egy eszköztár, amelynek leginkább 3 elemét használjuk majd: Run Sub/Form – Az aktuális eljárás/űrlap kódjának végrehajtása Break (Szünet) – A végrehajtás felfüggesztése. A Run-nal még folytatható a végrehajtás. Reset – A végrehajtás leállítása, projekt változóinak
alapállapotba állítása A projekt részei Egy VBA projekt modulokból épül fel. 1. Az alkalmazás alapobjektumaira mutató modul 2. Form-modul Felhasználói űrlapokat és a hozzá tartozó eseménykódokat tárol 3. Kód modul Általában globális eljárásokat, változókat, konstansokat tárolunk itt. 4. Osztály modul Ennek segítségével új objektumokat hozhatunk létre Az alábbi ábrán egy üres Word dokumentum és Excel munkafüzet projektfelépítése látható a VBE-n belül, hierarchikus ábrázolásban. A gyakran használt “THISDOCUMENT” az adott dokumentumra utaló objektumhivatkozás. Tehát például a Név = ThisDocument.Name az adott dokumentum éppen aktuális nevét (fájlnevét) adja meg. Ezt a hosszú hivatkozásnevet természetesen lerövidíthetjük a PROPERTIES ablakban, a NAME tulajdonság megváltoztatásával pl. “td”-re Ezt az ablakot és a Project Exploret gyakran fogjuk használni a VBE-n belül. 10 Tanfolyami
segédlet az Office 97 alkalmazások programozása tanfolyamhoz A makrók helye Az előző fejezetben csináltunk egy példát, amely egy szövegformázás lépéseit rögzítette makrónyelven. De hova is kerülnek ezek az utasítás-sorozatok? Először is azt kell megmondani – még a rögzítés megkezdése előtt –, hogy melyik munkafüzetben, vagy sablonban, azaz melyik projektállományban tárolja le a rendszer a kódot. Ezt a már látott párbeszédablak STORE IN: listájában tehetjük meg (8. o) Esetünkben ez most a Normal.dot sablonfájl volt Ha a rögzítésnek vége, az ALT+F11gyel léptünk át a VBE felületre Itt a projekttallózóban nyissuk ki a Normal ágat, majd a Modules-t. Itt találunk egy NEWMACROS elemet, ha erre duplán kattintunk, megjelennek az itt tárolt eljárások. A makrók módosítása Az általam alkalmazott formázási beállítások a következőek voltak ( A FORMAT – FONT után): - fékövér - 12-es méret - kiskapitális
Ennek hatására a következő eljárást generálta a Word makrórögzítője: Sub Szövegformázás() Szövegformázás Macro Macro recorded 01.0214 by Pazár András With Selection.Font .Name = "Times New Roman" .Size = 12 .Bold = True .Italic = False .Underline = wdUnderlineNone .StrikeThrough = False .DoubleStrikeThrough = False .Outline = False .Emboss = False .Shadow = False .Hidden = False 11 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz .SmallCaps = True .AllCaps = False .ColorIndex = wdAuto .Engrave = False .Superscript = False .Subscript = False .Spacing = 0 .Scaling = 100 .Position = 0 .Kerning = 0 .Animation = wdAnimationNone End With End Sub A fenti kódsorozatból látható, hogy a makrórögzítő a kijelölt szöveg jellemzői közül (SELECTION.FONT) olyan tulajdonságokat is beállított, amelyeket én a formázás során nem is alkalmaztam. Ha csak a szürkén kiemelt sorokat hagynánk meg az eljáráson belül,
ugyanazt a hatást érnénk el. Felmerülhet a kérdés: „Miért generált a gép 7-szer annyi kódot, mint amennyire szükség van ?” A választ pontosan nem tudom, de valószínű azért, hogy ezzel a módszerrel minél több objektum és tevékenység minél több alapértelmezett eljárását és tulajdonságát ismerhessük meg. Pl. adott a feladat: Word dokumentumba programozás útján hozzunk létre táblázatot. Ezt nehézkes lenne csak a belső helpből kihalászni Ezért érdemes a makrórögzítést alkalmazni (TOOLS – MACRO – RECORD NEW MACRO), majd a TABLE – INSERT TABLE parancs kiadása után (és persze a felvétel megállítása után) megnézni a generált kódot : ActiveDocument.TablesAdd Range:=SelectionRange, NumRows:=2, NumColumns:=4 Érdemes minél több helyen módosítani, kísérletezni a generált kódban, mert így lehet eljutni majd arra a szintre, hogy egyre kevesebbszer kell a makrórögzítést használni, és egyre bonyolultabb feladatokat
tudunk majd megoldani önálló programírással is. 12 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Feladat: Lottóhúzás Egy klasszikusnak mondható iskolapéldán keresztül nézzük meg az önálló makróírás lépéseit. A feladatot Excelben oldjuk meg Kiindulásként legyen elég 5 cellába beírni egy húzás eredményét. Fejlesztve a feladatot, egy másik munkalap egy cellájába írt értékétől függően generál X húzást a program. És végül egy húzás eredményét felhasználói űrlapon jelenítsük meg. Nézzük milyen változókra lesz szükségünk: - SZAMOK : logikai elemekből álló tömb, elemszám 90. Feladata lesz tárolni, hogy a 90 számból melyiket húzta ki már a gép - KihuzottSzam : Byte típusú változó. Feladata tárolni az aktuálisan kihúzott szám értékét - I : ciklusváltozó Tehát az Excelen belül üssük le az ALT+F11-et, majd pl. a ThisWorkbook elemen duplán kattintva írjuk be az
alábbi kódot: (az ’-lel kezdődő sorok megjegyzések, természetesen nem kötelező beírni) Sub Lottóhúzás() Igaz-Hamis értékeket tároló tömb Igaz az elem értéke = kihúzott a szám Hamis az elem értéke = nincs kihúzva a szám Dim Szamok(1 To 90) As Boolean Az éppen aktuálisan kihúzott szám Értéket véletlenszám-generátorral adunk neki Dim KihuzottSzam As Byte Ciklusváltozó Dim i As Integer Az elején egyik szám sincs kihúzva . For i = 1 To 90 . ezért minden elemét hamisra állítjuk Szamok(i) = False 13 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Next For i = 1 To 5 Ez a ciklus addig megy . Do "Kihúzunk" egy számot KihuzottSzam = Int(Rnd * 90 + 1) . amíg nem találunk olyan számot, ami még nincs kihúzva Loop Until Szamok(KihuzottSzam) = False Ha megtaláltuk, igazra állítjuk a megfelelő tömbelemet Szamok(KihuzottSzam) = True Az aktuális munkalap i. sorának 1 oszlopába írjuk be
a kihúzott számot Cells(i, 1) = KihuzottSzam ’ következő szám húzása Next Az első számra állunk . Cells(1, 1).Select . majd növekvő sorrendbe állítjuk a számokat Selection.Sort Range("A1"), xlAscending End Sub A programba elhelyezett kommentek mellé egy kis magyarázat: az RND függvény önmagában egy 0 és 1 közé eső véletlenszámot generál. Ezért kell megszorozni 90-nel és egész számra alakítani (INT függvény). 14 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz A DO – LOOP UNTIL ciklusnak akkor lesz vége, amikor az UNTIL után írt feltétel igazzá válik. Másik változata a DO – LOOP WHILE, amikor is a ciklusmag addig fut, amíg a WHILE utáni feltétel igaz marad. Tehát a ciklus így is kinézhetne: Do "Kihúzunk" egy számot KihuzottSzam = Int(Rnd * 90 + 1) . amíg nem találunk olyan számot, ami még nincs kihúzva Loop While Not Szamok(KihuzottSzam) = False A CELLS(SOR,OSZLOP)
gyűjtemény gyakorlatilag egy mátrix (kétdimenziós tömb), ami önmagában az aktív munkalap celláira mutat. Ha egy meghatározott munkalap celláira akarunk hivatkozást (pl. a Sheets3 lapra), akkor a következő formában kell alkalmazni: Sheets(”Sheet3”).Cells(sor,oszlop) A számok sorbarendezését végrehajtó kódot makrórögzítő segítségével generáltam (az itt lévő változat már le van egyszerűsítve). Gyakorlatilag megvalósítottuk a feladat első részét. Most nézzük a továbbfejlesztést. Csak kis mértékben változtatjuk meg a programot A húzás eredményeit az első munkalapra tesszük; azt, hogy hány húzás-sorozat legyen egymás után, azt pedig a második munkalap A1-es celláájának tartalmából vesszük. A módosított program (kommentek és a már ismert deklarációk nélkül) a következő: 15 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Dim j As Integer For j = 1 To Sheets(2).Cells(1, 1)
For i = 1 To 90 Szamok(i) = False Next For i = 1 To 5 Do KihuzottSzam = Int(Rnd * 90 + 1) Loop While Not Szamok(KihuzottSzam) = False Szamok(KihuzottSzam) = True Sheets(1).Cells(i, j) = KihuzottSzam Next Sheets(1).Activate Sheets(1).Range(Cells(1, j), Cells(5, j))Select Selection.Sort Range(Cells(1, j), Cells(1, j)), xlAscending Next End Sub Annyiban változott a kód, hogy egy új ciklus (For j= ) jelent meg, és a már előbb említett módszerrel hivatkozunk a 2. munkalap egy cellájára A végén nem egy cellát jelölünk ki a sorbarendezés előtt, hanem 5-öt, hogy a már előzőleg kihúzott 5-ös sorozatokat ne rendezze át. És végül készítsünk egy felhasználói párbeszédablakot, amelyben egy húzás eredményét fogjuk egy gomb lenyomására („Sorsolás” felirattal) megjeleníteni. Ehhez lépjünk a VBE felületére, és az aktív munkafüzet valamelyik projektelemére állva (mondjuk THISWORKBOOK) válasszuk az INSERT – USERFORM parancsot. Ennek hatására
megjelenik a projektlistában egy USERFORM elem, majd a formtervező ablaka is megjelenik. 16 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz Ennél a módszernél már tisztábban kell látni az ún. eseményvezérelt programozás területén. E jegyzet keretei erősen meghaladják ennek a témának az ismertetését. Röviden egy pár mondatban: esemény például, ha egy nyomógombra kattintunk (mondjuk egy OK-ra). De esemény az is, ha egy űrlap (továbbiakban form) megynyílik és/vagy aktiválódik. Ezekre az eseményre kell egy kódsorozattal reagálni Hogy egyáltalán milyen események vannak, ezt a belső help, valamint a kódszerkesztő is nagyszerűen tálalja. Most nézzük a mi példánkat. Legyen két nyomógomb, az egyik „Sorsolás” a másik „Bezárás” felirattal. Ezért a formtervezőben látható TOOLBOX eszköztárból válasszuk a COMMANDBUTTON-t, majd az üres formon kattinsunk egyet. Ezt ismételjük meg még egyszer.
Két gomb keletkezett, COMMANDBUTTON1 ill COMMANDBUTTON2 felirattal. Helyezzük el őket vonszolással esztétikusan Majd változtassuk meg a feliratukat a PROPERTIES ablakban látható CAPTION tulajdonság átírásával. (Először értelemszerűen jelöljük ki a megfelelő gombot) Ezután helyezzünk el 5 LABEL vezérlőelemet (ha nem látszik a TOOLBOX, jelöljük ki a formot) Kb. most így néz ki a formunk: 17 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz A tervezési időben látható rácspontok természetesen nem láthatóak futáskor, csak a vezérlőelemek kényelmesebb igazítását szolgálják. Már most „működik” a form, hiszen ha a VBE eszköztárából megnyomjuk a RUN SUB/USERFORM-ot, megjelenik a form. A gombokra kattintva nem történik semmi (hiszen még nem írtuk meg az esemény-kódokat). Csak a szabvány Windows-os „X”szel zárhatjuk le Visszatérve a formtervezőbe, kattintsunk duplán a BEZÁRÁS gombra, ennek
hatására a form kódszerkesztőjébe jutunk, és automatikusan generálódik a vezérlő eseménykódja, ami a kattintásra (click) reagál majd. Írjuk meg eztt a kódot: Private Sub CommandButton2 Click() Unload UserForm1 End Sub Az UNLOAD eljárással bármilyen objektumot (vezérlőt, formot, stb) kitörölhetünk a memóriából. Ez form esetén annak bezárását eredményezi Most jön a „könnyebbik” feladat: írjuk meg a Sorsolás gomb kódját. Azért könnyebb ez, mert felhasználjuk az előzőleg megírt sorsolás kódot, kis változtatással. Tehát kattinsubk duplán a Sorsolás gombra (aut. generálódott az esemény eljárás neve), majd ha a ThisWorkbook „alá” írtuk meg előbb a kódot, akkor arra duplázzunk. Vágólapon keresztül vigyük át a kódot a Sorsolás gomb esemény-eljárásába. Íme a kód (deklaráció és kommentek nélkül): 18 Tanfolyami segédlet az Office 97 alkalmazások programozása tanfolyamhoz For i = 1 To 90 Szamok(i) =
False Next For i = 1 To 5 Do KihuzottSzam = Int(Rnd * 90 + 1) Loop While Not Szamok(KihuzottSzam) = False Szamok(KihuzottSzam) = True Select Case i Case 1 Label1.Caption = KihuzottSzam Case 2 Label2.Caption = KihuzottSzam Case 3 Label3.Caption = KihuzottSzam Case 4 Label4.Caption = KihuzottSzam Case 5 Label5.Caption = KihuzottSzam End Select Next Itt most I értékétől függően változtattuk a megfelelő vezérlő (LABEL1-LABEL5) CAPTION tulajdonságát futási időben. Tipp: tegyük itt is emelkedő sorrendbe a számokat. Itt érdemes felvenni egy 5 elemű tömböt (Byte típusú elemekkel), és valamilyen egyszerű algoritmussal (mondjuk a „buborék” módszerrel) sorbarendezni az elemeket. 19