Académique Documents
Professionnel Documents
Culture Documents
EXCEL PROGRAMOZS
Oktatsi segdlet
Pusztai Pl
2014
Tartalomjegyzk
1. Bevezets .................................................................................................................................................................... 3
2. A Visual Basic programozsi nyelv ........................................................................................................................ 4
2.1. Egyszer adattpusok ........................................................................................................................................ 4
2.1.1. Egsz adattpusok ...................................................................................................................................... 4
2.1.2. Vals adattpusok....................................................................................................................................... 6
2.1.3. Logikai adattpus ........................................................................................................................................ 6
2.1.4. Szveges adattpus ..................................................................................................................................... 6
2.1.5. Egyb adattpusok ..................................................................................................................................... 7
2.2. Adatok kezelse ................................................................................................................................................. 8
2.2.1. Vltoz ........................................................................................................................................................ 8
2.2.2. Kifejezs ....................................................................................................................................................10
2.2.3. Fggvnyek ...............................................................................................................................................11
2.2.4. Az rtkad utasts.................................................................................................................................13
2.2.5. Adatok bekrse .......................................................................................................................................14
2.2.6. Adatok kirsa ...........................................................................................................................................15
2.3. Vezrlszerkezetek ..........................................................................................................................................17
2.3.1. Szekvencia .................................................................................................................................................17
2.3.2. Szelekci ....................................................................................................................................................18
2.3.3. Iterci .......................................................................................................................................................19
2.4. Szubrutinok ......................................................................................................................................................21
2.4.1. Deklarci s hvs ..................................................................................................................................21
2.4.2. Mintafeladat ..............................................................................................................................................23
2.5. sszetett adattpusok......................................................................................................................................25
2.5.1. Tmbk .....................................................................................................................................................25
2.5.2. Rekordok ...................................................................................................................................................27
2.5.3. Mintafeladat ..............................................................................................................................................28
2.6. Objektumok, objektumtpusok .....................................................................................................................31
3. Az Excel VBA hasznlata ......................................................................................................................................32
3.1. Makrk ..............................................................................................................................................................32
3.2. A Visual Basic Editor......................................................................................................................................34
3.2.1. Az Immediate ablak.................................................................................................................................37
3.2.2. A Project ablak .........................................................................................................................................37
3.2.3. A Properties ablak ...................................................................................................................................39
3.2.4. A kdszerkeszt ablak ............................................................................................................................40
3.2.5. Modulok felptse ..................................................................................................................................44
3.2.6. Fordts, futtats, hibakeress ................................................................................................................45
3.2.7. Vizulis formtervezs ..............................................................................................................................48
3.2.8. Mintafeladat ..............................................................................................................................................50
4. Az Excel programozsa..........................................................................................................................................55
4.1. A hasznlhat objektumok, objektumtpusok ............................................................................................55
4.1.1. Az Application objektum .......................................................................................................................55
4.1.2. Gyjtemnyek...........................................................................................................................................55
4.1.3. A Range objektum ...................................................................................................................................56
4.1.4. A WorksheetFunction objektum...........................................................................................................61
4.2. Egyb VBA lehetsgek .................................................................................................................................63
4.2.1. Makrk rgztse......................................................................................................................................63
4.2.2. Diagramok kezelse .................................................................................................................................64
4.2.3. A beptett prbeszdablakok hasznlata.............................................................................................65
4.2.4. Sajt men ksztse ................................................................................................................................66
4.3. Mintafeladat ......................................................................................................................................................68
5. Irodalomjegyzk ......................................................................................................................................................77
II
1. BEVEZETS
Jelen dokumentum elssorban az Excel programozs irnt (kedvtelsbl vagy egyb okbl) rdekld
kezdknek kszlt, akik most teszik meg els lpseiket egy olyan ton, amelynek sorn, ill. vgn
megvalsul az ember s szmtgp kommunikcijnak legmlyebb, legnehezebben elsajtthat, de
egyben legintellektulisabb szintje, a szmtgp programozsa.
Ha egy feladat megoldsra szmtgpes programot ksztnk, akkor azt ltalban nem gy tesszk, hogy
elkezdjk begpelni a program utastsait. Minl nagyobb, sszetettebb a megoldand feladat, annl
inkbb szksges a kvetkez megoldsi lpsek vgrehajtsa:
1. A feladat megfogalmazsa, pontosts, ltalnosts.
2. Matematikai (vagy egyb) modell kivlasztsa, megadsa (ha szksges, illetve lehetsges).
3. Az adatszerkezet definilsa, az input-output specifiklsa.
4. A megoldst megvalst algoritmus megtervezse, elksztse.
5. Programrs, kdols (az adatszerkezet s az algoritmus alapjn).
6. Tesztels, hibakeress.
7. Dokumentls (felhasznlknak, fejlesztknek).
Termszetesen az adott feladat (vagy munka) jellegbl addan bizonyos lpsek el is maradhatnak (pl.
2., 7.), illetve javts, mdosts esetn szksg lehet egy korbbi szintre val visszalpsre is. A program
tnyleges megrsa (5.) csak a mr elksztett megold algoritmus (4.) ismeretben lehetsges, ami viszont
nem kszlhet el anlkl, hogy tisztznnk, milyen bemen s milyen eredmny adataink lesznek (3.).
Az Excel programozsi segdletnket a programrshoz (5.) szksges (rvidtett) nyelvi ismertetvel
kezdjk (lsd 2. fejezet), amit a programok kiprblshoz (6.) szksges ismeretek kvetnek (lsd 3.
fejezet). A harmadik rszben (lsd 4. fejezet) az Excel objektumairl, azok programbl trtn
hasznlatrl lesz sz. Mivel a segdlet bevezet jelleg, ezrt a feldolgozott tmakrnek csak egy kisebb
(de remnyeink szerint a lnyeges dolgokat tartalmaz) szelett mutatjuk be.
A szakirodalom szerencsre bsgesen ellt minket programozsrl szl szakknyvekkel. Az Excel
programozs utn rdekld olvasknak az [1], a Visual Basic nyelvvel kapcsolatosan a [2], az
algoritmusok tervezst illeten kezdszinten a [3], haladbb szinten a [4] szakirodalmat ajnljuk.
Adattpus
Trolsi mret
Tartomny
Byte
1 bjt
0 .. 255
Integer
2 bjt
32768 .. 32767
Long
4 bjt
2147483648 .. 2147483647
3/2 1.5
5\3 1
5 Mod 3 = 2 True
Megjegyzs
A kisebb vagy egyenl (<=), illetve a nagyobb vagy egyenl (>=) mveletek (ahogyan azt a nevk
is sugallja) csak akkor igazak, ha a kisebb (<) vagy egyenl (=), illetve a nagyobb (>) vagy egyenl
(=) mveletek legalbb egyike igaz.
A mveleteket opertoroknak, a mveletekben rsztvev adatokat operandusoknak, a
hasonltsokat pedig relcis mveleteknek (vagy egyszeren csak relciknak) is nevezik.
Trolsi mret
rtkes jegyek
Single
4 bjt
7-8
Double
8 bjt
15-16
Not A
A And B
A Or B
True
True
False
True
True
True
False
False
False
True
False
True
True
False
True
False
False
True
False
False
3 & 3 * 5 "315"
A hasonltsi mveletek kirtkelse a sztringek karakterei alapjn trtnik. Kt sztring egyenl (=), ha
egyforma hosszak s karaktereik rendre megegyeznek, egybknt nem egyenlk (<>). A kisebb (<),
illetve nagyobb (>) hasonltsi mveleteknl a sztringek els klnbz karakterprja hatrozza meg az
eredmnyt (lsd megjegyzs). Ha nincs ilyen karakter (az egyik sztring kezdszelete a msiknak), akkor a
rvidebb sztring lesz a kisebb.
Pl. "Alma" < "alma" True
"Kovcs" < "Kovcsn" True
"Kovacs" < "Kovcs" True
Megjegyzs
A sztringek sszehasonltsra az Option Compare (modulszint) utasts is hatssal van.
o Az Option Compare Binary (alaprtelmezett) esetben a karakterek (Windows
kdlapbeli) kdjai alapjn trtnik a hasonlts (A < B < E < Z < a < b < e < z
< < < < < < ).
o Az Option Compare Text utasts olyan sszehasonltst eredmnyez, amely nem
klnbzteti meg a kis- s nagybetket (case insensitive) ((A=a) < (=) < (B=b)
< (E=e) < (=) < (Z=z) < (=)).
Lehetsg van fix hossz sztringek hasznlatra is. Ekkor a String kulcssz utn (egy csillag
karakterrel elvlasztva) megadand a sztringek hossza is (pl. String * 30). Egy ilyen tpus
vltozban trolt sztring hossza fixen a tpusban rgztett hossz lesz (a pldban 30), a hosszabb
sztringek jobbrl csonkulnak, a rvidebbek pedig szkzkkel egszlnek ki. (A vltozkrl a
2.2.1. fejezetben lesz sz, a fix hossz sztringek hasznlatrl egy pldt a 2.5.2. s 2.5.3.
fejezetekben lthatunk.) Bizonyos esetekben (pl. vletlenelrs adatfjloknl) csak ez a
sztringtpus hasznlhat. A maximlis adathossz 2^16 darab karakter.
A sztringek minta alapjn trtn hasonltsra a Like mvelet hasznlhat.
Szintaktika:
[Private|Public] Enum name
membername[=constantexpression]
membername[=constantexpression]
...
End Enum
Private
Public
name
membername
constantexpression
Megjegyzs
Az Enum s End Enum utastsok kztti rsz (pldban szerepl) beljebb tagolsa csak az
ttekinthetsget segti.
Az Enum utasts modulszint utasts, azaz a modulok elejn helyezend el. A modulok
felptsrl a 3.2.5. fejezetben lesz sz.
Az egyes utastsok szintaktikjt a VBA fejlesztkrnyezet sgja alapjn adjuk meg.
2.2.1. Vltoz
Vltozn olyan azonostval elltott memriaterletet rtnk, ahol a vltoz tpusnak megfelel rtket
(pl. adatot, rszeredmnyt) trolhatunk. Egy vltozban trolt rtk a program vgrehajtsa sorn
megvltozhat innen ered az elnevezse , ilyenkor a vltozba kerl j rtk fellrja a rgit.
A vltozk hasznlatt ltalban megelzi azok deklarlsa, amikor is megadjuk a vltoz tpust. A
legtbb programozsi nyelvben (pl. C, Pascal) ktelez a vltozk deklarlsa, de a Visual Basic megengedi
a vltozk deklarci nlkli hasznlatt is. A deklarlatlan vltozk tpusa Variant lesz.
Mindazonltal a deklarlatlan vltozk (a knyelmes hasznlat mellett) lehetsges hibaforrsok is egyben
(pl. egy vltoz azonostjnak elgpelsbl add hiba csak futsidben derl ki), ezrt a VB kln
utastst biztost arra, hogy a vltozkat deklarlni kelljen. Az Option Explicit (modulszint) utasts
kiknyszerti a vltozk deklarlst azltal, hogy szintaktikai (formai) hibt kapunk egy nem deklarlt
vltoz hasznlatakor (lsd 3.2.6. fejezet).
A vltozk deklarlsnak (egyszerstett) szintaktikja:
Dim varname [As type] [,...]
varname
type
Pl.
Dim i As Integer
Dim v
Dim a,b As Single
Megjegyzs
A pldban szerepl sorok vgn magyarz megjegyzsek tallhatk, amelyeket a Visual Basic
Editor (lsd 3.2.4. fejezet) alaprtelmezetten zld sznnel emel ki.
Egy vltoz azonostjnak (mint minden ms programbeli azonostnak) be kell tartaniuk a VB
nvmegadsi szablyait (naming rules). Ezek tbbek kztt elrjk, hogy betvel kell kezddnie,
nem haladhatja meg a 255 karaktert, nem tartalmazhat specilis karaktereket (pl. ., !, @, &, $, #),
stb. Clszer olyan beszdes (azaz a vltoz szerepre, a benne trolt adatra/adatokra utal),
rvid, alfanumerikus karaktersorozatot hasznlni, amelyeknek nincs ms jelentsk a VB-ben.
Az azonostkban magyar kezetes bet s az alulvons karakter (_) is hasznlhat (pl.
v_H_Nap), de a kis s nagybetk kztt nincs klnbsg. Egy vltoz azonostja a
deklarlskor megadott formban jelenik meg hivatkozskor (pl. ha i-t deklarltunk, akkor az Ivel val hivatkozs i-re cserldik a kdszerkeszt ablakban).
Noha a deklarlt vltozknak a VB ad kezdrtket (a numerikus vltozk 0, a logikai vltozk
False, mg a String tpus vltozk res sztring kezdrtket kapnak), lehetleg csak olyan
vltozk rtkeit hasznljuk fel, amelyeknek korbban mr definiltuk az rtkt!
Tpusdeklarcis karakterek
A VB nyelv (hasonlan, mint a korbbi BASIC nyelvek) megengedi azt, hogy a nem deklarlt vltozk
tpust tpusdeklarcis karakterrel jelezzk. Ezek hasznlatnak jelentsge cskkent, hiszen a VB-ben
kiknyszerthetjk a vltozk deklarlst, amikor is explicit mdon meg kell adnunk a vltoz tpust.
A hasznlhat karakterek s a hozzjuk tartoz adattpusok:
% Integer, ! Single, # Double, $ String, @ Currency
Megjegyzs
Az els rtkadsnl megadott tpusdeklarcis karakter ksbb el is hagyhat.
A vltozk tpusa a Deftype utastsokkal (pl. DefInt, DefStr, ) is szablyozhat.
Pl.
i% = 2.8
c@ = 123456789012#
st$ = 2
st = st + st
Megjegyzs: A fenti pldk az rtkad utastst hasznljk, amirl rszletesen a 2.2.4. fejezetben lesz sz.
2.2.2. Kifejezs
Kifejezsen olyan szmtsi mveletsort rtnk, amellyel megmondjuk, hogy milyen adatokkal, milyen
mveleteket, milyen sorrendben kvnunk elvgezni. A kifejezs kirtkelsekor egy j rtk a kifejezs
rtke keletkezik.
A kifejezsben szerepelhetnek:
Konstansok, vltozk, fggvnyhvsok
Mveletek
Zrjelek
Pl. (-b+Sqr(b*b-4*a*c))/(2*a)
A pldban a 4 s 2 konstansok, az a, b, c vltozk, az Sqr a ngyzetgyk fggvny.
A mveletek prioritsa cskken ersorrendben:
Aritmetikai
o Hatvnyozs (^)
o Negci ()
o Szorzs, oszts (*, /)
o Egsz oszts hnyadosa, maradka (\, Mod)
o sszeads, kivons (+, )
Szveg sszefzs (&, +)
Hasonltsok (=, <>, <, >, <=, >=, Like, Is)
Logikai (Not, And, Or, Xor, Eqv, Imp)
Az egyes hasonltsok azonos prioritsak, az egsz oszts mveleteit s a logikai mveleteket cskken
priorits szerinti sorrendben adtuk meg.
A kifejezsek kirtkelsnek szablyai:
A zrjelbe tett kifejezsek s fggvnyhvsok operandus szintre emelkednek.
A magasabb priorits mveletek vgrehajtsa megelzi az alacsonyabb priorits mveletek
vgrehajtst.
Az azonos priorits mveleteknl a balrl-jobbra szably rvnyes, ami azt jelenti, hogy ezen
mveletek vgrehajtsa balrl jobbra haladva trtnik.
Megjegyzs
Ha szksges, akkor a tpuskonverzik automatikusan vgrehajtdnak.
Az Is mvelettel objektumhivatkozsok egyezse vizsglhat.
Pl.
3 * 4 <= 12 And "a" & 12 = "a12" True
3.8 \ 2 * 3 0
(3.8 \ 2) * 3 6
10
2.2.3. Fggvnyek
A programozsi nyelvek beptett fggvnyekkel segtik a szmolst, adatfeldolgozst. Ezeket csak
hasznlnunk kell, azaz a megfelel paramterekkel meg kell hvnunk ket. Az albbiakban (csoportokba
foglalva) felsorolunk nhny gyakran hasznlatos fggvnyt (de hangslyozzuk, hogy ez a felsorols
korntsem teljes, a VB-ben sokkal tbb fggvnyt hasznlhatunk).
Matematikai fggvnyek
Abs(X)
X abszolt rtke.
Exp(X)
Az exponencilis fggvny (ex) rtke az X helyen.
Log(X)
A termszetes alap logaritmus fggvny rtke az X helyen.
Sin(X)
X szinusza (X radinban adott).
Cos(X)
X koszinusza (X radinban adott).
Sqr(X)
X ngyzetgyke.
Int(X)
A legnagyobb egsz szm, amely mg nem nagyobb, mint X.
Rnd()
Egy vletlen szm a [0, 1) intervallumbl.
Pl.
Int(3.8) 3
Int(3.8) 4
Egy vletlen egsz szm az [a,b] intervallumbl: Int((b-a+1)*Rnd)+a
Megjegyzs: A paramterek nlkli fggvnyeknl az res zrjelpr elhagyhat (mint a pldban az Rnd
esetn).
Konverzis fggvnyek
Asc(X)
Az X karakter ASCII kdja.
Chr(X)
Az X ASCII kd karakter.
Str(X)
Az X numerikus adat szvegknt.
Val(X)
Az X szmot tartalmaz szveg numerikus rtke.
Pl.
Asc("A")65
Chr(65) "A"
Str(2.3)" 2.3"
Val("2.3") 2.3
CInt(2.6) 3
CSng("2,6") 2.6
Megjegyzs
Ezekbl a konvertl fggvnyekbl csak nhnyat ragadtunk ki, de minden egyszer
adattpushoz ltezik ilyen fggvny.
A kkkel kiemelt fggvnynevek (csakgy, mint a tbbi, kk sznnel kiemelt sz) kulcsszavak, nem
hasznlhatk msra (pl. egy vltoz azonostjnak).
Az talaktand X rtk tetszleges tpus rtk lehet (pl. szm, szveg, logikai rtk).
A CStr fggvny az opercis rendszerbeli tizedesjelet hasznlja (a plda azt az esetet szemllteti,
amikor a belltott tizedesjel a vessz).
11
Left("Alma",2) "Al"
Mid("Alma",3) "ma"
InStr(2,"alma","a") 4
Right("Alma",2) "ma"
Trim(" a b ") "a b"
InStr("alma","A") 0
Megjegyzs
Vezet szkzk levgsa: LTrim, zr szkzk levgsa: RTrim.
Ha a Mid fggvny Z paramtert nem adjuk meg, vagy megadjuk, de nincs annyi darab karakter
az Y-adik karaktertl kezdden, akkor az eredmny az X sztring utols karakterig tart.
Az InStr fggvny X paramtere elhagyhat, ekkor a keress az Y sztring els karaktertl indul.
Ltezik Mid utasts is, amellyel egy sztring karakterei ms karakterekre cserlhetk.
Dtum- s idkezel fggvnyek
Date
Az aktulis (opercis rendszerbeli) dtum.
Time
Az aktulis (opercis rendszerbeli) id.
Megjegyzs: A dtumok hasonlan kezelhetk, mint az Excel-ben (pl. a Date1 kifejezs a tegnapi
dtumot adja).
Adatformz fggvny
Format(X[,Y])
Pl.
Format(100/3,"0.00") "33,33"
Format(CDate("89.12.05"), "Long Date") "1989. december 5."
12
A vltoz azonostja.
A troland rtket meghatroz kifejezs.
i As Byte
255
i + 1
"szveg"
3.14
"a"
"2" + "2"
"2" + "2" * "2"
A pldban egy Byte tpusra deklarlt i s egy deklarlatlan (ezrt Variant tpus) v vltoznak adunk
klnbz rtkeket.
Az els rtkads a legnagyobb Byte tpus adatot teszi az i vltozba. Ezzel nincs semmi baj, de ekkor a
msodik rtkads tlcsordulsi (overflow) futsi hibt eredmnyez, hiszen a kifejezs rtke 256 lesz, ami
mr nem trolhat az i vltozban. Ha az i vltoz aktulis rtke (tartalma) nem 255, akkor az utasts
rendben vgrehajtdik, azaz az i vltozban eggyel nagyobb szm lesz, mint az rtkads eltt.
A harmadik s negyedik rtkads azt szemllteti, hogy egy Variant tpus vltozba klnbz tpus
adatokat is tehetnk.
Az tdik rtkads egy tpuskeveredsi (type mismatch) futsi hibt ad, hiszen egy (szmm nem
alakthat) szveget szeretnnk trolni egy numerikus vltozban.
Az utols kt rtkads az automatikus tpuskonverzit szemllteti. Az egyik rtkads kifejezsnek
eredmnye 22, hiszen kt db sztringet fznk ssze, de az i vltozba ennek a sztringnek az egsz
szmm alaktott rtke kerl. A msik rtkadsban a szorzs mvelet hajtdik vgre elszr (a nagyobb
priorits miatt), ezrt a szorzs operandusai szmm konvertldnak, majd sszeszorzdnak (4). Mivel a +
mvelet egyik operandusa numerikus, ezrt ez a mvelet az sszeads mvelet lesz (s nem a sztringek
sszefzse), ami szintn numerikuss alaktja a bal oldali operandust ("2"). Eredmnyl teht a 6 rtk
szmoldik ki, s troldik az i vltozban.
13
Tjkoztat zenet.
Az ablak fejlcben megjelen szveg.
Az adat alaprtelmezett rtke.
Pl.
Dim n As Integer
n = InputBox("Krem az adatok szmt!")
A plda egy egsz szm bekrst szemllteti, ahol csak a ktelez (prompt) paramtert adtuk meg. A
bekrt szveges adatot egy numerikus vltozba (n) tesszk (implicit tpuskonverzival), ezrt rossz adat
(pl. nem szmm alakthat szveg) megadsa esetn hibazenetet kapunk.
A fggvny vgrehajtsakor egy prbeszdablak jelenik meg (lsd 2.1. bra). Az adatot a beviteli mezben
kell megadni. A fggvny eredmnye az OK gomb megnyomsa (vagy az Enter billenty letse) esetn a
megadott szveg lesz, egybknt pedig (Cancel gomb, Esc billenty, ablak bezrs) az res sztring.
14
A kirand adat.
Az ablak nyomgombjait definil rtk.
Az ablak fejlcben megjelen szveg.
Pl.
MsgBox("2*3=" & 2*3)
MsgBox "2*3=" & 2*3
MsgBox 3^2,,"Hrom ngyzete"
Az els kt esetben a kirand adatot kt adat (egy szveg s egy szm) sszefzsvel lltottuk el, a
harmadik esetben nem adtuk meg a buttons paramtert. A megfelel prbeszdablakok a 2.2. brn
lthatk (az els kt MsgBox hvs ugyanazt eredmnyezi).
15
Szintaktika:
Debug.Print [outputlist]
outputlist
Pl.
Debug.Print ("2*3=" & 2*3)
Debug.Print "2*3="; 2*3; Tab(10); "3*4=; 3*4
Megjegyzs
A metdushvsokra a szubrutinok hvsi szintaktikja rvnyes (lsd 2.4.1. fejezet).
Ha a charpos pontosvessz, akkor az aktulis sorban folytatdik a kirs, egybknt meg a
kvetkez sor elejn, gy egy Debug.Print hvs utols adata utn kirakott vagy elhagyott
pontosvesszvel szablyozhat, hogy a kvetkez Debug.Print hol kezdje a kirst.
Ha a kirs mr meghaladta a Tab(n) ltal megadott oszlopot, akkor a kvetkez sor n-edik
oszlopban folytatdik a kirs.
A kirand adatok vesszvel is elvlaszthatk.
A Print metdus az opercis rendszerbeli tizedesjelet hasznlja.
Az Immediate ablak (lsd 3.2.1. fejezet) tartalma szerkeszthet. Szerkesztskor gyeljnk arra,
hogy a kirs majd attl a helytl kezddik el, ahol a kurzor llt, gy knnyen sszekeveredhetnek
az egyes futsok ltal kirt adatok. Clszer teht az ablakban lv szveg vgre llni (pl.
Ctrl+End), vagy trlni az ablak teljes tartalmt (pl. Ctrl+A, Del), mieltt elindtunk egy
programot, amely az Immediate ablakba r.
Az ismertetett utastsokon kvl ms eszkzk is rendelkezsnkre llnak arra, hogy a
programunk adatokat kapjon, illetve adatokat jelentsen meg. A 3.2.7. fejezetben vizulis vezrlk
segtsgvel, mg a 4.1.3. fejezetben Excel munkafzet segtsgvel valsul meg a felhasznli
input/output.
A VB ltalnos fjlkezelsrl nem lesz sz, de azt megemltjk, hogy a fjlkezel utastsok
segtsgvel adatainkat fjlba menthetjk, illetve onnan visszatlthetjk, gy kt klnbz futs
kztt is megrizhetjk adatainkat.
16
2.3. Vezrlszerkezetek
Az eddigiekben sz volt a vltozk deklarlsrl, az rtkad utastsrl, az adatbekr s adatkir
lehetsgekrl, gy ezekbl mr sszellthatunk egy olyan programot, amely bizonyos bemen adatokbl
valamilyen eredmnyadatokat szmol, s ezeket meg is jelenti. A megfelel utastsokat ilyenkor
egyszeren sorban egyms utn (szekvencilisan) megadjuk, illetve vgrehajtatjuk.
De mi van akkor, ha egy utastst csak egy adott felttel teljeslse esetn kell vgrehajtani, vagy ha egy
utastst tbbszr is vgre szeretnnk hajtani? Szksgnk van olyan eszkzkre, amelyekkel az egyes
tevkenysgek vgrehajtsi sorrendje elrhat. Ezeket az eszkzket vezrlszerkezeteknek nevezzk.
A strukturlt programozs hrom vezrlszerkezet hasznlatt engedi meg, ezek a szekvencia, a szelekci s
az iterci. Bizonytottan minden algoritmus megadhat ezekkel a vezrlszerkezetekkel, ezrt a feladatok
megoldsnl mi is csak ezeket fogjuk hasznlni.
Szekvencia:
Szelekci:
Iterci:
Megjegyzs
A strukturltsg s a forrsprogramok ehhez igazod tagolsa ttekinthetbb, ezltal knnyebben
karbantarthat programokat eredmnyez.
A VB megenged nem strukturlt programokat eredmnyez, specilis vezrlstad utastsokat
(pl. GoTo, Exit) is, de ezekkel nem foglalkozunk.
2.3.1. Szekvencia
A szekvencia vezrlszerkezetben a program utastsai (algoritmus esetn ez egyes lpsek, tevkenysgek)
egymst kveten, az utastsok megadsi sorrendjben hajtdnak vgre. A VB-ben az egyes utastsokat
ltalban kln sorokba rjuk, de egy sorba tbb utastst is rhatunk, ekkor az utastsok kz
kettspontot kell tenni.
Pl.
'Utastsok megadsa egy sorban (vgrehajts: balrl jobbra haladva)
Dim i As Integer: i = 3 * 5: MsgBox (i)
'Utastsok megadsa egymst kvet sorokban (vgrehajts: fentrl lefel)
Dim i As Integer
i = 3 * 5
MsgBox (i)
17
2.3.2. Szelekci
A szelekci vezrlszerkezet segtsgvel a vgrehajtand utastsok kztt szelektlhatunk, azaz
megadhatjuk, hogy mikor melyik utasts, illetve utastsok hajtdjanak vgre. Az albbiakban azt a
szelekcis utastst ismertetjk, amelyben a vgrehajtand utastsok (statements) logikai kifejezsekkel
(condition) vlaszthatk ki.
Az If utasts szintaktikja:
If condition Then [statements] [Else elsestatements]
vagy
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements]]
...
[Else
[elsestatements]]
End If
Az els esetben az egsz utasts egy sorba kerl (ekkor nem kell End If az utasts vgre), mg a
msodik esetben tbb sorba (ahol az egyes gakban lv utastsok beljebb tagolsa nem ktelez, de
javtja az ttekinthetsget).
Vgrehajts:
Az els teljesl felttelhez tartoz utastsok kerlnek vgrehajtsra.
Ha egyik felttel sem teljesl s az Else g definilt, akkor ezek az utastsok
(elsestatements) kerlnek vgrehajtsra.
Pl.
If d = 0
MsgBox
ElseIf d
MsgBox
Else
MsgBox
End If
Then
("Nulla")
> 0 Then
("Pozitv")
("Negatv")
Megjegyzs
Az egyes gakban jabb If utastsok is lehetnek, azaz az If utastsok egymsba gyazhatk.
A VB msik szelekcis utastsa a Select Case utasts, amely egy (ltalban nem logikai,
hanem pl. egsz, szveg) kifejezs rtke alapjn vlasztja szt az egyes gakat. Az utastst nem
rszletezzk, de megjegyezzk, hogy minden Select Case utasts felrhat If utasts
segtsgvel is.
18
2.3.3. Iterci
Az iterci vezrlszerkezet segtsgvel egy vagy tbb utasts ismtelt vgrehajtsa valsthat meg.
Azokat az utastsokat, amelyeket az iterci (vagy ms nven ciklus) ismtelten vgrehajt, ciklusmagnak
nevezzk. Hrom alapvet ciklusfajta ltezik: az elltesztel, a htultesztel s a nvekmnyes ciklus.
Az elltesztel ciklus a ciklust vezrl felttelt a ciklusmag vgrehajtsa eltt vizsglja, a htultesztel
ciklus pedig a ciklusmag vgrehajtsa utn. A nvekmnyes ciklus egy specilis elltesztel ciklus, amely a
ciklusmagot egy vltoz adott rtkei mellett hajtja vgre.
Mivel a ciklusszervezs a programozs egyik alapvet eleme, ezrt a magas szint programozsi nyelvek
(gy a VB is) mind a hrom ciklusfajtt tmogatjk. Ez lehetv teszi, hogy az adott feladathoz legjobban
illeszked ciklusfajtt vlasszuk, amivel a megoldsunk (programunk) rthetbb s ttekinthetbb lesz, de
megjegyezzk, hogy az elltesztel ciklussal a msik kt ciklusfajta is megvalsthat.
A VB ciklusszervez utastsait ismertetjk a tovbbiakban.
A While ciklus szintaktikja:
While condition
[statements]
Wend
Vgrehajts:
Amg a ciklust vezrl felttel (condition) igaz, addig vgrehajtdnak a ciklusmag utastsai
(statements).
A felttelt mindig a ciklusmag vgrehajtsa eltt vizsglja (elltesztel ciklus), ezrt lehet, hogy a
ciklusmag egyszer sem kerl vgrehajtsra (ekkor res ciklusrl beszlnk).
Megjegyzs: A ciklusmag utastsainak hatssal kell lennie a felttel igazsgrtkre (ez a Do ciklusra is
rvnyes), klnben a ciklus res ciklus, vagy vgtelen ciklus (ekkor a Ctrl+Break vagy az Esc billentykkel
lellthat a programfuts).
Pl.
i = 1
While i <= 3
MsgBox i: i = i + 1
Wend
Vgrehajts:
A ciklusmag (statements) vgrehajtsi felttele:
o counter<=end, ha step>=0
o counter>=end, ha step<0
A felttelt mindig a ciklusmag vgrehajtsa eltt vizsglja (elltesztel ciklus), ezrt lehet, hogy a
ciklusmag egyszer sem kerl vgrehajtsra.
A ciklusvltoz (counter) a ciklusmag minden egyes vgrehajtsakor a step rtkvel
megvltozik. A step megadsa nem ktelez, ha elhagyjuk, akkor az alaprtelmezett rtke 1.
19
Pl.
For i = 1 To 5 Step 2
MsgBox i
Next
Megjegyzs: A VB-ben ltezik egy olyan specilis ciklusutasts is (For Each), amelyben a ciklusvltoz
egy gyjtemny objektumain lpdel vgig (lsd 4.2.4. fejezet).
A Do ciklus szintaktikja:
Do [{While|Until} condition]
[statements]
Loop
vagy
Do
[statements]
Loop [{While|Until} condition]
Vgrehajts:
A ciklust vezrl felttel (condition) vizsglata az els esetben a ciklusmag (statements)
vgrehajtsa eltt (elltesztel ciklus), a msodik esetben pedig utna (htultesztel ciklus)
trtnik meg.
While kulcssz esetn, ha a felttel igaz, akkor a ciklusmag (ismtelt) vgrehajtsa kvetkezik,
egybknt a ciklusbl val kilps.
Until kulcssz esetn, ha a felttel igaz, akkor a ciklusbl val kilps trtnik, egybknt a
ciklusmag (ismtelt) vgrehajtsa.
A Do ciklusutasts teht egy olyan ltalnos ciklusszervez utasts, amellyel mind az elltesztel, mind a
htultesztel ciklusfajta megvalsthat, radsul gy, hogy a felttellel megadhatjuk az ismtls, illetve a
kilps felttelt is.
Megjegyzs
A ciklusmag utastsainak beljebb tagolsa nem ktelez, de az ttekinthetsg rdekben
clszer.
Az If utastshoz hasonlan a ciklusok is egymsba gyazhatk.
Vegyk szre a For ciklus step=0 esett, s a Do ciklust vezrl felttel elhagyhatsgt! Ekkor a
ciklusokbl val kilps az Exit For, Exit Do utastsok segtsgvel trtnhet, amelyeket a
strukturltsg megrzse rdekben nem emltettnk (de a VB megengedi a hasznlatukat).
20
2.4. Szubrutinok
Szubrutinon egy jl meghatrozott, nll tevkenysgsort megvalst, formailag is elklnl
programrszt rtnk. A szubrutinok tnyleges vgrehajtshoz ltalban egy msik, a szubrutint aktivizl,
azt meghv programrsz is szksges. Egy szubrutin tbbszr is meghvhat, gy annak szolgltatsai a
program megfelel helyein egy-egy hvssal ignybe vehetk.
A szubrutin a programtervezs, illetve programozs alapszint, de egyben alapvet fontossg eszkze.
Hasznlatukkal rvnyesthet az egysgbezrsi elv, miszerint egy adott feladat megoldshoz szksges
adatoknak s a rajtuk dolgoz algoritmusnak egy olyan egysge valsthat meg, amely csak a szksges
mrtkben kommunikl a klvilggal, a szubrutint hv programrszekkel, egybknt zrt, dolgait sajt
maga intzi, azokba nem enged bepillantst.
Megklnbztetjk a szubrutin deklarlst, ahol definiljuk a szubrutin ltal vgrehajtand
tevkenysgeket, a klvilggal val kapcsolattarts mdjt s szablyait, valamint a szubrutin hvst,
amikor felhasznljuk a szubrutin szolgltatsait, vagyis definilva a kapcsolattarts eszkzeit, kivltjuk a
tevkenysgsor egy vgrehajtst.
A kapcsolattarts legfbb, de nem kizrlagos (hiszen pl. mindenhonnan lthat (public) vltozkon
keresztl is trtnhet a kommunikci) eszkzei a paramterek.
A helyes programozsi stlus a teljes paramterezsre val trekvs. Ez azt jelenti, hogy egy szubrutin a
mkdshez szksges adatokat a paramterein keresztl kapja, s az eredmnyeket (a fggvnyrtk
kivtelvel) ezeken keresztl adja vissza. Ezzel ugyanis elkerlhet egy esetleges mdosts olyan
mellkhatsa, amely a program egy tvoli rsznek vgrehajtsakor, elre nem ltott, nem tervezett
vltozst, s ezzel tbbnyire nehezen felderthet hibt okoz.
Megjegyzs
A VBA-ban megrt sszes forrsprogram modulokba, azon bell szubrutinokba szervezett. Egy
VBA projekt felptsrl a 3.2.3. fejezetben lesz sz.
Az objektumorientlt programozs objektumtpusai (osztlyai) az adatoknak s a rajtuk dolgoz
algoritmusoknak egy mg ltalnosabb egysgt valstjk meg azltal, hogy az adatokhoz
nemcsak egy, de tetszleges szm algoritmus rendelhet. Az algoritmusokat megvalst
szubrutinok (ms terminolgival metdusok, tagfggvnyek) egyrszt ltjk az objektum
adatait, msrszt k definiljk, rjk le, modellezik az objektum viselkedst. Osztlyokat nem
fogunk definilni, de az Excel objektumait (lsd 4.1. fejezet) hasznlni fogjuk.
21
Private
Public
name
arglist
type
Vegyk szre, hogy a fggvny utastsai kztt szerepel egy olyan rtkad utasts is, amivel a fggvny
nevnek (name) mint vltoznak adunk rtket. Ez az utasts szolgl a fggvny eredmnynek a
belltsra. Tbb ilyen utasts is elhelyezhet a fggvny utastsai kztt, de clszer egyet elhelyezni,
azt is a fggvny vgn, azaz az End Function utasts eltt.
A formlis paramterek megadsnak szintaktikja:
[Optional][ByVal|ByRef][ParamArray]varname[()][As type][=defaultvalue]
Optional
ByVal
ByRef
ParamArray
varname
type
defaultvalue
A paramter elhagyhat.
A paramter tadsa rtk szerinti.
A paramter tadsa cm szerinti (ez az alaprtelmezs).
Tetszleges szm Variant tpus paramter tadshoz.
A paramter azonostja.
A paramter tpusa.
Az opcionlis paramter alaprtelmezett rtke.
Az eljrs hvsnak kulcsszava (Call) elhagyhat. Megadsakor az argumentumlistt zrjelbe kell tenni,
ha elhagyjuk, akkor a zrjelet is el kell hagyni.
22
Fggvny hvsa
A fggvnyek kifejezsek rszeknt hvhatk (hasonlan, mint a VB fggvnyei), azaz a fggvnyhvs
brhol llhat, ahol egy, a fggvny eredmnynek megfelel rtk llhat (pl. egy rtkad utasts jobb
oldaln). Az aktulis paramterek zrjelei nem hagyhatk el.
Egy szubrutin hvsakor megtrtnik az aktulis s formlis paramterek megfeleltetse (a paramterek
tadsa), majd a vgrehajts a hvott szubrutin utastsaival folytatdik. A hvott szubrutin befejeztvel a
vgrehajts a hvst kvet utastssal folytatdik.
Hvs megnevezett paramterekkel
Ez a fajta szubrutinhvs knyelmes hvst biztost olyan szubrutinok esetn, amelyeknek sok opcionlis
paramtere van. Elegend csak azokat a paramtereket s aktulis rtkeiket felsorolni, amelyeket t
akarunk adni, a tbbinek meghagyjuk az alaprtelmezett rtkt.
Pl.
ActiveWorkbook.SaveAs FileName:="Mentes.xls"
A pldban egy objektum egy metdust hvtuk meg, ami az aktv munkafzetet menti el a megadott
nvvel. Az objektumokrl s a metdusokrl a 2.6., illetve 4.1. fejezetekben lesz sz.
Megjegyzs
ltalban a programnyelvekben kttt a szubrutinok deklarlsnak s hvsnak sorrendje,
nevezetesen a deklarlsnak meg kell elznie (forrskd szinten) a hvst, de a VB megengedi,
hogy egy szubrutint a hv szubrutin utn deklarljunk.
Egy fggvny eljrsknt is meghvhat (pl. ha a fggvny eredmnyre nincs szksgnk). Ekkor
az eljrs hvsi szablyai rvnyesek. A pldinkban szerepl MsgBox fggvnyt is eljrsknt
hvtuk meg a Call sz elhagysval. Az egyetlen paramtert nhol zrjelbe raktuk, de ekkor a
zrjelek nem a MsgBox fggvny zrjelei, hanem a paramter egy felesleges zrjelezse.
Ha egy szubrutint eljrsknt hvunk meg egyetlen paramterrel s elhagyjuk a Call szt, akkor a
paramter esetleges (felesleges) zrjelezsvel a paramter tadsa rtk szerinti lesz.
A metdushvsokra a szubrutinok hvsi szablyai rvnyesek.
A megnevezett paramterek tetszleges sorrendben megadhatk. A paramterek neve s rtke
kz a legyen egyenl (:=) jelet, mg a paramterek kz vesszt kell tenni.
2.4.2. Mintafeladat
A szubrutinok deklarlst s hvst az albbi feladat segtsgvel szemlltetjk.
Feladat: Fordtsunk meg egy adott sztringet!
Pl.Rti pipitr rtipip itR
Az albbiakban mind fggvnnyel, mind eljrssal megoldjuk a feladatot, s mindkt esetben egy hv,
tesztel szubrutint is ksztnk. Erre azrt van szksg, mert a paramterekkel rendelkez szubrutinok
nem futtathatk kzvetlenl (lsd 3.2.6. fejezet), mrpedig a megold fggvnynek, illetve eljrsnak lesz
paramtere. A paramtert a megfordtand sztring tadsra, az eljrssal trtn megolds esetn mg az
eredmny visszaadsra is hasznljuk.
Az els megoldsban (Fordit fggvny) a kezdetben res eredmnysztringhez (er) jobbrl hozzfzzk
a sztring karaktereit fordtott sorrendben, azaz elszr a legutolst, majd az utols elttit, legvgl az elst.
Amikor az eredmnysztring elllt, akkor a megfelel rtkadssal (amikor is a fggvny neve rtket kap)
gondoskodunk az eredmny belltsrl.
A msodik megoldsban (MegFordit eljrs) a kezdetben res eredmnysztringhez (er) balrl
hozzfzzk a sztring karaktereit eredeti sorrendben, aminek eredmnyeknt a sztring els karaktere kerl
23
az eredmnysztring legvgre, a msodik karaktere lesz az utols eltti, vgl az utols karaktere kerl az
eredmnysztring legelejre.
Termszetesen a megoldsok lnyegt ad ciklusok lehetnnek egyformk is, de a ktfajta megkzeltssel
azt szerettk volna rzkeltetni, hogy mg egy ilyen egyszer feladatnak is ltezhet tbbfle megoldsa.
Megjegyzs: Olyan megolds is elkpzelhet, amelyben a sztring megfelel karakterprjait cserlgetjk fel.
Az els karaktert az utolsval kell kicserlni, a msodikat az utols elttivel, s gy tovbb.
'Sztring megfordtsa fggvnnyel
Function Fordit(st As String) As String
Dim i As Integer
Dim er As String
er = ""
For i = Len(st) To 1 Step -1
er = er + Mid(st, i, 1)
Next
Fordit = er
End Function
'A Fordit tesztjhez ez indtand
Sub Teszt1()
'Hvskor a cm szerinti (ByRef) paramter (st) helyn llhat rtk is
MsgBox Fordit("Kitn vt rokonok orrtvn tik")
End Sub
'Sztring megfordtsa eljrssal
Sub MegFordit(st As String)
Dim i As Integer, er As String
er = ""
For i = 1 To Len(st)
er = Mid(st, i, 1) + er
Next
'A cm szerinti (ByRef) paramterben (st) adjuk vissza az eredmnyt
st = er
End Sub
'A MegFordit tesztjhez ez indtand
Sub Teszt2()
Dim s As String
'Call esetn kell a zrjel
s = "Indul a grg aludni": Call MegFordit(s): MsgBox s
'Call nlkl nem kell a zrjel
s = "Gza kk az g": MegFordit s: MsgBox s
End Sub
A fejezet lezrsaknt megjegyezzk, hogy a VB nem engedi meg a szubrutinok egymson belli
deklarlst, de a rekurzit (amikor is egy szubrutin nmagt hvja meg, vagy tbb szubrutin hvja egymst
klcsnsen) igen. A rekurzv algoritmusok irnt rdekldknek a szakirodalmat (pl. [3], [4]) ajnljuk.
24
2.5.1. Tmbk
A tmb egy ltalnosan s gyakran hasznlt eszkz a szoftverfejlesztk, programozk krben, mivel a
tmbkkel knyelmesen kezelhetnk tbb, azonos tpus adatot. Az adatok elrsre, vagyis a tmbk
elemeinek kivlasztsra sorszmokat, ms nven indexeket hasznlunk.
Ha az elemeket egy sorszmmal azonostjuk, akkor egydimenzis tmbrl, ha kt sorszmmal, akkor
ktdimenzis tmbrl, ha n db sorszmmal azonostjuk, akkor n dimenzis tmbrl beszlnk. Egy tmb
egy elemnek kivlasztshoz teht pontosan annyi index szksges, ahny dimenzis az adott tmb.
Ahogy az egyszer adattpusok esetn is megklnbztettk az adatot (pl. 3) az t trol vltoztl (pl. i)
s annak tpustl (pl. Integer), itt is kitrnk ezek klnbzsgre. A tmb elnevezs ugyanis a
rvidsge miatt mind a hrom esetben hasznlatos, gy a tmb lehet:
Tmbadat: amely egydimenzis tmb esetn egy adatsornak, vagy matematikai fogalommal egy
vektornak, ktdimenzis tmb esetn egy adattblzatnak, vagy mtrixnak felel meg.
Tmb adattpus: amely definilja a tmb dimenziit s a tmb elemeinek tpust.
Tmbvltoz: amelyben az adatok troldnak. Egy elem kivlasztsval, azaz a tmbvltoz
indexelsvel egy, a tmb elemtpusval megegyez tpus vltozt hivatkozunk.
Egy tmbt a hasznlata eltt deklarlni kell, azaz definilnunk kell a tmb elemeinek tpust s a tmb
dimenziit.
A deklarls (egyszerstett) szintaktikja:
Dim varname[([subscripts])] [As type] [,...]
Pl.
Dim a(10) As Integer
Dim b(1 To 5, -3 To 2) As Double
'Egydimenzis tmb
'Ktdimenzis tmb
Vegyk szre, hogy az egyes dimenzik als indexhatra elhagyhat. Az explicit mdon nem definilt als
indexhatrok rtkeit az Option Base (modulszint) utasts hatrozza meg.
Az utasts szintaktikja:
Option Base {0|1}
Ha egy tmb mrett kisebbre lltjuk, akkor az eltnt tmbelemek rtkeit elvesztjk, mg egy tmb
mretnek nvelsekor keletkez j elemek (a deklarlt vltozkhoz hasonlan) numerikus elemtpus
tmb esetn 0, a logikai elemek esetn False, mg String tpus esetn az res sztring kezdrtket
kapjk. Ilyen rtkeket kapnak az j tmb elemei akkor is, ha a Preserve kulcsszt elhagyjuk.
Szintaktika:
ReDim [Preserve] varname(subscripts) [As type] [,...]
Pl.
Dim a() As Integer
ReDim a(5)
For i = 1 To 5
a(i) = i
Next
ReDim Preserve a(10)
Megjegyzs
A pldban feltettk, hogy a modulban az Option Base 1 utasts van rvnyben.
Egy dinamikus tmb tbbszr is tmretezhet, de az elemek tpusa nem vltoztathat meg.
A dinamikus tmbk a ReDim utastssal kzvetlenl (a Dim utasts nlkl) is deklarlhatk,
ekkor az elemek tpust is itt adjuk meg (pl. ReDim a(5) As Integer).
Az, hogy statikus vagy dinamikus tmbket hasznlunk-e egy feladat megoldsa sorn, az attl fgg, hogy
ismerjk-e elre az adatok maximlis szmt vagy sem. Ha ismerjk, akkor statikus (az adott maximumra
deklarlt) tmbt hasznlunk, s az adatok aktulis szmt egy kln vltozban troljuk. Ebben az
esetben csak akkor lesz helypazarl a megoldsunk, ha az adatok maximlis szma (azaz a tmb ltal
lefoglalt memria mrete) jval nagyobb, mint az adatok aktulis szma.
Ha az adatok maximlis szmt nem tudjuk elre meghatrozni, akkor a megoldst dinamikus tmbkkel
vgezzk. Ebben az esetben a tmbt mindig akkorra deklarljuk, hogy az adataink ppen elfrjenek
benne, gy a megolds sose foglal le tbb memrit, mint amennyi szksges.
A VB az UBound (fels hatr) s LBound (als hatr) fggvnyekkel biztostja a tmbk deklarlt
indexhatrainak lekrdezhetsgt.
Szintaktika:
UBound(arrayname[,dimension])
LBound(arrayname[,dimension])
arrayname
dimension
A tmb azonostja.
A lekrdezend dimenzi sorszma (alaprtelmezett rtke 1).
Pl.
Dim a(10) As Integer
Dim b(1 To 5, -3 To 2) As Double
UBound(a) 10
LBound(a) 0
UBound(b) 5
LBound(b) 1
UBound(b,2) 2
LBound(b,2) 3
26
2.5.2. Rekordok
A tmbk (legyenek azok egy-, vagy tbbdimenzisak) azonos tpus adatok egy sszessgnek hasznlatt
biztostottk. Ha azonban klnbz tpus adatok egy sszessgt szeretnnk egytt kezelni, akkor egy
jabb tpust, a rekord adattpust kell hasznlnunk. A rekord adattpussal ugyanis tbb, tetszlegeses szm
s tpus adatot foglalhatunk egy logikai egysgbe.
Ezt az adattpust kln kell definilnunk, ugyanis meg kell adnunk a rekord felptst, azaz a rekordot
alkot mezk azonostjt s tpust.
A rekordtpus megadsnak (egyszerstett) szintaktikja:
Type name
elementname[([subscripts])] As type
elementname[([subscripts])] As type
...
End Type
name
elementname
subscripts
type
A rekordtpus azonostja.
Az adott mez azonostja.
Ha a mez tmb, akkor annak indexhatrai.
Az adott mez tpusa.
Pl.
Type Adat
Nev As String * 20
Jegyek(1 To 2) As Byte
End Type
A plda egy olyan rekordtpust (Adat) definil, amelynek kt mezje van. Az els mez (Nev) egy fix
hossz sztring, a msodik mez (Jegyek) egy 2 elem, egydimenzis, Byte elemtpus tmb.
Megjegyzs
Az egyes mezk beljebb tagolsa nem ktelez, csak az ttekinthetsget segti.
A pldban fix hossz sztringtpust (String * 20) hasznltunk, de a vltoz hossz String
tpust is hasznlhattuk volna.
A Type utasts modulszint utasts.
Egy definilt rekordtpus ugyangy hasznlhat vltozk deklarlsra, mint a VB tbbi adattpusa.
Pl.
Dim h As Adat, a(1 To 3) As Adat
A plda kt vltozt deklarl. A h vltozban egy rekord adatai trolhatk, mg az a vltoz hrom rekord
trolsra alkalmas.
A rekord mezire val hivatkozs:
rekordvltoz.meznv
27
Pl.
h.Nev = "Halsz Helga"
a(1).Jegyek(1) = 5
A mezkre val hivatkozs a With utasts segtsgvel rvidthet. Ekkor a rekordvltozt elegend
egyszer megadni (a With kulcssz utn), a meznevek eltt elhagyhatjuk, de a pontot ki kell tennnk.
Pl.
With a(2)
.Nev = "Vadsz Viktria": .Jegyek(1) = 3: .Jegyek(2) = 4
End With
A plda a korbban deklarlt a tmb msodik elemben trolt rekord egyes mezinek ad rtket.
Megjegyzs
A With utasts objektumokra is hasznlhat. Az objektumokrl a 2.6., illetve 4.1. fejezetekben
lesz sz.
A With blokkban szerepl utastsok beljebb tagolsa nem ktelez, csak az ttekinthetsget
segti.
A With utastsok egymsba gyazhatk.
A rekord sz a szakirodalomban ltalnosan hasznlt (ezrt a dokumentumban is ezt hasznltuk),
de a VB sgja a rekord adattpusra a felhasznl ltal definilt adattpus (user-defined data type)
elnevezst hasznlja.
Az sszetett adattpus (tmb, rekord) deklarlt vltozk is kapnak kezdrtket, amit a
tmbelemek, illetve az egyes mezk tpusa hatroz meg (lsd 2.2.1. fejezet).
2.5.3. Mintafeladat
A tmbk s rekordok hasznlatt az albbi feladat segtsgvel szemlltetjk.
Feladat: Egy hallgati nyilvntartsban ismerjk a hallgatk nevt s adott szm rdemjegyt. Minden
hallgatnak ugyanannyi rdemjegye van. Az adatokat egy rekordokbl ll egydimenzis tmbben
troljuk. Ksztsnk nvsor szerint rendezett listt, amelyen a hallgatk rdemjegyei is szerepelnek!
Az albbi megoldsban elszr egy konstanst deklarlunk, amely definilja a hallgatk rdemjegyeinek
szmt. Az olyan rtkeket, amelyek a programban tbb helyen is szerepelnek, clszer nvvel elltni, azaz
kln deklarlni, mert akkor az rtk esetleges mdostshoz elegend egy helyen (a deklarciban)
mdostanunk.
A konstansok deklarlsnak szintaktikja:
[Public|Private] Const constname [As type] = expression
Public
Private
constname
type
expression
Pl.
Const db = 2
28
Megjegyzs
Az utasts modul szinten is, s szubrutinon bell is hasznlhat. Az utbbi esetben a konstans
csak az adott szubrutinon bell hivatkozhat, s a lthatsgt (hivatkozhatsgt) nem lehet a
Public s Private kulcsszavakkal mdostani.
A konstans rtkt megad kifejezsben konstans rtkek, deklarlt (nvvel azonostott)
konstansok, valamint mveletek llhatnak.
A tpust (type) ltalban elhagyjuk (a pldban is gy tettnk), ekkor a konstans tpusa a kifejezs
rtknek legmegfelelbb tpus lesz (esetnkben Byte).
A konstans definilsa modul szinten trtnt, hiszen az egsz modulban szeretnnk hasznlni. A
rekordtpus (amely lerja egy hallgat adatait) deklarcija viszont csak modul szinten (azaz a modul elejn)
trtnhet. A nevekhez fix hossz sztring tpust hasznltunk, amely nem engedi meg, hogy a nevek a
megadott hossznl (a pldban 20) hosszabbak legyenek.
Az adatok kirst egy szubrutin (Kiiras) vgzi, amely egy Adat rekordokbl ll tmbt kap
paramterknt (a), amit a paramter utn szerepl (res) zrjelpr jelez. A kapott tmbt egydimenzis
tmbknt kezeljk, s feltesszk, hogy a tmb minden eleme definilt, amit a Kiiras szubrutin hvja
(RendezesTeszt) biztost, ezrt a tmbelemeken vgiglpdel ciklus szervezst a tmb lekrdezett
(LBound, UBound) indexhatrai alapjn vgezhetjk. Az adatkirsok utn akkor emelnk sort (egy
paramter nlkli Debug.Print hvssal), ha az adott hallgat sszes adatt (nv, rdemjegyek) kirtuk,
gy minden hallgat kln sorba kerl. Az eredmnylista a 2.3. brn lthat. Vegyk szre a nevek jobbrl
szkzkkel val feltltttsgt (ez a fix hossz sztringek rtkadsakor automatikusan megtrtnik).
tmb msodik elemben troljuk, hiszen a modulban alaprtelmezsben az Option Base 0 rvnyes)
adatainak megadsakor a rekordmezkre a With utasts segtsgvel hivatkoztunk, hogy ezt is
bemutassuk.
Megjegyzs
A megolds csak a VB nyelv lehetsgeit hasznlta, gy szksg volt egy rendez algoritmus
programozsra. Ha azonban kihasznltuk volna az Excel VBA lehetsgeit, akkor a hallgatk
adatait egy Excel munkalapon trolva egyetlen metdushvssal elintzhet lett volna az adatok
rendezse. Az Excel objektumairl s hasznlatukrl a 4.1. fejezetben lesz sz.
Igen sokfle rendez algoritmus ismert, amelyekbl ez egyik legegyszerbbet vlasztottuk ki. A
tmakr irnt rdekldknek a szakirodalmat (pl. [3], [4]) ajnljuk.
'Egy hallgat rdemjegyeinek szma
Const db = 2
'Egy hallgat adatait ler rekordtpus
Type Adat
Nev As String * 20
'Fix (20) hossz sztring
Jegyek(1 To db) As Byte
End Type
'Adat tpus elemekbl ll tmb kirsa
Sub Kiiras(a() As Adat)
Dim i As Integer, j As Integer
For i = LBound(a) To UBound(a)
Debug.Print a(i).Nev;
For j = 1 To db
Debug.Print a(i).Jegyek(j);
Next
Debug.Print
Next
End Sub
'Adat tpus elemekbl ll tmb rendezse nv szerint
Sub Rendezes(a() As Adat)
Dim cs As Adat, i As Integer, j As Integer, k As Integer
For i = LBound(a) To UBound(a) - 1
k = i
For j = i + 1 To UBound(a)
If a(j).Nev < a(k).Nev Then
k = j
End If
Next
If k > i Then
cs = a(i): a(i) = a(k): a(k) = cs
End If
Next
End Sub
30
31
3.1. Makrk
A makr parancsok sorozata, amely ismtld feladatok vgrehajtsnak automatizlsra hasznlhat.
idzet az Excel sgjbl. A makr sz az adott MS Office (esetnkben az MS Excel) alkalmazs
programfejleszt krnyezetben ltrehozott objektumok s VBA forrskdok ltalnos, sszefoglal
elnevezse. Az Excel 2010 a makrkat tartalmaz dokumentumokra a Makrbart Excel munkafzet
elnevezst hasznlja. A makrkat tartalmaz dokumentumokat ilyen fjlknt mentsk (ezek kiterjesztse
xlsm).
A makrvrusok elterjedsnek megakadlyozsa rdekben az Excel bizonyos belltsai a makrkat
tartalmaz dokumentumok kezelsre vonatkoznak. A Fjl, Belltsok, Adatvdelmi kzpont (lsd 3.1.
bra) ablakban a jobb als sarokban tallhat Az Adatvdelmi kzpont belltsai nyomgomb
segtsgvel (tbbek kztt) megadhatk a makrkra vonatkoz belltsok is (lsd 3.2. bra).
32
33
34
35
Megjegyzs
A Visual Basic Editor-ban ltrehozott makrkat nem kell kln menteni, ezek a munkafzet
mentsekor elmentdnek. A Visual Basic Editor ments (Save) funkcija az egsz munkafzetet
menti (csakgy, mint az Excel-beli ments funkci).
Bizonyos ablakok (pl. Project, Properties, Immediate) rgzthetk (dockable) a munkaterleten,
st akr a Visual Basic Editor ablakn kvlre is mozgathatk. Az ablakelrendezs (mely ablakok
hol s mekkora mretben jelennek meg) megrzdik, minden belpskor a legutbbi
ablakelrendezsben jelenik meg a Visual Basic Editor.
A nem rgzthet ablakok a nyitson s zrson kvl mg minimalizlhatk (amikor is ikonknt a
munkaterlet aljra kerlnek) s maximalizlhatk (ilyenkor a teljes munkaterletet kitltik
eltakarva egymst). A nyitott ablakok kztti vlts a kvnt ablakon val kattints mellett, a
Window men segtsgvel is elvgezhet, amely a Windows alkalmazsokban szoksos
funkcikkal (ablakok klnfle elrendezse, a nyitott ablakok listja, stb.) rendelkezik (lsd 3.8.
bra).
36
Megjegyzs
A Print s a ? a Debug objektum Print metdust (Debug.Print) hivatkozza rviden.
Nem minden VB utasts hajthat vgre az Immediate ablakban (pl. Dim utasts).
Termszetesen itt is csak szintaktikailag helyes utastsok hajthatk vgre. Az esetleges
hibazenetet az Enter billenty letse utn kapjuk meg (szemben a kdszerkeszt ablakban bert
utastsokkal, ahol mr a szintaktikailag hibs sor elhagysakor megkapjuk a megfelel
hibazenetet, ha az erre vonatkoz kapcsol (Auto Syntax Check, lsd 3.2.4. fejezet 3.20. bra)
bekapcsolt llapot.
Az Immediate ablakban csak akkor lehet utastsokat vgrehajtani, ha a munkafzetre vonatkoz
biztonsgi belltsok engedlyezik a makrk futtatst (lsd 3.1. fejezet).
37
Az objektumokhoz tartoz modulok megnyitsa (a Project ablak megfelel elemnek kivlasztsa utn) a
View men Code funkcijval (lsd 3.8. bra), vagy a Project ablak helyi menjnek View Code
funkcijval (lsd 3.10. bra) trtnhet. A modulok csoport moduljait mg (a megfelel modulon val)
dupla kattintssal is megnyithatjuk.
j objektum ltrehozsa a Visual Basic Editor Insert menjvel (lsd 3.9. bra), vagy a Project ablak helyi
menjvel (lsd 3.10. bra) trtnhet. A menkben tallhat menpontok vlaszthatsga az aktulis
llapottl (kdszerkesztsben voltunk-e ppen vagy sem), illetve a Project ablak aktulis elemtl fgg.
38
39
Megjegyzs
Az Alphabetic fln a nv (Name) tulajdonsg nem a nvsor szerinti helyn jelenik meg, hanem a
lista elejn.
A Categorized fln az egyes tulajdonsg csoportok (mint pl. megjelens (Appearance), viselkeds
(Behavior)) az elttk megjelen (mnusz, plusz) ikonokkal becsukhatk (egysoross), illetve
kinyithatk.
A tulajdonsgok nevbl ltalban mr kiderl a szerepk, de a tulajdonsg ablakban is l a
krnyezetfgg sg, gy az aktulisan kivlasztott tulajdonsg sgjhoz elegend letni az F1
billentyt.
Bizonyos tulajdonsgok (pl. BackColor, ForeColor) rtke tbbfle (pl. begpels, vlaszts)
mdon is megadhat.
Csoportos kijells esetn (lsd 3.2.7. fejezet) a Properties ablakban a kijellt vezrlk kzs
tulajdonsgai jelennek meg (pl. a Name tulajdonsg ekkor nem lthat), s ezek egyszerre
mdosthatk.
Az ablak tetejn lv legrdl listban olyan vezrl is kivlaszthat, amely nem jelenik meg a
formon tervezskor, gy nem tudunk rkattintani (pl. ha vletlenl olyan pozcit (lsd Left, Top
tulajdonsgok) adtunk meg, amivel a vezrl lekerlt a formrl).
Vannak olyan tulajdonsgok, amelyek csak futsi idben rhetk el, s vannak olyanok is, amelyek
csak olvashatk (read-only) (pl. ListBox.ListCount).
A fontosabb tulajdonsgokrl a vizulis formtervezsben (lsd 3.2.7. fejezet) lesz sz.
40
modul elejre pozcionl (azaz a deklarcis rszre, ahol a modulszint utastsok tallhatk, lsd 3.2.5.
fejezet), egybknt meg a kivlasztott szubrutin elejre.
3.14. bra. A legrdl listk tipikus tartalma egy formhoz tartoz modul esetn
A bal oldali listban (a (General) elemen kvl) az adott modul objektumai (azok nevei) jelennek meg (pl.
egy form moduljban a form s a rajta tallhat vezrlk (lsd 3.14. bra), a munkafzethez tartoz
modulban a munkafzet objektum). Ha egy objektum van kivlasztva a listban (s nem a (General) elem),
akkor a kivlasztott objektumhoz tartoz esemnykezelk (mint szubrutinok) nevei jelennek meg a jobb
oldali listban (lsd 3.14. bra). A mr definilt esemnykezelk nevei flkvren jelennek meg. Egy mg
nem definilt esemnykezel kivlasztsa ltrehozza az adott esemnykezelt res tartalommal, amit
szerkeszthetnk (lsd 3.15. bra), egybknt meg a kivlasztott esemnykezel elejre ugrik a kurzor a
kdszerkeszt ablakban.
41
43
44
For j = 1 To n
Debug.Print Tab(j * msz + 1); i * j;
Next
Debug.Print
Next
End Sub
45
46
47
3.25. bra. Egy trsponton felfggesztett programfuts a Watches s az Add Watch ablakokkal
48
49
3.2.8. Mintafeladat
Ebben a fejezetben egy nem tl bonyolult, de azrt mr kellen sszetett feladat megoldst mutatjuk be.
Az egyszersg s a knnyebb kvethetsg rdekben a teljes feladatot tbb rszfeladatra bontottuk.
1. Feladat: Ksztsnk adatbeviteli formot tbb adat megadsra!
Megolds: Ahhoz, hogy tbb adat megadhat legyen, biztostanunk kell egy olyan vezrlt, amelyben egy
adat megadhat, s egy olyat, amelyben az eddig megadott adatok megtekinthetk. Egy beviteli mezt s
egy lista vezrlt fogunk hasznlni. A beviteli mezben megadott adat felvtelt, elfogadst egy (Felvtel
felirat) nyomgombbal krhetjk. A kt vezrlt cmkkkel is elltjuk (lsd 3.27. bra).
Elvgzend tevkenysgek:
A form ltrehozsa (Insert men, UserForm funkci).
A vezrlk formon val elhelyezse (kattints a megfelel vezrln, majd a formon, esetleges
mozgats, mretezs).
Feliratok megadsa (Caption tulajdonsgok a Properties ablakban).
A Felvtel gomb kattints esemnykezeljnek megrsa (pl. duplakattints a Felvtel
nyomgombon ltrehozza az res esemnykezelt). Az esemnykezelben a lista elemeit kell
bvteni a beviteli mezben megadott adattal.
50
Az esemnykezel forrskdja:
'Felvtel (minden adatot felvesz)
Private Sub CommandButton1_Click()
ListBox1.AddItem TextBox1.Text
End Sub
krnyezetfgg (azaz a krdjel ikonnal (vagy az F1 letsvel) ppen a 3.30. brn lthat sgtartalom
jelenthet meg, de ha a jobb oldali listban vlasztunk ki egy elemet (pl. AddItem), akkor az ahhoz tartoz
sgoldal jelenik meg).
52
Else
ListBox1.AddItem st
End If
End Sub
4. Feladat: Legyen a formon egy OK s egy Mgsem felirat nyomgomb! Az OK megnyomsra rjuk ki
a megadott elemek szmt, a Mgsem megnyomsra zrjuk be a formot!
Megolds: Kt j nyomgomb (OK, Mgsem) formra helyezse, feliratok megadsa. A listban lv
elemek szma a lista ListCount tulajdonsgval kaphat meg. A form bezrsra az End utastst
hasznljuk, ami befejezi a program futst.
Az esemnykezelk forrskdja:
'OK gomb
Private Sub CommandButton3_Click()
MsgBox "A megadott adatok szma:" & ListBox1.ListCount
End Sub
'Mgsem gomb
Private Sub CommandButton4_Click()
End
End Sub
53
Megjegyzs
A keresciklusban az i vltoz rtkt 1-tl indtottuk ListCount-ig, s a lista elemeire val
hivatkozsnl korrigltunk (hogy j legyen az elemekre trtn hivatkozs). Termszetesen 0-tl
ListCount1-ig is lpkedhettnk volna, ekkor az i-edik (s nem az i-1-edik) elemre kellene a
ciklusban hivatkozni.
A keressre azrt hasznltunk elltesztels ciklust, mert a lista lehet res is. Ekkor ugyanis a
ciklusmagban a listaelemre trtn hivatkozs (futsi) hibt eredmnyezne, azaz a ciklusmagot
res lista esetn nem szabad vgrehajtani.
Az alkalmazott keres algoritmust soros (lineris, szekvencilis) keressnek nevezik, mert sorban
vizsglja meg azokat az adatokat, amelyek kztt keresnk. Ha esetleg rendezett adatok kztt
kellene keresni, akkor egy hatkonyabb, n. binris keress (lsd szakirodalom, pl. [3]) is
hasznlhat lenne. Ez a keress ugyanis egy sikertelen hasonlts utn felre cskkenti azon
elemek szmt, amelyek mg szbajhetnek az elem megtallst illeten. A soros keress csupn
egyetlen (az ppen megvizsglt s nem egyez) elemmel cskkenti a tallatra eslyes elemek
halmazt.
54
4. AZ EXCEL PROGRAMOZSA
Az eddigi fejezetek ltalnos ismereteket adtak a Visual Basic nyelvrl, a Visual Basic Editor
fejlesztkrnyezetrl, a vizulis tervezsrl, s ltalban a fejleszts mikntjrl, de nem hasznltk az
Excel objektumait, a VBA-ban kszen kapott objektumhierarchia lehetsgeit. Ebben a fejezetben a
fontosabb Excel objektumokrl, s azok forrskdbl trtn hasznlatrl lesz sz.
4.1.2. Gyjtemnyek
A gyjtemnyek azonos tpus objektumok egy sszessge. Egy gyjtemny elemeire indexekkel (1-tl
indul sorszmokkal) hivatkozhatunk (pl. Workbooks(1).Worksheets(1).Cells(1,1)). Ha egy gyjtemny
elemei rendelkeznek nv (Name) tulajdonsggal, akkor az elemekre a nevkkel is hivatkozhatunk (pl.
Workbooks(Munkafzet1.xlsm).Worksheets(Munka1).Cells(1,1)).
A gyjtemnyek rendelkeznek Count tulajdonsggal, amivel a gyjtemny elemeinek szma kaphat meg,
s tbbnyire Add metdussal is, amivel a gyjtemny egy jabb elemmel bvthet. A tovbbi
tulajdonsgok s metdusok (pl. az elemek trlsre szolgl Delete metdus) ltezse az egyes
gyjtemnyektl fgg (pl. a Charts gyjtemnynek van ilyen metdusa, a Workbooks gyjtemnynek
nincs).
55
A fontosabb gyjtemnyek:
Munkafzetek: Workbooks gyjtemny (munkafzet (Workbook) objektumokbl).
Munkalapok: Worksheets gyjtemny (munkalap (Worksheet) objektumokbl).
Diagramok: Charts gyjtemny (diagram (Chart) objektumokbl).
Lapok (munkalapok, nll lapon lv diagramok, stb.): Sheets gyjtemny.
Prbeszdablakok: Dialogs gyjtemny (beptett prbeszdablak (Dialog) objektumokbl).
Menk: CommandBars gyjtemny (mensor (CommandBar) objektumokbl).
Megjegyzs
A gyjtemnyeket knny felismerni a nevk vgn lv s betrl (angol tbbes szm).
A Sheets gyjtemny elemeinek (lapjainak) tpusa a Type tulajdonsggal kaphat meg (Pl.
Sheets(1).Type).
Az nll lapon lv diagramok a Charts gyjtemnnyel, mg az egyes munkalapokon lv
diagramok az adott munkalap ChartObjects gyjtemnyvel (pl. Worksheets(1).ChartObjects)
kezelhetk.
56
Megjegyzs
A Value tulajdonsg el is hagyhat (pl. Range("A2") = 3.14)
Egy cella ressge az IsEmpty fggvnnyel krdezhet le.
Tartalom trlse: ClearContents metdus
Pl.
'Az aktulis munkalap egy blokkjnak tartalmt trljk
Range("A1:A4").ClearContents
Megjegyzs: A Delete metdusnak van egy opcionlis paramtere, amellyel megadhat, hogy a trlt cellk
helyre hogyan lpjenek be (jobbrl vagy lentrl) a szomszdos cellk. Ha a paramtert nem adjuk meg
(mint a pldban), akkor ezt a trlt objektum alakja alapjn dnti el az Excel.
Formtum belltsa: NumberFormat, NumberFormatLocal tulajdonsg
Pl.
'Az aktulis munkalap A oszlopra dtum formtumot
Range("A:A").NumberFormat = "yyyy.mm.dd"
'Ez ugyanazt csinlja, mint az elz sor
Columns(1).NumberFormatLocal = ".hh.nn"
'Az aktulis munkalap C s D oszlopra pnznem formtumot
Range("C:D").NumberFormat = "#,##0 $"
Amint azt lttuk, az Excel munkalapokon trolt adatok a cellk Value tulajdonsgval elrhetk, azaz
adatokat tudunk a cellkba tenni, s azokat fel tudjuk hasznlni. Ha az adatokbl valamilyen
eredmnyadatokat szeretnnk meghatrozni, akkor ezt ltalban nem programozzuk (pl. egy sszeg esetn
egy sszegz algoritmussal), hanem az Excel-t krjk meg az eredmnyek kiszmtsra (pl. hasznljuk a
SZUM fggvnyt). Ennek kt oka is van. Egyrszt az Excel-ben nagyon sok beptett fggvny
hasznlhat, msrszt ez a megolds kveti az adatok esetleges megvltozst (ha a kpletek automatikus
szmtsa (Fjl, Belltsok, Kpletek, Szmtsi belltsok, Munkafzet kiszmtsa, Automatikus
57
58
Pl.
'Az aktulis munkalap egy celljnak hivatkozsa A1 stlusban
MsgBox Cells(2,3).Address
'$C$2
MsgBox Cells(2,3).Address(True, False)
'C$2
MsgBox Cells(2,3).Address(False, True)
'$C2
MsgBox Cells(2,3).Address(False, False)
'C2
'Az aktulis munkalap egy celljnak cme R1C1 stlusban
MsgBox Cells(2,3).Address(ReferenceStyle:=xlR1C1)
MsgBox Cells(2,3).Address(ReferenceStyle:=xlR1C1, _
RowAbsolute:=False, ColumnAbsolute:=False, _
RelativeTo:=Cells(1,1))
'R2C3
'R[1]C[2]
Megjegyzs: Ha egy utastst tbb sorba runk, akkor az alulvons karaktert (_) kell azon sorok vgre
tenni, amelyek mg folytatdnak (lsd a fenti pldban).
Kpletek hasznlata: Formula, FormulaLocal tulajdonsgok
Mindkt tulajdonsg kplet megadsra hasznlatos. A kpletet egy sztringkifejezssel definilhatjuk,
lnyegben ugyangy, mint ahogy azt az Excel-ben is megadnnk.
A Formula tulajdonsgban az Excel fggvnyeire az angol nevkkel kell hivatkozni (az Excel sgja
tartalmazza a fggvnyek angol megnevezst s szintaxist is), a FormulaLocal tulajdonsg esetn pedig
azon a nyelven, amit az Excel-ben is hasznlunk.
A kpletek knnyen megadhatk abban az esetben, ha tudjuk, hogy melyik cellba akarjuk a kpletet
elhelyezni, s ha az alkalmazni kvnt kpletben ismerjk az esetlegesen hivatkozott cellatartomnyt.
Nehezebb a dolgunk, ha nem tudjuk a kpletet tartalmaz cella cmt akkor, amikor a forrskdot rjuk
(mert pl. ez fgg a munkalapon lv adatsorok, adatoszlopok szmtl).
A kvetkezkben mindkt esetre mutatunk pldt. Az els kt utasts ismert clcellba ismert
cellatartomnyra hivatkoz kpletet tesz. A msik kt kplet elhelyezsekor nem tudjuk az adatokat
tartalmaz blokk mrett, csak azt, hogy az A1-es celltl kezddik az az sszefgg blokk, amelyre ki
akarunk szmolni valamit (pldnkban tlagot s sszeget szmolunk). A CurrentRegion tulajdonsg
segtsgvel megtudhat az adatokat tartalmaz blokk mrete. Az Address tulajdonsg segtsgvel
megkaphatk azok a (relatv) cellacmek, amelyek a kpletekhez (az els oszlop tlaghoz, s az els sor
sszeghez) kellenek.
Pl.
'Az aktulis munkalapon fix kpletet fix helyre
Range("C5").Formula = "=SUM(C2:C4)"
Range("D5").FormulaLocal = "=SZUM(D2:D4)"
'Az A1-es cellt tartalmaz blokk al az els oszlopba
s = Range("A1").CurrentRegion.Rows.Count
st = Cells(s, 1).Address(False, False)
Cells(s + 1, 1).FormulaLocal = "=TLAG(A1:" + st + ")"
'Az A1-es cellt tartalmaz blokk mell az els sorba
o = Range("A1").CurrentRegion.Columns.Count
st = Cells(1, o).Address(False, False)
Cells(1, o + 1).FormulaLocal = "=SZUM(A1:" + st + ")"
59
Megjegyzs
A pldkban most nem hasznltuk az Address tulajdonsgot, de a hivatkozott cella R1C1 stlus
cme ezzel is elllthat lett volna.
Az Excel-ben a fggvnynevek magyarul (helyi (local) nyelven) jelennek meg (akkor is, ha a
Formula, illetve FormulaR1C1 tulajdonsgokkal definiljuk ket).
A kpleteket kezel tulajdonsgok (Formula, FormulaLocal, FormulaR1C1, FormulaR1C1Local)
egyiknek megadsval mindegyik definildik.
Pl.
Range("C2").FormulaLocal = "=TLAG(A2:B2)"
MsgBox Range("C2").FormulaR1C1
' =AVERAGE(RC[-2]:RC[-1]
60
61
Megjegyzs
Az egyes munkalapokra krhet olyan bellts is, amely a kpleteket tartalmaz cellkban magt a
kpletet s nem az eredmny rtkt jelenti meg (lsd Fjl, Belltsok, Specilis, Belltsok
megjelentse ehhez a munkalaphoz, Szmtott eredmnyek helyett kpletek megjelentse a
cellkban jellngyzet).
ltalban akkor hasznlunk kln objektumvltozt (a pldban r), ha az adott objektummal
tbb dolgot is el szeretnnk vgezni. A pldban csak a Min munkalapfggvnyt hvjuk meg egy
adott blokkra, ami az objektumvltoz nlkl is megtehet lett volna.
A pldban szerepl min vltoz Variant tpus, mert az eredmny tpusa a megfelel
cellkban (A1:A5) tallhat adatok tpustl fgg.
62
4.1. bra. A Makr rgztse s a Rgzts vge funkcik a menszalag Fejleszteszkzk lapjn
A Makr rgztse funkci egy prbeszdablakot jelent meg (lsd 4.2. bra), ahol megadhatk a
rgztend makr adatai (nv, gyorsbillenty, hely, lers).
63
A kvetkez plda trli az nll lapon, valamint az els munkalapon lv diagramokat. Az nll lapon
lv diagramok trlsekor (mivel teljes lapok trldnek), az Excel egy figyelmeztet zenetet ad, s a
trls csak jvhagys utn trtnik meg. Ennek a figyelmeztet zenetnek a megjelentst kapcsoljuk ki
az Application objektum DisplayAlerts tulajdonsgval.
Pl.
'Diagramok trlse
Sub DiagramTorles()
'Az nll lapon lvket
If Charts.Count > 0 Then
Application.DisplayAlerts = False
'Ne legyen figyelmeztet zenet
Charts.Delete
Application.DisplayAlerts = True
'A figyelmeztets visszakapcsolsa
End If
'Az els munkalapon lvket
If Worksheets(1).ChartObjects.Count > 0 Then
Worksheets(1).ChartObjects.Delete
End If
End Sub
64
Megjegyzs
A diagramokat tartalmaz gyjtemnyek (Charts, ChartObjects) Delete metdusa futsi hibt ad
akkor, ha a gyjtemnynek nincs egyetlen eleme sem, ezrt a trlst csak akkor vgezzk el, ha
van mit trlni.
Az Application objektum DisplayAlerts tulajdonsga az sszes figyelmeztet zenet
megjelentst szablyozza (pl. egy nem mentett munkafzet bezrsakor megjelen zenet sem
jelenik meg, ha ez a kapcsol ki van kapcsolva (False rtk), ezrt a trls utn
visszakapcsoljuk (True rtkre)).
Megjegyzs
A Dialogs gyjtemny csak olvashat (read-only) (gy pl. nincs Add metdusa sem).
Ha a pldban kivlasztunk egy fjlt, akkor egy ktsoros zenetet kapunk, ahol a kivlasztott fjl
teljes specifikcija (meghajt, elrsi t, fjlazonost) a msodik sorba kerl. A sortrst a
vbCrLf konstanssal vgeztk (Chr(13)+Chr(10)).
65
66
Megjegyzs
A MenuAlaphelyzet szubrutint azrt ksztettk, hogy ha elrontannk az Excel menjt, akkor
gyorsan visszallthat legyen a men alapllapota. A menszalag alaphelyzetbe lltsa ugyan az
Excel belltsai kztt is megtallhat (lsd Fjl, Belltsok, Menszalag testreszabsa,
Alaphelyzet), de ez nem rinti a forrskdbl megtett vltoztatsokat.
A
pldban
csak
ktfle
tpus
vezrlt
hasznltunk
(msoControlPopup,
msoControlButton), de msfle (pl. legrdl listt megvalst) vezrl is elhelyezhet a
menben.
67
4.3. Mintafeladat
A fejezetet (s egyben az egsz tmakrt) a kvetkez, sszetettebb feladat megoldsval zrjuk. Igaz, hogy
az Excel-t rendszerint adatfeldolgozsi feladatokra hasznljuk, gy a programozsi feladatok zme is ilyen
jelleg, most mgis (kicsit kedvcsinl clzattal) egy msfajta feladatot vlasztottunk. Bizonyra mindenki
ismeri a Torped nev jtkot, amelyben kt szemly prblja meg mielbb kilni az ellenfl ltal
elrejtett alakzatokat.
A jtktr egy-egy (pl. 10 10-es) ngyzetrcs (egy az elrejtett, egy pedig a kilvend alakzatokhoz),
amelyben az oszlopokat angol betkkel (pl. A-tl J-ig), a sorokat sorszmokkal (pl. 1-tl 10-ig) azonostjuk.
Az egyes ngyzeteket (ahov elrejteni, illetve lni lehet) az oszlop- s sorazonostk hatrozzk meg (pl.
A1, C4). Az elre rgztett szm s formj alakzat elrejtse utn a kt jtkos felvltva l, s a jtkot az
nyeri, aki elbb lvi ki (sllyeszti el) az ellenfl alakzatait.
A jtk eredeti formban trtn megvalstsa (kt jtkos, tbb ngyzetbl ll alakzatok) tl nagy
falat lenne, ezrt egy egyszerstett vltozatot definilunk s oldunk meg. Ez az egyszerbb feladat is
alkalmas lesz az eddig tanult ismeretek sszefoglalsra, s taln tartogat mg annyi kihvst, illetve
jtklmnyt, hogy megrje akr nllan megoldani, akr sszerakni s kiprblni az ltalunk adott
megoldst.
Feladat: Egy prbeszdablak segtsgvel valstsuk meg az albbi Torped jtkot!
A jtk plyamrett egy Plyamret felirat legrdl listval lehessen megadni, ami 2-tl 6-ig egy
egsz szm, kezdrtke legyen 4! A legrdl lista feltltst ciklussal vgezzk!
A plya az els munkalap A1-es celljtl kezdd plyamret*plyamret mret blokkja, mg az
elrejtett alakzatok trolsra a msodik munkalap hasonl blokkjt hasznljuk (httr)! A jtk
sorn az els munkalapot lssuk!
Egy Elrejt felirat nyomgomb megnyomsra helyezznk el a httren vletlenszeren annyi
alakzatot, amennyi a plyamret! Az alakzatok egy cellbl llnak, jelzskre az O bett
hasznljuk!
Egy Jtk indt felirat nyomgomb megnyomsra (ha mr rejtettnk el alakzatokat) kezdjk el a
jtkot! A gomb felirata legyen Jtk lellt, s amg a jtknak nincs vge, addig ne lehessen
plyamretet vlasztani s alakzatokat elrejteni, viszont lehessen az elrejtett alakzatokra lni! Egy
elkezdett jtk a Jtk lellt gomb megnyomsig, vagy az sszes elrejtett alakzat kilvsig tart.
A lvs clcelljnak cme egy beviteli mezben legyen megadhat! A lvst egy Lvs felirat (az
Enter billentyre aktv) nyomgombbal lehessen leadni! Csak plyra es clhelyre lehessen lni!
rtkeljk ki a lvst gy, hogy ha olyan helyre lttnk, ahov mr lttnk, akkor errl
tjkoztassunk, ha eltalltunk egy alakzatot (a msik munkalapon elrejtett alakzatok kzl), akkor
azt jelezzk a plya megfelel celljban elhelyezett X (tallt) vagy * (nem tallt) karakterrel!
Egy Sg felirat nyomgomb megnyomsra adjunk sgt az elrejtett alakzatokrl, azaz
jelentsk meg a msodik munkalapot, hogy az elrejtett alakzatok helyt megnzhessk! Amg a
sgt ltjuk, addig ne lehessen lvst leadni, valamint a sg gomb felirata legyen Bezr! A Bezr
gomb megnyomsra lltsuk vissza a jtk llapotot (azaz a plyt lssuk, Sg gombfelirat, lvs
engedlyezse)!
Az ablakban jelenjen meg a kiltt alakzatok szma! Ha az sszes alakzatot kilttk, akkor a
jtknak vge, errl tjkoztassunk, majd kezdhessnk j jtkot!
68
69
3. lps: Kezdtevkenysgek.
A form megjelense eltti kezdtevkenysgeket a form Initialize esemnykezeljben kell programozni.
Feltltjk a legrdl lista tartalmt (az AddItem metdus segtsgvel, a feladatkirs szerint ciklussal),
majd belltjuk a legrdl lista kezdrtkt (a Value tulajdonsggal).
'A form megjelense eltt fut le
Private Sub UserForm_Initialize()
Dim i As Integer
'A legrdl lista feltltse
For i = Tol To Ig
cbPalya.AddItem i
Next
'A legrdl lista kezdrtke s stlusa
cbPalya.Value = 4: cbPalya.Style = fmStyleDropDownList
'Az ablak fejlcnek belltsa
Caption = Fejlec
'A vezrlk vlaszthatsgnak belltsa
btnSugo.Enabled = False: btnJatek.Enabled = False
btnLoves.Enabled = False: tbLoves.Enabled = False
'Az els munkalapot lssuk
Worksheets(1).Activate
'Plya trlse
Call Torles
'A vletlenszm-genertor inicializlsa
Randomize
End Sub
70
Megjegyzs: Az aktulis plyamret belltsakor egy implicit tpuskonverzi trtnik, mivel a legrdl
listban lv elemek sztringek (amelyek most egsz szmokat tartalmaznak (lsd 3. lps), gy a konverzi
vgrehajthat), az n vltoz pedig egsz (Integer) tpus.
71
72
73
7. lps: Sg megvalstsa.
A sg amellett, hogy aktivizlja a megfelel munkalapot, a megfelel vezrlk vlaszthatsgt is belltja.
Hasonlan a jtk indts, lellts funkcihoz (lsd 6. lps), itt is a nyomgomb aktulis feliratbl tudjuk
meg, hogy ppen megjelenteni, vagy bezrni kell-e a sgt.
'A sg gomb tevkenysgei
Private Sub btnSugo_Click()
If btnSugo.Caption = "Sg" Then
Worksheets(2).Activate
btnSugo.Caption = "Bezr"
btnLoves.Enabled = False
tbLoves.Enabled = False
btnJatek.Enabled = False
Else
Worksheets(1).Activate
btnSugo.Caption = "Sg"
btnLoves.Enabled = True
tbLoves.Enabled = True
btnJatek.Enabled = True
End If
End Sub
74
75
Call FejlecKirak
If Kilott = n Then
MsgBox ("A jtknak vge!")
'A jtk lelltsa
Call btnJatek_Click
End If
Else
Range(st) = Melle
End If
End If
End If
'Lvs trlse a beviteli mezben
tbLoves.Text = ""
'Ha mg nincs vge a jtknak, akkor a beviteli mezre llunk
if Kilott <> n Then
tbLoves.SetFocus
End If
End Sub
76
5. IRODALOMJEGYZK
[1]
[2]
[3]
[4]
77