Vous êtes sur la page 1sur 78

SZCHENYI ISTVN EGYETEM

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.

2. A VISUAL BASIC PROGRAMOZSI NYELV


A BASIC (Beginners All-purpose Symbolic Instruction Code) programnyelvet oktatsi clokra hoztk
ltre 1964-ben (Dartmouth College USA, Kemny Jnos s Thomas Kurtz). Az ltalnos cl
felhasznlhatsg s a knny tanulhatsg elsdleges szempont volt, ez a mozaiksz szavaibl is kiderl.
A BASIC programozsi nyelv magas szint, az emberi gondolkodshoz, jellsrendszerhez kzel ll
programozsi nyelv. A BASIC nyelven megrt programokat (az n. forrsprogramokat) a szmtgp nem
tudja egybl vgrehajtani. Ezek vgrehajtshoz fordts (compile) vagy rtelmezs (interpretation)
szksges. A fordtprogramok a teljes forrsprogramot lefordtjk a szmtgp ltal mr vgrehajthat
utastsokk, mg az rtelmezk utastsonknt rtelmezik s hajtjk vgre a forrsprogramot.
A nyelvnek tbbfle vltozata ltezett, kezdve az iskola-szmtgpek beptett BASIC rtelmezjtl, a
80-as vekben elterjedt szemlyi szmtgpek Qbasic-jn keresztl, az 1991-ben megjelent Microsoft
Visual Basic (rviden VB) nyelvig. A Visual Basic for Applications (rviden VBA) az MS Office
szoftverek makrnyelve, a Visual Basic Script a Windows opercis rendszer scriptnyelve, a 2002-ben
megjelent Visual Basic .NET pedig a .NET keretrendszer programozsi nyelve.
A Visual Basic nyelv utn ejtsnk pr szt a nyelvet hasznl szoftverfejleszt rendszerekrl is.
Az MS Visual Studio egy ltalnos cl szoftverfejleszt keretrendszer, amelyben tbbfle (pl. Visual
Basic, C#) programnyelven is fejleszthetnk.
Az MS Visual Basic for Applications (pl. az ltalunk hasznlt Excel VBA) fbb tulajdonsgai:
Csak Visual Basic nyelven programozhatunk, (a Visual Studio-hoz kpest) korltozott fejlesztsi
eszkztr mellett.
Csak az adott szoftverrel (pl. Excel) egytt hasznlhat.
nllan futtathat (*.exe) fjlok nem kszthetk.
Az adott szoftverhez igazod, kszen kapott objektumrendszert tartalmaz.
Az egyes utastsoknl megadjuk az utastsok (esetleg egyszerstett) szintaktikjt. Az egyszerstssel a
lnyeges dolgok kiemelse a clunk, az utastsok teljes szintaktikja a sgban megtallhat.
Megjegyzs
A dokumentumban az MS Excel 2010 VBA segtsgvel szemlltetnk, a lersok is ehhez
igazodnak, de a 2003-es Excel VBA krnyezete ugyangy alkalmas a tanulsra, a feladatok
megoldsra.
Az utastsok szintaktikjban a szgletes zrjelben lv rszek elhagyhatk, a kapcsos zrjelek
kztt, fggleges vonallal elvlasztva vlasztsi lehetsgek felsorolsa tallhat, a hrom pont a
tetszleges szm ismtls jellsre szolgl.

2.1. Egyszer adattpusok


Minden programozsi nyelv (gy a VB is) meghatrozza az adatok azon krt, amelyet kezelni tud. Azt,
hogy milyen fajta adatokat hasznlhatunk, ezekkel milyen mveleteket vgezhetnk, ezek hogyan
troldnak, az adattpusok definiljk. Attl fggen, hogy az adattpus egy vagy tbb logikailag
sszetartoz adat hasznlatt engedi meg, megklnbztetnk egyszer s sszetett adattpusokat. Az
egyszer adattpusokrl ebben a fejezetben, az sszetett adattpusokrl a 2.5. fejezetben lesz sz.

2.1.1. Egsz adattpusok


Az egsz szmok hasznlatt tbbfle egsz tpus biztostja, amelyek az adatok trolsra felhasznlt
memriaterlet mretben, az eljel kezelsben, gy az egyes tpusokhoz tartoz egsz szmok
tartomnyban klnbznek.

Adattpus

Trolsi mret

Tartomny

Byte

1 bjt

0 .. 255

Integer

2 bjt

32768 .. 32767

Long

4 bjt

2147483648 .. 2147483647

2.1. tblzat. Az egsz adattpusok


Mg a Byte tpus 1 bjtja csupn 28=256 db, addig a Long tpus 4 bjtja mr 232 (kb. 4 millird)
klnbz rtk (egsz szm) trolst biztostja.
Az egsz tpus adatokkal a matematikban szoksos mveletek vgezhetk el, amelyet a 2.2. s 2.3.
tblzatok szemlltetnek. Az aritmetikai mveletek tblzatbeli sorrendje a mveletek ersorrendjt
(priorits, precedencia) tkrzi, ahol legell a legersebb (legmagasabb priorits) hatvnyozs tallhat.
A hasonltsok kztt nincs ersorrendbeli klnbsg (azonos prioritsak), de prioritsuk gyengbb, mint
az aritmetikai mveletek. A hasonltsi mveletek nemcsak egsz szmokra, de ms adatokra (pl. vals
szmok, sztringek, stb.) is rtelmezettek, eredmnyk logikai tpus. A logikai adattpusrl a 2.1.3.
fejezetben, mg a kifejezsek kirtkelsnek szablyairl a 2.2.2. fejezetben lesz sz.
Aritmetikai mveletek
Hatvnyozs (^)
Negci ()
Szorzs (*), oszts (/)
Egsz oszts hnyadosa (\)
Egsz oszts maradka (Mod)
sszeads (+), kivons ()
2.2. tblzat. Az egsz adattpusok aritmetikai mveletei
Hasonltsok
Egyenl (=)
Nem egyenl (<>)
Kisebb (<)
Nagyobb (>)
Kisebb vagy egyenl (<=)
Nagyobb vagy egyenl (>=)
2.3. tblzat. A hasonltsi mveletek
Pl. 3^2 9

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.

2.1.2. Vals adattpusok


A vals szmok esetn ktfle tpust hasznlhatunk, amelyek jellemzit a 2.4. tblzat szemllteti. Noha a
hasznlhat szmok nagysgrendje kb. 1038, a trolsra hasznlt 4, illetve 8 bjt csak kb. 7-8, illetve 15-16
rtkes (decimlis) szmjegyet biztost (a tbbi szmjegy a kerekts miatt 0 lesz).
Adattpus

Trolsi mret

rtkes jegyek

Single

4 bjt

7-8

Double

8 bjt

15-16

2.4. tblzat. A vals adattpusok


A vals adattpusok mveletei az egsz oszts (\, Mod) mveletek kivtelvel megegyeznek az egsz
adattpusok mveleteivel.
Pl. 4^0.5 0.5

2.1.3. Logikai adattpus


A logikai (Boolean) adattpusban ktfle rtk ltezik, az igaz (True) s a hamis (False). A hrom
legfontosabb logikai mvelet a tagads (Not), az s (And), s a vagy (Or), amelyek igazsgtblzatt a 2.5.
tblzat szemllteti. A logikai rtkekre rtelmezettek a hasonlts mveletek (lsd 2.3. tblzat) is.
A

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

2.5. tblzat. Logikai mveletek


A tagads egyoperandus mvelet az ellenkezjre vltoztatja a logikai rtket (igazbl hamis lesz s
fordtva), az s ktoperandus mvelettel sszekapcsolt logikai kifejezs csak akkor lesz igaz, ha mindkt
operandus igaz, mg a vagy ktoperandus mvelettel sszekapcsolt logikai kifejezs csak akkor lesz hamis,
ha mindkt operandus hamis.
Megjegyzs
Logikai mvelet mg a kizr vagy (Xor), az ekvivalencia (Eqv), s az implikci (Imp) is.
A logikai rtkek kztt is rtelmezett a sorrendisg (br ezt ritkn hasznljuk), nevezetesen a
False rtk megelzi a True rtket, azaz False < True True, gy a logikai rtkekre
definilt az sszes hasonltsi mvelet.

2.1.4. Szveges adattpus


A szveges (String) adattpus szveges adatok (karaktersorozatok) hasznlatt biztostja. A String
kulcssz vltoz hossz sztringeket deklarl, amelyek a maximlis adathosszig (2^31 darab karakter)
tetszleges hosszak lehetnek. A sztringeket macskakrmk kz kell tenni. Az res sztringnek ("") nincs
egyetlen karaktere sem.
A sztringekre az sszefzs mvelet (ms nven konkatenci) (+, &), s a hasonltsok (lsd 2.2. tblzat)
rtelmezettek. A + mvelet csak szvegeket fz ssze, az & szmokat is kpes sszefzni, amelyeket a
mvelet elvgzse eltt sztringg alakt (konvertl).
Pl. "alma" + "fa" "almafa"

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.

2.1.5. Egyb adattpusok


A dtum/id (Date) adattpus segtsgvel dtum s/vagy idadatokat tudunk kezelni. Egy (8 bjton
trolt) vals szm egsz rsze a dtum, trt rsze pedig az idpont megadsra hasznlatos. Az idkezels
megegyezik az Excel idkezelsvel, a dtumkezels kicsit eltr. Az Excel csak pozitv szmokat tud
dtumknt rtelmezni, a VB negatv szmokat is kezel, amellyel a dtum 100.01.01-tl 9999.12.31-ig
terjed rtk lehet.
Pl. Excel: 1.25 ~ 1900.01.01 6:00:00, VB: 1.25 ~ 1899.12.31 6:00:00, 1.5 ~ 1899.12.29 12:00:00
A Currency adattpus a pnzgyi szmtsokhoz ajnlott. Egy ilyen tpus adat fixen ngy tizedes jegyet
tartalmaz, mert az adat tzezerszerese troldik egsz szmknt (8 bjton, ami 19-20 rtkes decimlis jegy
pontossgot jelent).
A Variant adattpust akkor hasznljuk, ha egy adatnak nem tudjuk elre a tpust, vagy egy vltozban
klnbz tpus adatokat (pl. szm, szveg) szeretnnk trolni. A vltozkrl a 2.2.1. fejezetben lesz sz.
A knyelmes hasznlat ra a nagyobb memriaterlet (szm esetn 16 bjt, szveg esetn 22 + a szveg
karaktereinek szmval megegyez bjt).
Megjegyzs: A Variant tpus vltozk specilis rtkeket (Empty, Error, Nothing, Null) is
tartalmazhatnak.
A VBA elszeretettel hasznlja a felsorolt (Enum) tpust akkor, amikor az adatoknak csak nhny
lehetsges rtke van. Az Enum tpus adatok mindegyikhez egy azonost s egy egsz szm rendelhet.
A forrsprogramokban ugyan mindkett hasznlhat, de clszer az azonostk hasznlata, gy a forrskd
kifejezbb, rthetbb lesz.

Szintaktika:
[Private|Public] Enum name
membername[=constantexpression]
membername[=constantexpression]
...
End Enum
Private
Public
name
membername
constantexpression

A tpus csak abban a modulban hivatkozhat, amelyikben deklarltuk.


A tpus minden modulbl hivatkozhat (ez az alaprtelmezs).
A tpus azonostja.
A tpushoz tartoz elem azonostja.
A tpushoz tartoz elem rtke.

Az egyes elemek szmrtkeit megad kifejezsek (constantexpression) konstansokbl ll, egsz


rtk kifejezsek lehetnek. Ezek a kifejezsek elhagyhatk, ekkor az els elem esetn 0, a tbbinl az
elz rtknl eggyel nagyobb rtk definildik.
Pl.
Enum SecurityLevel
IllegalEntry = -1
SecurityLevel1 = 0
SecurityLevel2 = 1
End Enum

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. Adatok kezelse


Ahhoz, hogy adatainkat a szmtgp kezelni tudja, trolnia is kell. A trols mikntje, konkrt
megvalstsa egyrszt az adatok tpustl, msrszt az alkalmazott fejlesztkrnyezettl, s az opercis
rendszertl is fgg.
Adatainkat alapveten a szmtgp memrijban troljuk, de szksg esetn kls adathordozn
(adatfjlokban) is eltrolhatjuk. A fjlokban trtn adattrolsra akkor van szksg, ha adatainkat kt
programfuts kztt is meg szeretnnk rizni. A memriban trtn adattrolsrl ebben a fejezetben, az
Excel-fjlokban (munkafzetekben) trtn adattrolsrl a 4.1. fejezeteben lesz sz.

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

A vltoz (betvel kezdd) azonostja (neve).


A vltoz tpusa (ha hinyzik, a vltoz Variant tpus lesz).

Pl.
Dim i As Integer
Dim v
Dim a,b As Single

'Egy Integer tpus vltoz deklarlsa


'Egy Variant tpus vltoz
'Egy Variant s egy Single tpus vltoz

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

'Az i vltozba 3 kerl (kerekts)


'A c vltozba egy Double konstanst tesznk
'Az st vltozba "2" kerl
'Az st vltozba "22" kerl

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

Az els pldban a szorzs, majd az sszefzs (a 12 szvegg konvertlsval), utna a hasonltsok,


vgl az And mvelet hajtdik vgre, amivel True rtket kapunk. A msodik s harmadik pldban
szerepl 3.8 vals szm egy egsz osztsban szerepel, ezrt rtke egszre konvertldik (4-re
kerektdik). A msodik pldban elszr a szorzs (eredmnye 6), majd az egsz oszts (4\6) hajtdik
vgre, gy az eredmny 0 lesz. A harmadik plda zrjelezse megvltoztatja a prioritsbl add
sorrendet, gy elszr az egsz oszts (4\2) hajtdik vgre, majd a szorzs, gy az eredmny 6 lesz.

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

Adott tpus rtkk konvertl fggvnyek


CStr(X)
X rtkt String rtkk.
CInt(X)
X rtkt Integer rtkk.
CSng(X)
X rtkt Single rtkk.
CDate(X)
Az X rvnyes dtumkifejezst Date rtkk.
Pl.
CStr(2.6) "2,6"

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

Ha szmot tartalmaz szveges adatot konvertlunk numerikus adatt, akkor tizedesjelknt a


vessz s az opercis rendszerben belltott tizedesjel hasznlhat. Ha pl. vessz az opercis
rendszerben belltott tizedesjel, akkor a pont hasznlata esetn tpuskeveredsi hibt kapunk (pl.
CInt("2.6")).
Ha az X rtk nem konvertlhat az eredmnytpus rtkkszletbe, akkor hibt kapunk (pl.
CByte(-1)).
Szvegkezel fggvnyek
Len(X)
Az X sztring hossza (karaktereinek szma).
Left(X,Y)
Az X sztring elejrl Y darab karakter.
Right(X,Y)
Az X sztring vgrl Y darab karakter.
Mid(X,Y[,Z])
Az X sztring Y-adik karaktertl Z darab karakter.
Trim(X)
Az X sztring vezet s zr szkzeinek levgsa.
InStr([X,]Y,Z)
A Z sztring megkeresse az Y sztringben (az X-edik karaktertl kezdden).
Pl.
Len("Alma") 4
Mid("Alma",3,1) "m"
InStr("alma","a") l

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])

Az X kifejezs sztringg alaktsa az Y formz sztring alapjn.

Pl.
Format(100/3,"0.00") "33,33"
Format(CDate("89.12.05"), "Long Date") "1989. december 5."

12

2.2.4. Az rtkad utasts


Az rtkad utastssal egy vltoznak adhatunk rtket. Az utasts szintaktikja:
[Let] varname = expression
varname
expression

A vltoz azonostja.
A troland rtket meghatroz kifejezs.

Az utasts vgrehajtsakor elszr kirtkeldik az rtkads jobb oldaln ll kifejezs (expression),


azaz kiszmtdik a kifejezs rtke, majd ha a kapott rtk trolhat az adott vltozban (varname),
akkor megtrtnik a trols, klnben futsi (run-time) hiba lp fel.
Megjegyzs
Az utasts kulcsszava (Let) elhagyhat, ezrt tbbnyire el is hagyjuk.
A szmols kzben, illetve a trols eltt a VB implicit (ltalunk nem definilt) tpuskonverzikat
hajthat vgre. A megfelel konverzis fggvnyek hasznlatval azonban explicit (ltalunk
megadott) mdon szablyozhatjuk a szksges tpuskonverzikat, gy elkerlhetjk az implicit
tpuskonverzikat s az esetlegesen ebbl ered programhibkat.
Pl.
Dim
i =
i =
v =
v =
i =
i =
i =

i As Byte
255
i + 1
"szveg"
3.14
"a"
"2" + "2"
"2" + "2" * "2"

'Az i vltoz deklarlsa


'A legnagyobb Byte rtk
'Tlcsordulsi hiba (Overflow)!
'Variant tpus vltozba szveget
'Variant tpus vltozba szmot
'Tpuskeveredsi hiba (Type mismatch)
'Az i vltozba 22 kerl
'Az i vltozba 6 kerl

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

2.2.5. Adatok bekrse


Egy vltoznak nemcsak az elbb ismertetett rtkad utastssal adhatunk rtket. Lehetsg van a
vltozk rtkeinek a program futsa (vgrehajtsa) sorn trtn megadsra is. Pldul egy msodfok
egyenletet megold program esetn clszer az egyenletet meghatroz egytthatkat bekrni, ahelyett,
hogy azok konkrt rtkeit a programba bernnk, hiszen a bekr utasts hasznlatval a program
mdostsa nlkl tudunk klnbz msodfok egyenleteket megoldani. Elegend csak jra futtatnunk a
megold programot s ms bemen adatokat adni.
Az albbi VB fggvny egy prbeszdablak segtsgvel egy szveges adat bekrst, megadst biztostja.
Az utasts (egyszerstett) szintaktikja:
InputBox(prompt[,title][,default])
prompt
title
default

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.

2.1. bra. A pldban szerepl InputBox fggvny prbeszdablaka


Megjegyzs
A fggvnynek egyb opcionlis paramterei is vannak.
Vals szmok bekrse esetn gyeljnk arra, hogy az implicit tpuskonverzi tizedesjelknt csak a
vesszt s az opercis rendszerben belltott tizedesjelet fogadja el. Ha pl. vessz az opercis
rendszerben belltott tizedesjel, akkor a pont hasznlata esetn tpuskeveredsi hibt kapunk.

14

2.2.6. Adatok kirsa


Tbbnyire mg a legegyszerbb programoknak is vannak bemen (input) s eredmny (output) adatai. A
bemen adatok egyik megadsi lehetsgt az elzekben ismertettk, az eredmnyek megjelentsi
lehetsgeirl most lesz sz.
Az albbi VB fggvny egy prbeszdablak segtsgvel egy szveges adatot jelent meg. Az utasts
(egyszerstett) szintaktikja:
MsgBox(prompt[,buttons][,title])
prompt
buttons
title

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).

2.2. bra. A pldban szerepl MsgBox fggvnyek prbeszdablakai


Megjegyzs
A kirand adat tetszleges tpus kifejezssel megadhat, ekkor a kifejezs rtke (implicit
tpuskonverzival) sztringg konvertldik. Vals szmok tizedesjele az opercis rendszerben
belltott tizedesjel lesz.
Ha a buttons paramtert elhagyjuk, akkor csak az OK gomb jelenik meg. A paramterrel
nemcsak a megjelen nyomgombok, de a prbeszdablak egyb tulajdonsgai is definilhatk.
A fggvnynek egyb opcionlis paramterei is vannak.
Noha a MsgBox fggvny, a fggvny visszatrsi rtkt csak akkor hasznljuk, ha be kell
azonostani, hogy melyik gombbal zrjk be az ablakot.
A pldban szerepl MsgBox fggvnyt eljrsknt hvtuk meg. A szubrutinokrl s azok hvsi
szablyairl (pl. zrjel kiraks/elhagys) a 2.4.1. fejezetben lesz sz.
Ha sok adatot kell megjelentennk, akkor az egyenknti megjelents esetn minden adat utn be kell
zrnunk a megjelen prbeszdablakot. Alkalmazva az elz pldban szerepl gondolatot, clszer az
sszes megjelentend adatot egy sztringg sszefzni, gy elegend egyetlen MsgBox hvs az adatok
megjelentsre. Ennl a megoldsnl az adatokat a Chr(13) (carriage return), illetve Chr(10) (linefeed)
karakterek segtsgvel tbbsoros szvegg is alakthatjuk. Mivel a MsgBox ltal kirt szveg max. 1024 db
karakterbl llhat, ezrt nagy mennyisg adat kirsra inkbb az albiakban ismertetsre kerl
megoldst hasznljuk.
Az adatmegjelents trtnhet a Debug objektum Print metdusnak segtsgvel is, amely a Visual
Basic Editor (lsd 3.2. fejezet) Immediate ablakba (lsd 3.2.1. fejezet) r ki. Az objektumokrl a 2.6.
fejezetben, az Excel objektumairl a 4.1. fejezetben lesz sz.

15

Szintaktika:
Debug.Print [outputlist]
outputlist

A kirand kifejezst vagy kifejezseket megad lista.

A lista egy elemnek (kifejezsnek) megadsi szintaktikja:


[{Spc(n)|Tab(n)}] expression charpos
Spc(n)
Tab(n)
expression
charpos

n db szkz kirsa (opcionlis).


A kirs az nedik oszlopban kezddjn (opcionlis).

A kirand kifejezs (opcionlis).


A kvetkez kirand adat kezdpozcijnak megadsa (opcionlis).

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:

Az utastsok egyms utn, a megadsuk sorrendjben hajtdnak vgre.


A vgrehajtand utasts(ok) felttel(ek)tl fggen kerl(nek) kivlasztsra.
Egy vagy tbb utasts ismtelt vgrehajtsa.

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)

Megjegyzs: A ktfle megads tetszs szerint, vegyesen is alkalmazhat.

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

A For ciklus szintaktikja:


For counter=start To end [Step step]
[statements]
Next [counter]

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.

2.4.1. Deklarci s hvs


Ktfle szubrutint klnbztetnk meg, az eljrst s a fggvnyt. Az eljrst ltalban akkor hasznljuk, ha
valamilyen tevkenysget kell vgrehajtanunk, a fggvnyt pedig akkor, ha valamilyen eredmnyrtket kell
kiszmolnunk.
Mivel mind az eljrs, mind a fggvny kpes adatokat kapni s eredmnyadatokat visszaadni, gy egy adott
szubrutin eljrs, illetve fggvny alakban is programozhat. Az, hogy egy szubrutint eljrs vagy fggvny
formjban runk meg, nem elvi krds, inkbb programozi stlus krdse. A kt forma egymssal
ekvivalens mdon mindig helyettesthet. Az eljrsok s fggvnyek deklarlsa s hvsa, ha kicsit is, de
eltr.
Eljrs deklarlsnak (egyszerstett) szintaktikja:
[Private|Public] Sub name[(arglist)]
[statements]
End Sub

Fggvny deklarlsnak (egyszerstett) szintaktikja:


[Private|Public] Function name[(arglist)] [As type]
[statements]
[name=expression]
End Function

21

Private
Public
name
arglist
type

A szubrutin csak abbl a modulbl hvhat, amelyikben deklarltuk.


A szubrutin minden modulbl meghvhat (ez az alaprtelmezs).
A szubrutin azonostja.
A szubrutin formlis paramterei (opcionlis).
A fggvny eredmnyrtknek a tpusa.

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.

A paramterek neve eltt ll kulcsszavakkal a paramterek elhagyhatsga, valamint a paramterek


tadsi mdja definilhat. Az rtk szerinti (ByVal) paramtereken keresztl a szubrutin csak kaphat
adatokat, mg a cm szerinti tads (ByRef) paramtereken keresztl kaphat is, s vissza is adhat
eredmnyeket. Ezrt a ByVal paramtereket a szubrutin bemen (input) adatainak megadshoz, a
ByRef paramtereket pedig a szubrutin bemen s/vagy kimen (output) adatainak megadshoz
hasznlhatjuk.
Megjegyzs:
Ha egy szubrutinnak tbb paramtere van, akkor a paramtereket vesszvel kell elvlasztani.
Egy Optional paramtert csak Optional paramterek kvethetnek, azaz egy elhagyhat
paramtert nem kvethet ktelezen megadand paramter.
A ParamArray paramter csak a paramterlista utols eleme lehet. Ilyen paramter esetn nem
hasznlhatunk Optional paramtereket.
Ha egy paramternek nem adjuk meg a tpust, akkor a paramter Variant tpus lesz.
A paramter neve (varname) mgtti res zrjelpr azt jelzi, hogy az tadott paramter egy
tmb (lsd 2.5.1. fejezet). A tmbket csak cm szerinti paramtertadssal lehet tadni.
Eljrs hvsa
[Call] name[argumentlist]
name
argumentlist

A meghvott eljrs azonostja.


Az aktulis paramterek.

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. sszetett adattpusok


Az eddig megismert adattpusokkal ellenttben, ahol egy vltozban csak egy adatot trolhatunk egy
idben, az sszetett adattpusok segtsgvel tbb adat egyttes kezelsre is lehetsgnk nylik.

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] [,...]

Az indexek (subscripts) megadsnak szintaktikja:


[lower To] upper [,[lower To] upper] ,...

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}

rtelemszeren a megadott rtk (0 vagy 1) lesz a tmbk als indexhatra. Alaprtelmezsben az


Option Base 0 van rvnyben, azaz a tmbelemek als indexhatra 0.
Megjegyzs: Noha a VB-ben egy tmb dimenziinak maximlis szma 60 lehet, azaz hasznlhatunk
hrom, ngy, , 60 dimenzis tmbket, a gyakorlatban az egy- s ktdimenzis tmbk a
leggyakoribbak.
Az elzekben ismertetett deklarls n. statikus tmbket deklarl, amelyek mrete fordtsi idben
meghatrozdik, s futsi idben mr nem vltoztathat. A VB azonban megengedi az n. dinamikus
tmbk hasznlatt is, amelyek mrete a program futsa sorn megvltoztathat. Ezeket a tmbket is a
Dim utastssal deklarljuk, de az els deklarlsnl csak a tmbelemek tpust adjuk meg, a dimenzikat
nem. A tmb tmretezse ezutn a ReDim utastssal trtnik, amelyben elrhatjuk, hogy a mr definilt
rtk tmbelemek rtkeit megrizzk-e (Preserve) vagy sem.
25

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)

'Dinamikus tmb egszekbl


'A tmb legyen 5 elem
'A tmb hasznlata

'A tmb legyen 10 elem


'Az els 5 elem rtke megmarad, a tbbi 0 lesz

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

Megjegyzs: A pldban feltettk, hogy a modulban az Option Base 0 utasts rvnyes.

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

'Fix (20) hossz sztring

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

A rekordok egyes mezire gy hivatkozhatunk, hogy a rekordvltoz s a meznv kz egy pontot


tesznk. Ezzel a hivatkozssal egy, a mez tpusval megegyez tpus vltozt hivatkozunk, amit ennek
megfelelen hasznlhatunk. A rekordokra nem definiltak mveletek, de az azonos tpus rekordvltozk
kztt megengedett az rtkads (lsd 2.5.3. fejezet).

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

A konstans hivatkozhat lesz minden modulbl.


A konstans csak abban a modulban hivatkozhat, ahol deklarltk (ez az
alaprtelmezs).
A konstans azonostja.
A konstans tpusa (opcionlis).
A konstans rtkt megad kifejezs.

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).

2.3. bra. A mintafeladat eredmnylistja


Az adatok rendezst a Rendezes szubrutin vgzi, amely (a Kiiras szubrutinhoz hasonlan) szintn
megkapja a rendezend adatok tmbjt. Az adatkirs nem vltoztatott a paramterknt kapott adatokon,
de a rendez szubrutinnak ppen ez a dolga, nevezetesen hogy nvsor szerinti sorrendbe tegye a tmbben
lv adatokat. Mivel a tmb tadsra deklarlt (a) paramter cm szerinti tads (ByRef az
alaprtelmezs, s tmbket nem is adhatunk t rtk szerint, lsd 2.4.1. fejezet), ezrt a tmb elemein
vgzett vltoztatsokat a hv is rzkelni fogja.
A rendezst egy, a minimum kivlaszts elvn alapul rendez algoritmus segtsgvel valstottuk meg. A
kls ciklus minden egyes lpsben megkeressk (a bels ciklussal) a mg rendezetlen tmbrsz legkisebb
elemt (annak indext trolja a k vltoz), s ha ez az elem nincs a helyn (az i-edik helyen), akkor
odatesszk. A rekordok kztt rtelmezett az rtkads, ezrt kt elem (i-edik s k-adik) felcserlse
elvgezhet hrom rtkadssal (nevezetesen megjegyezzk az egyiket, oda ttesszk a msikat, majd a
msikba betesszk a megjegyzett egyiket). Vegyk szre, hogy a cserhez hasznlt vltoz (cs) a
tmbelemekkel megegyez (Adat) tpus.
A minimumkeress gy trtnik, hogy megjegyezzk az adott tmbrsz els elemnek indext, s
megvizsgljuk a tbbi elemet. Ha kisebbet tallunk (a rekordok Nev mezje szerinti sszehasonlts
szerint, hiszen nvsor szerinti sorrendet szeretnnk ellltani), akkor annak indext jegyezzk meg (hiszen
most mr az aktulisan legkisebb). A rendezetlen tmbrsz kezdetben (i=1 esetn) az egsz tmb, utna
(i=2 esetn) csak a msodik elemtl az utols elemig (hiszen az els, vagyis a legkisebb elem mr a
helyre, a tmb elejre kerlt), s gy tovbb, legvgl (i=UBound(a)-1 esetn) mr csak a tmb kt
utols elemt tartalmazza.
A Rendezes szubrutint a RendezesTeszt szubrutin hvja meg azutn, hogy kezdrtkekkel ltta el az
adattrolsra hasznlt tmbvltozt. A tmb azonostsra mindkt helyen ugyanazt az azonostt (a)
hasznltuk, de hasznlhattunk volna klnbz azonostkat is. A harmadik szemly (akinek adatait a
29

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

'A rendezs tesztjhez ez indtand


Sub RendezesTeszt()
Dim a(2) As Adat
a(0).Nev = "Madarsz Mnika": a(0).Jegyek(1) = 1: a(0).Jegyek(2) = 2
a(1).Nev = "Vadsz Viktria": a(1).Jegyek(1) = 2: a(1).Jegyek(2) = 3
With a(2)
.Nev = "Halsz Helga": .Jegyek(1) = 3: .Jegyek(2) = 4
End With
Call Rendezes(a)
Call Kiiras(a)
End Sub

2.6. Objektumok, objektumtpusok


Az objektum szt mr hasznltuk (pl. a Debug objektum kapcsn), de mg nem beszltnk arrl, hogy
pontosan mit jelent, mit takar az objektum elnevezs az informatikban.
Objektumon adatok s a rajtuk rtelmezett tevkenysgek egy logikailag sszefgg egysgt rtjk. Az
objektum (hasonlan, mint a tmb) egy gyakran s ltalnosan hasznlt sz, ami jelenthet adatot (egy
konkrt objektumpldnyt), vltozt (ami trolja s elrhetv teszi az objektum adatait s tevkenysgeit),
valamint tpust is (az objektum tpust, amely definilja az objektum adatainak tpust s az objektum
tevkenysgeit).
Az objektumok tevkenysgeit definil szubrutinokat metdusoknak (methods), az objektumok tpust
osztlyoknak (class) nevezzk. Az objektumok adataihoz ltalban tulajdonsgok (properties) segtsgvel
frhetnk hozz, amelyek vdik az adatok helyessgt (lsd 3.2.3. fejezet).
Az objektumok azon metdusait, amelyek valamilyen esemny bekvetkezsekor (pl. egy nyomgomb
esetn a nyomgomb feletti kattints) aktivizldnak, esemnykezelknek nevezzk. Az esemnyek ltalban
valamilyen felhasznli interakci eredmnyeknt kvetkeznek be, de ms fut folyamatok is kivlthatjk
az egyes esemnyek bekvetkezst (pl. meghvunk egy esemnykezelt).
Megjegyzs: A VBA megengedi az osztlyok definilst, de mi csak a kszen kapott osztlyokat fogjuk
hasznlni.

31

3. AZ EXCEL VBA HASZNLATA


Ebben a fejezetben az Excel VBA fejlesztkrnyezetrl lesz sz. Elssorban a forrsprogramok
megadshoz, azok futtatshoz, a hibakeresshez kapcsold funkcikat rszletezzk, de itt kapott helyet
a vizulis formtervezs is.

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).

3.1. bra. Az adatvdelmi kzpont


Ahhoz, hogy a makrkat tartalmaz dokumentumok megnyitsakor eldnthessk, hogy engedlyezzk
vagy letiltjuk az adott dokumentumban lv makrkat, az sszes makr letiltsa rtestssel
vlasztgombot kell bekapcsolni (lsd 3.2. bra). Ebben az esetben egy makrkat tartalmaz dokumentum
megnyitsakor zenetet kapunk. Ha a Visual Basic Editor meg van nyitva, akkor a 3.3. brn szerepl
prbeszdablak jelenik meg, egybknt meg a 3.4. brn lthat zenetsv. Mindkt esetben
engedlyezhetjk a dokumentumban lv makrkat.
Az engedlyezs, illetve letilts csak a makrk futtatsra vonatkozik, gy letiltott esetben is megnzhetjk,
st akr mdosthatjuk is a makrkat. Az engedlyezs, illetve tilts (adott dokumentumra vonatkoz)
megvltoztatshoz zrjuk be s nyissuk meg jra (a kvnt mdon) az adott dokumentumot.

32

3.2. bra. Az adatvdelmi kzpont makrbelltsai

3.3. bra. Makrk engedlyezse, illetve letiltsa prbeszdablak

3.4. bra. Makrk engedlyezse, illetve letiltsa zenetsv


Megjegyzs
Ha a 2.7. brn lthat srga szn zenetsvban engedlyezzk a makrkat (Tartalom
engedlyezse gomb), akkor az adott szmtgpen a dokumentum megbzhat
dokumentumknt kezeldik a tovbbiakban, ezrt jabb megnyitsakor mr nem kell kln
engedlyezni a makrkat, egybknt (az zenetsv bezrsval) meghagyjuk a makrk letiltst.
Egy jonnan ltrehozott munkafzetben ksztett makrk a belltsoktl fggetlenl mindig
futtathatk.

33

3.2. A Visual Basic Editor


Alaprtelmezsben az Excel menszalagjn nem lthat a Fejleszteszkzk lap (lsd 3.6. bra), amelyen a
Visual Basic fejlesztrendszer, a Visual Basic Editor elrhet, de a gyorsbillentyjvel (Alt+F11) ekkor is
megnyithat. A Fejleszteszkzk lap megjelentshez a Fjl, Belltsok, Menszalag testreszabsa
prbeszdablakban be kell kapcsolni a lap megjelentst szablyoz jellngyzetet (lsd 3.5. bra).

3.5. bra. A menszalag testreszabsa

3.6. bra. A menszalag Fejleszteszkzk lapja


A Visual Basic Editor egy nll ablakban jelenik meg, de az Excel bezrsval ez az ablak is bezrdik. A
fejlesztkrnyezet angol nyelv (men, sg, hibazenetek, stb.), hiba magyar nyelv az Excel, amihez
tartozik.

34

3.7. bra. A Visual Basic Editor


Br az ablak elrendezse bellthat, egy tipikus elrendezs a 3.7. brn lthat. Fell a mensor, alatta az
eszkztrsor, balra fent a Project ablak, alatta a Properties ablak, a jobb oldali, szrke htter
munkaterleten most kt ablak lthat. Az egyik a UserForm1 objektum tervezablaka, a msik a
UserForm1 objektumhoz tartoz forrskd szerkesztablaka. A munkaterlet alatt az Immediate ablak
lthat.
Valamennyi ablak szabadon megjelenthet, mretezhet, ms helyre tehet, vagy akr be is zrhat. A
View men segtsgvel (lsd 3.8. bra) brmikor jra megjelenthet egy bezrt ablak. A gyakran
hasznlatos funkcik a helyi men segtsgvel, vagy a hozzjuk tartoz gyorsbillentykkel is
aktivizlhatk (pl. F7, Shift+F7). A helyi men (a Windows-ban megszokott mdon) az adott helyen, az
egr jobb gombjval hozhat be.

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).

3.8. bra. A Visual Basic Editor View s Window menje


A fontosabb ablakok szereprl a kvetkez alfejezetekben lesz sz.

36

3.2.1. Az Immediate ablak


Az Immediate ablak amellett, hogy a programok egyik output megjelent eszkze (lsd 2.2.6. fejezet),
utastsok kzvetlen vgrehajtsra is hasznlhat. A vgrehajtani kvnt utastsokat egy sorba kell rni,
tbb utasts esetn az utastsok kz kettspontot kell tenni (lsd 2.3.1. fejezet). A vgrehajtst az Enter
billenty letsvel krhetjk.
Az Immediate ablak tartalma szabadon szerkeszthet, gy pl. a korbban vgrehajtott sorok (esetleges
mdostssal) jra vgrehajthatk, a felesleges sorok trlhetk, stb.
Pl.
i=2:j=3
Print i;"*";j;"=";i*j;tab(1);i;"^";j;"=";i^j
?"1-10-ig az egsz szmok":for i=1 to 10:?i;:next:?

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).

3.2.2. A Project ablak


Az MS Office VBA fejlesztkrnyezetben a projektek foglaljk egysgbe az adott dokumentumot a hozz
tartoz makrkkal. A projekt az adott dokumentumfjlban trolt objektumok ttekinthetsgt, kezelst
hivatott szolglni. A Project ablak a Visual Basic Editor View menjnek Project Explorer funkcijval
(lsd 3.8. bra) jelenthet meg (lsd 3.7. bra).
Egy Excel projektben az albbi objektumok szerepelnek, illetve szerepelhetnek:
Excel objektumok (Microsoft Excel Objects)
o Az egyes munkalapok (Munka1,)
o A munkafzet (ThisWorkbook)
Formok (Forms)
Modulok (Modules)
Osztlymodulok (Class Modules)
Az Excel objektumok csoport elemei az adott munkafzethez igazodnak (pl. annyi munkalap objektum
szerepel a projektben, ahny munkalapja van az adott munkafzetnek). A munkalap objektumokkal az
egyes munkalapok, a ThisWorkbook objektummal a (makrkat tartalmaz) munkafzet hivatkozhat.
Ezek az objektumok nem hozhatk ltre, illetve nem trlhetk a Visual Basic Editor-ban, de a hozzjuk
tartoz esetleges esemnykezelk (pl. a munkafzet megnyitsa, bezrsa, egy munkalap aktivizlsa, stb.)
az objektumhoz tartoz modulban definilhatk (lsd 4.2.4 fejezet).
A tbbi csoport (formok, modulok, osztlymodulok) elemeit szabadabban kezelhetjk. Ltrehozhatunk
(Insert), trlhetnk (Remove), behozhatunk (Import), kivihetnk (Export) elemeket (lsd 3.10. bra).
A formokrl, a vizulis formtervezsrl a 3.2.7. fejezetben lesz sz.
A modulok csoport moduljai a forrskdok megadsra hasznlatosak. A logikailag sszetartoz
forrskdokat clszer egy modulba tenni. Az esemnykezelket a megfelel objektum moduljban (azaz
nem a modulok csoportban) kell elhelyezni. A modulok felptsrl a 3.2.5. fejezetben lesz sz.
Az osztlymodulokban osztlyokat (objektumtpusokat) definilhatunk.

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.

3.9. bra. A Visual Basic Editor Insert menje

3.10. bra. A Project ablak helyi menje


A Project ablak elemeit a helyi men Remove funkcijval trlhetjk, ahol a menpont felirata a
kivlasztott objektum nevt is tartalmazza (lsd 3.10. bra bal oldali kpt, ahol a UserForm1 objektum
helyi menje lthat). A trls eltt lehetsgnk van a trlt elem exportlsra (azaz nll fjlknt val
kimentsre), ami egybknt a helyi men Export File funkcijval is megtehet.
Az Import File funkcival betlthetnk s az aktulis projekthez adhatunk nll fjlokban lv
formokat (*.frm), modulokat (*.bas), s osztlymodulokat (*.cls). Az export s import funkcikkal teht
knnyen tudunk objektumokat tvinni projektek kztt.
Megjegyzs
A *.frm, *.bas, *.cls fjltpusokat nemcsak az Excel, hanem ms MS Office alkalmazsok, valamint
az MS Visual Studio fejlesztrendszer szoftverei is egysgesen kezelik.
A formok exportlsakor a *.frm fjlon kvl egy *.frx fjl is ltrejn, amely binris informcikat
trol a formrl.
Az osztlymodulokkal nem foglalkozunk (mert ez a tmakr tln a programozsi
alapismereteken).

38

3.2.3. A Properties ablak


A Properties (tulajdonsgok) ablak a projekthez tartoz objektumok tulajdonsgainak megjelentsre s
azok tervezskori megadsra, mdostsra hasznlatos. A vizulis formtervezs (lsd 3.2.7. fejezet) sorn
itt adjuk meg az adott form, illetve a formon lv vezrlk tulajdonsgait (lsd 3.7., 3.11. bra).
Az ablak tetejn lv legrdl listban kivlaszthat az a vezrl (a formot is belertve), amelynek
tulajdonsgait ltni, illetve megadni szeretnnk. A tulajdonsgokat ktfle sorrendben tudjuk megjelenteni
(a megfelel fl kivlasztsval): nvsor szerint (Alphabetic fl), vagy a tulajdonsgokat kategrik szerint
csoportostva (Categorized fl). Ha mr tudjuk az adott tulajdonsg nevt, akkor a nvsor szerinti fln
gyorsan megtalljuk, klnben clszer a kategorizlt fln keresglni, hiszen ott az sszes tulajdonsg
helyett elegend azon csoport vgignzse, amelyikhez a keresett tulajdonsg tartozik.

3.11. bra. A Properties ablak


A Properties ablakban (mindkt fl esetn) kt oszlop lthat, a bal oldali a tulajdonsgok neveit, a jobb
oldali azok aktulis rtkeit tartalmazza. Az adatok megadsa a jobb oldali oszlopban trtnik, ahol is az
adott tulajdonsgtl fggen vagy begpeljk a tulajdonsg rtkt (pl. Name, Caption, Left), vagy egy
kszletbl kivlasztjuk (pl. Enabled, MousePointer, PictureAlignment), vagy egy prbeszdablakkal adjuk
meg (pl. Font, Picture).
A begpelssel megadott adatok rtke ellenrzdik, rvnytelen adat esetn (pl. szm helyett szveget
adunk meg) hibazenetet kapunk (lsd 3.12. bra).

3.12. bra. rvnytelen tulajdonsg rtkrl tjkoztat hibazenet

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.

3.2.4. A kdszerkeszt ablak


A kdszerkeszt ablak a VBA forrskdok megrsra, azok mdostsra szolgl. A forrskdok
modulokba, azon bell pedig szubrutinokba szervezettek. A kdszerkeszt ablak tetejn kt legrdl lista
tallhat, a bal oldaliban az objektumok, a jobb oldaliban a szubrutinok nevei jelennek meg, illetve
vlaszthatk ki.

3.13. bra. A kdszerkeszt ablak


A listk tartalma egyfell igazodik a kurzor aktulis (forrskdbeli) helyhez, msfell segtsgkkel
gyorsan rpozcionlhatunk a modul kvnt rszre. Vlasztskor ltalban elszr a bal oldali listbl,
utna a jobb oldalibl vlasztunk, mert a jobb oldali lista tartalma a bal oldali lista aktulis elemhez
igazodik.
A bal oldali listban az els elem mindig egy (General) nev elem. Ha ez az elem van kivlasztva, akkor a
jobb oldali listban az els elem egy (Declarations) nev elem (lsd 3.13. bra), a tbbi elem pedig a
modulban tallhat ltalnos (nem esemnykezel) szubrutinok nevei. A (Declarations) elem kivlasztsa a

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.

3.15. bra. Egy ltrehozott j esemnykezel


Megjegyzs
Ha a jobb oldali legrdl listban egy esemnykezel van kivlasztva, s a bal oldali listban egy
msik objektumot vlasztunk ki, akkor, ha van az adott objektumnak olyan esemnykezelje,
akkor arra pozcionlunk, ha nincs, akkor ltrejn az objektum ezen esemnykezelje. Az gy
ltrejtt (esetleg felesleges) res esemnykezelk (amik a futst nem befolysoljk) termszetesen
trlhetk.
A kdszerkeszt ablakok kt rszre oszthatk a Window men Split funkcijval (lsd 3.8. bra),
gy a forrskd kt tetszleges rszt lthatjuk, illetve szerkeszthetjk.
A kdszerkeszt viselkedse a hozz tartoz belltsoktl (lsd 3.20. bra) is fgg. Ezektl a
belltsoktl fggetlenl a kdszerkesztben lehetsg van (tbbek kztt, lsd 3.16. bra) egy objektum
tulajdonsgainak s metdusainak a megjelentsre (List Properties/Methods, lsd 3.17. bra), a
szubrutinok paramterezsnek megjelentsre (Parameter Info, lsd 3.18. bra), valamint a
szkiegsztsre (Complete Word, lsd 3.19. bra) is.

41

3.16. bra. A Visual Basic Editor Edit menje

3.17. bra. A List Properties/Methods funkci

3.18. bra. A Parameter Info funkci

3.19. bra. A Complete Word funkci


A Visual Basic Editor testreszabsa a Tools menben tallhat Options funkcival tehet meg. A
funkci egy prbeszdablakot jelent meg (lsd 3.20. bra), ahol egyrszt megtekinthetk, msrszt
mdosthatk az egyes belltsok. Az els kt fl (Editor, Editor Format) a kdszerkeszt belltsait
tartalmazza, a General fln ltalnos belltsokat vgezhetnk, mg a Docking fln az ablakok
rgzthetsgt szablyozhatjuk.
42

3.20. bra. A Visual Basic Editor belltsainak prbeszdablaka


Az ablak ngy fln bellthat rtkekbl csak nhny, a kdszerkeszt mkdsre vonatkoz belltst
ragadunk ki. Az Auto Syntax Check kapcsol a kdszerkeszt ablakban megadott forrskd sorainak
automatikus szintaktikai ellenrzst szablyozza. Bekapcsolt llapotban egy szintaktikailag helytelen sor
elhagysakor hibazenetet kapunk, s a sor a megfelel sznnel (az Editor Format fln megadott Syntax
Error Text alapjn, ami alaprtelmezsben piros betszn) kiemeldik.
Az Auto List Members kapcsol az automatikus kdkiegsztst szablyozza. Bekapcsolt llapotban a
forrskd begpelsekor megjelenik egy olyan lista a kpernyn, amely logikailag kiegsztheti az adott
utastst (pl. egy objektum utn lettt pont hatsra kiajnldnak az objektum megfelel tulajdonsgai,
metdusai).
Az Auto Quick Info kapcsol bekapcsolt llapotban a szubrutinok paramterezsrl kapunk egy
felbukkan sgt kdszerkeszts kzben, ahol az ppen megadand paramter flkvren jelenik meg.
Megjegyzs
Clszer megtartani az alaprtelmezett belltsokat (amelyben pl. a fent emltett kapcsolk
mindegyike bekapcsolt llapot).
A forrskd szerkesztsekor a szintaktikailag helyes sor nha talakul, amint a kurzor elhagyja
az adott sort. A kulcsszavak kiemeldnek (alaprtelmezsben kk sznnel), a felismert (azaz nem
elgpelt) azonostk a deklarlskor megadott alakban (kis- s nagybet) jelennek meg, esetlegesen
szkzk szrdnak be, illetve felesleges szkzk trldnek. Ez az egysgestett kllem javtja
az ttekinthetsget, a forrskd olvashatsgt.
Az objektumok tulajdonsgait s metdusait clszer a kdkiegsztssel kiajnlott listbl
kivlasztani, mert gyorsabb, s gy biztosan nem gpeljk el.
Az egyes szubrutinokat (valamint a deklarcis rszt) alaprtelmezsben egy vzszintes vonal
vlasztja el egymstl (aminek megjelenst a Procedure Separator kapcsol szablyozza (lsd
3.20. bra)).

43

3.2.5. Modulok felptse


Minden modul, legyen az objektumhoz tartoz vagy nll modul (lsd 3.2.2. fejezet), ugyanazt az
egyszer felptst kveti. A modul elejn a modulszint utastsokat kell megadni, amelyeket a modul
szubrutinjai kvetnek.
Modulszint utastsok
Deftype utastsok (pl. DefInt)
Opcikat megad utastsok (pl. Option Explicit)
Tpusdeklarcik (pl. Type, Enum)
Modulszint konstansok (Const), illetve vltozk (Public, Private, Dim) deklarlsa
Megjegyzs: Az opcikat megad utastsokkal a Visual Basic fordt/rtelmez mkdst
szablyozhatjuk. Ezek, illetve a Deftype utastsok rvnyessge (scope) csak az adott modulra terjed ki. A
modulszint tpus, konstans s vltoz deklarci azonban deklarlhat ms modulbl is hivatkozhat
(publikus) elemeket is.
Pl.
'A vltozk ktelez deklarlshoz
Option Explicit
'A szorztbla mrete
Const n = 10
'Vletlenszer "kszns"
Sub Koszon()
If Int(Rnd * 2) = 0 Then MsgBox "Szia!" Else MsgBox "Hell!"
End Sub
'A szorztbla kirsa az Immediate ablakba
Sub Szorzo_Tabla1()
Dim i As Integer, j As Integer, st As String
For i = 1 To n
st = ""
For j = 1 To n
st = st + " " & i & "*" & j & "=" & i * j
Next
Debug.Print st
Next
End Sub
'A szorztbla egy msfajta kirsa az Immediate ablakba
Sub Szorzo_Tabla2()
'Egy adat mezszlessge
Const msz = 5
Dim i As Integer, j As Integer
For i = 1 To n
Debug.Print Tab(i * msz + 1); i;
Next
Debug.Print
For i = 1 To n
Debug.Print i;

44

For j = 1 To n
Debug.Print Tab(j * msz + 1); i * j;
Next
Debug.Print
Next
End Sub

3.2.6. Fordts, futtats, hibakeress


A forrsprogramok rsakor a kdszerkeszt mr ellenrizni tudja az adott sor szintaktikjt (lsd 3.2.4.
fejezet). A Visual Basic Editor Debug menjnek Compile VBAProject funkcijval (lsd 3.21. bra) az
adott projekthez tartoz sszes forrsprogram lefordthat. Ezzel kiszrhetk a forrsprogramok
szintaktikai (formai) hibi, ugyanis az els megtallt hibrl zenetet kapunk, a kdszerkeszt ablakban ez
a kdrszlet jelenik meg, s a hibs sor kiemeldik.

3.21. bra. A Visual Basic Editor Debug s Run menje


A forrskdok termszetesen nemcsak fordthatk, de futtathatk is. A futtats funkci a Run men Run
Sub/UserForm funkcijval (lsd 3.21. bra) vgezhet. A funkci neve is utal arra, hogy egy szubrutint,
vagy egy felhasznl ltal ksztett formot (UserForm) lehet futtatni, s a kett kztt klnbsg van,
ugyanis, ha egy formhoz tartoz modulban krjk ezt a funkcit (pl. az F5 gyorsbillentyvel), akkor
fggetlenl attl, hogy a modul mely rszn ll a kurzor, a form futtatst krjk. Az ilyen modulban lv
szubrutinok teht nem futtathatk kln-kln. A futtats funkci nem fordtja le az esemnykezel
szubrutinokat.
Ms a helyzet a tbbi (nem formhoz tartoz) modullal. Itt ugyanis minden olyan szubrutin kln
futtathat, amelynek nincsen paramtere. lljunk a kurzorral a futtatni kvnt szubrutin egy sorra s
krjk a futtats funkcit. Ekkor a szubrutin fordtsa is megtrtnik. A paramterrel rendelkez
szubrutinokat nem lehet kzvetlenl futtatni, ezek csak kzvetve, valamilyen ket meghv szubrutin
segtsgvel futtathatk.
Ha az aktulis sor nem tartozik egyik szubrutinhoz sem (pl. kt szubrutin kztti res soron vagy a modul
deklarcis rszben ll a kurzor), akkor a futtats funkci egy prbeszdablakot jelent meg (ugyanezt
teszi a Tools men Macros funkcija is), amelyben a modulban tallhat futtathat (paramter nlkli)
szubrutinok listja jelenik meg (lsd 3.22. bra). Az ablakban kivlaszthat a futtatand (Run), lpsenknt
futtatand (Step Into), szerkesztend (Edit), vagy trlend (Delete) szubrutin, amely akr egy msik
projektben is lehet (mivel a Macros In legrdl lista segtsgvel akr az sszes nyitott projekt futtathat
szubrutinjnak nevt is megjelenthetjk a makrkat tartalmaz listban).

45

3.22. bra. A futtathat szubrutinok prbeszdablaka


Egy program futsnak megszaktsa a Run men Break funkcijval krhet, amelynek gyorsbillentyje
Ctrl+Break vagy Esc (pl. egy vgtelen ciklusba esett program futst csak ezekkel a billentykkel lehet
megszaktani). A megszaktott programfuts esetn a futs folytathat (Continue), lellthat (End), illetve
felfggeszthet (Debug) (lsd 3.23. bra).

3.23. bra. A megszaktott programfuts prbeszdablaka


Egy fut (vagy futsban felfggesztett) program futsnak a befejezse a Run men Reset funkcijval
krhet. A Run men funkcii az eszkztrsor segtsgvel is aktivizlhatk.
Egy program helyes mkdsnek tesztelse a programfejleszti munka rsze. Sajnos gyakran elfordul,
hogy a programunk nem gy mkdik, ahogy szeretnnk. A programok szemantikai (tartalmi, jelentsbeli,
logikai) hibinak feltrsa mr nehezebb feladat (szemben azzal, hogy a szintaktikai hibkat egyetlen
fordtssal kiszrhetjk).
A programfejleszt rendszerek (gy a VBA is) specilis funkcikat biztostanak a programok szemantikai
hibinak feldertsre. Ezek a funkcik alapveten kt fontos szolgltatst nyjtanak: megtudhatjuk, hogy
merre halad a vezrls (milyen utastsok kerlnek vgrehajtsra), s hogy az egyes vltozkban milyen
rtkek vannak.

46

3.24. bra. Lpsenknti futtats s a Watches ablak


A programok lpsenknti futtatsa a Debug men Step Into funkcijval vgezhet. Ez azt jelenti, hogy a
vgrehajts utastsonknt (de mivel ltalban egy sorba egy utastst runk, ezrt gyakorlatilag soronknt)
trtnik, s minden egyes utasts vgrehajtsa eltt a program futsa felfggesztdik. Ekkor lehetsgnk
van a vltozk tartalmnak megtekintsre (esetleges mdostsra), majd a futs folytatsra, illetve a
futs lelltsra (ha pl. mr rjttnk az esetleges hibra). Az ppen vgrehajtsra kerl utasts
(alaprtelmezsben) srga httrsznnel (s a marg svon egy srga nyllal) emeldik ki (lsd 3.24. bra).
Egy hosszabb forrsprogram esetn hasznos lehet, ha csak ott kezdjk el a lpsenknti futtatst, ahol a
hibt sejtjk. Ez megtehet a forrskdban elhelyezhet trspontok (Breakpoints) segtsgvel. A
trspontok adott sorra val elhelyezse, illetve levtele a Debug men Toggle Breakpoint funkcijval
vgezhet. A programfuts egy trspontra rve felfggesztdik (azaz lehetsgnk van a lpsenknti
futtatsra, stb.). A trspontok sort a margn egy kr jelzi, mg a sor (alaprtelmezsben) bord
httrsznnel emeldik ki (lsd 3.25. bra).
A forrskd egy adott sorig val futtats (Debug men Run To Cursor funkci) is azt a clt szolglja,
hogy ott fggesszk fel a program futst, ahol a hibt sejtjk.
A Debug men Step Over funkcijt akkor hasznljuk, ha lpsenknti futtatskor egy olyan utastsra
lpnk, amelyik szubrutinhvst tartalmaz (pl. egy sajt eljrst vagy fggvnyt hvunk meg), s szeretnnk
ezt az utastst egy lpsben vgrehajtani (mert pl. tudjuk, hogy a hiba nem abban a szubrutinban van). A
Step Into funkci ugyanis ekkor belp az adott szubrutinba, s ott folytatdik a lpsenknti futtats. Ha
belptnk egy szubrutinba, akkor hasznlhat a Step Out funkci is, ami lefuttatja az adott szubrutint,
majd a lpsenknti futtats a hv szubrutinban a hvst kvet utastssal folytatdik.
A vltozk rtkeinek megfigyelsi (Watches) ablakt (lsd 3.24. bra) a View men Watch Window
funkcijval jelenthetjk meg. Az ablak helyi menjvel j vltozkat vehetnk fel (Add Watch) (lsd
3.25. bra), vagy egy meglvt mdosthatunk (Edit Watch), illetve trlhetnk (Delete Watch).
A tmb- s rekordvltozk az elttk megjelen (mnusz, plusz) ikonokkal becsukhatk, illetve
kinyithatk gy az egyes tmbelemek, illetve rekordmezk is megtekinthetk (lsd 3.24. bra).

47

3.25. bra. Egy trsponton felfggesztett programfuts a Watches s az Add Watch ablakokkal

3.26. bra. Egy vltoz rtknek megjelentse az egrkurzor segtsgvel


Megjegyzs
Felfggesztett programfuts esetn az egyszer (nem sszetett adattpus) vltozk tartalma gy is
megtekinthet, hogy az egrrel az adott vltoz fl pozcionlunk (lsd 3.26. bra). Ehhez az
Auto Data Tips kapcsolnak (lsd Tools men Options funkci, Editor fl) bekapcsolt
llapotban kell lennie (lsd 3.20. bra).
A Watches ablakban nemcsak vltozk rtkeit figyelhetjk meg, de kifejezseket is
kirtkelhetnk. A vltozk tartalmt az rtkk (Value) mdostsval meg is vltoztathatjuk.
Trspontokat nem helyezhetnk el akrhol (pl. res vagy egy Dim utastst tartalmaz soron nem
lehet trspont). A trspontokat a kdszerkeszt ablak bal szln (a marg svon) val
egrkattintssal is elhelyezhetnk (illetve levehetnk).

3.2.7. Vizulis formtervezs


A Windows alkalmazsokban a felhasznlval trtn kommunikci egyik alapvet eszkze az ablak
(ms nven form, rlap). Termszetesen az alkalmazs helyes mkdse a legfontosabb, de a kllem, az
ttekinthetsg, a knny kezels, vagyis a felhasznlbart viselkeds is lnyeges szempont. ppen ezrt a
Windows platform szoftverfejleszt rendszerek (gy az MS Excel VBA is) tmogatjk a formok vizulis,
interaktv tervezst.
A tervezs (manapsg ltalnosan elterjedt) jellemzje a WYSIWYG (What You See Is What You Get)
tervezsi md, ami azt jelenti, hogy a tervezett ablak pontosan gy fog megjelenni futskor, mint ahogyan
azt a tervezskor ltjuk (lsd 3.27. bra).
Egy j form ltrehozsa a Visual Basic Editor Insert menjnek UserForm funkcijval (vagy a Project
ablak helyi menjnek segtsgvel) hozhat ltre. A form (pl. a jobb szln s aljn lv fehr keretez
ngyzetek segtsgvel) tetszlegesen tmretezhet.

48

3.27. bra. Egy form tervezskor s futskor


A formra tehet, hasznlhat vezrlket (Controls) a Toolbox ablak jelenti meg (lsd 3.28. bra). Egy
form tervezsekor (azaz ha a UserForm objektum ablaka aktv), a Toolbox ablak automatikusan
megjelenik (s ha az ablakot esetleg bezrnnk, akkor a View men Toolbox funkcijval, vagy az
eszkztrsor megfelel ikonjval jra megnyithatjuk).

3.28. bra. A Toolbox ablak


A Toolbox ablak a fontosabb Windows vezrlket tartalmazza, mint pl. cmke (Label), beviteli mez
(TextBox), legrdl lista (ComboBox), lista (ListBox), jellngyzet (CheckBox), vlasztgomb
(OptionButton), nyomgomb (CommandButton).
Egy vezrl formra helyezse az egrrel trtnhet. A kvnt vezrl a Toolbox ablakbl a formra vihet a
fogd s vidd egrmvelettel, de a kvnt vezrln, majd a formon val kattints is ugyanezt teszi, azaz
elhelyezi a formon az adott vezrl egy pldnyt (alaprtelmezett mretben). Ha a formon kattints
helyett egy tglalap alak terletet jellnk ki, akkor a vezrl a megadott mretben kerl a formra.
A form, illetve a formon lv vezrlk egrkattintssal kijellhetk, de a Windows-ban szoksos kijellsi
technikkkal (lenyomott Ctrl vagy a Shift billenty s egrkattints, vagy jellkeret rajzolsval) csoportos
elemkijells is vgezhet. Csoportos kijellst akkor hasznlunk, ha a vezrlk egy csoportjra szeretnnk
valamilyen mveletet (pl. mozgats, trls, adatmegads) elvgezni.
A kijellt vezrlk az egr fogd s vidd mvelettel szabadon mozgathatk (thelyezhetk), s
mretezhetk (ehhez valamelyik keretez ngyzetet kell mozgatnunk). Ha tbb vezrl van kijellve,
akkor a Properties ablakban csak a kzs tulajdonsgok jelennek meg.
A kijellt vezrl (vagy vezrlk) kezelse az Edit men (vagy a helyi men) segtsgvel is trtnhet. A
trls a Delete billentyvel (illetve a Delete funkcival) vgezhet, de a vgasztal tbbi mvelete (pl.
vglapra msols, beilleszts) is hasznlhat.
Futskor alapesetben az egyes vezrlk a formra val felkerlsk sorrendjben aktivizlhatk. Az els
vezrl lesz fkuszban, s a felhasznl a Tab (illetve Shift+Tab) billentykkel tud ezen sorrend szerint
lpkedni az egyes vezrlkn. Ez azonban nem felttlenl igazodik a vezrlk formon val
elrendezshez. A form helyi menjnek Tab Order funkcijval mdosthat a vezrlk futskori
sorrendje (lsd 3.29. bra). Az aktulisan kivlasztott vezrl felfel, illetve lefel mozgathat a megfelel
nyomgombokkal (Move Up, Move Down), gy a megfelel sorrend kialakthat.

49

3.29. bra. A Tab Order ablak


A formra tett vezrlk a vezrl tpusbl s egy sorszmbl ll azonostt (Name) kapnak (pl.
CommandButton1). A sorszm egytl kezdden kerl kiosztsra. A kifejezbb, olvashatbb programkd
rdekben a vezrlket t is nevezhetjk, ezt clszer kzvetlenl a formra val elhelyezs utn megtenni,
mg mieltt esemnykezelket definilnnk hozz (ugyanis a megvltozott neveket az esemnykezelk
nevei nem kvetik).
Egy vezrl egy esemnykezeljnek ltrehozsa (illetve mr meglv esemnykezel esetn az arra val
rpozcionls) ltalnosan a kdszerkeszt ablak tetejn lv legrdl listkbl val vlasztssal
trtnhet. Azonban a vezrlk alaprtelmezett esemnykezelje (ami pl. nyomgomb esetn a kattintsnak
megfelel Click, beviteli mez esetn a tartalom megvltozsnak megfelel Change) a vezrln val dupla
kattintssal is megnyithat.
Az esemnykezelk azonostja az adott objektum azonostjbl (Name), az alulvons karakterbl, s az
esemny nevbl ll, a paramterezsk pedig rgztett (pl. CommandButton1_Click(),
ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)).
Megjegyzs
Egy vezrl a Properties ablak legrdl listjval is kijellhet.
Az objektumoknak lehetnek olyan tulajdonsgai is, amelyek csak futsi idben rhetk el, ezek
meg sem jelennek a Properties ablakban (pl. ListBox.ListIndex).
Nhny fontosabb tulajdonsg: nv (Name), felirat (Caption), elhelyezkeds (Top, Left), mret
(Width, Height), vlaszthatsg (Enabled), lthatsg (Visible).

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

A feladat megoldshoz szksges informcikhoz (nevezetesen, hogy hogyan hivatkozzuk a beviteli


mezben megadott adatot, s hogyan lehet egy lista elemeit bvteni) a sg, illetve az objektumtallz
(Object Browser) segtsgvel juthatunk.

3.30. bra. A Visual Basic Editor sgja


Ha pl. tervezskor kijelljk a lista vezrlt s lenyomjuk az F1 billentyt, akkor a 3.30. brn lthat
sgtartalom jelenik meg. A sg a Windows-ban megszokott mdon hasznlhat (pl. kereshetnk benne,
a megnzett oldalakra visszamehetnk, stb.)
Az objektumtallz a View men Object Browser funkcijval jelenthet meg. Itt (lsd 3.31. bra) egyben
lthatjuk az osztlyok (gy az egyes vezrlk) tulajdonsgait (pl. BackColor), metdusait (pl. AddItem), s
esemnykezelit (pl. BeforeDragOver). Az ablakban keressi s sg funkci is hasznlhat. A sg itt is
51

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).

3.31. bra. Az Object Browser


Az Object Browser ablak (bal fels sarkban tallhat) Project/Library legrdl listjval kivlaszthat az
a projekt, illetve rendszerknyvtr (library), amelynek tartalmt megjelenteni szeretnnk (lsd 3.32. bra).
A 3.31. brn az All Libraries elem van kivlasztva, gy minden elrhet osztly megjelenik a Classes
listban.

3.32. bra. Az Object Browser ablak Project/Library legrdl listjnak tartalma


2. Feladat: Ne fogadjunk el res adatot!
Megolds: A Felvtel gomb kattints esemnykezeljnek mdostsa. res adatnak vesszk azokat az
adatokat is, amelyekben csak szkzk szerepelnek. Az adat kezd s zr szkzeinek eltvoltsra a
Trim fggvnyt hasznltuk.
Az esemnykezel forrskdja:
'Felvtel (res adatot nem vesz fel)
Private Sub CommandButton1_Click()
Dim st As String
st = Trim(TextBox1.Text)
If st = "" Then
MsgBox "res adat!"

52

Else
ListBox1.AddItem st
End If
End Sub

3. Feladat: Egy korbban megadott adatot lehessen trlni!


Megolds: Egy j nyomgomb (Trls) formra helyezse, felirat megadsa, s a gomb kattints
esemnykezeljnek megrsa. Egy listban kivlasztott elem indext a ListIndex tulajdonsg mutatja (1
esetn nincs a listban kivlasztott elem). Az els elem indexe 0, a msodik 1, , az utols ListCount1
(ahol a ListCount tulajdonsg a lista elemeinek szmt adja). A trlst a lista RemoveItem metdusval
vgezzk.
Megjegyzs: A megoldsban kihasznltuk, hogy a listnkban (alaprtelmezsben) egyszerre legfeljebb egy
elem lehet kivlasztva. A tbbszrs elemkivlasztst megenged listk esetn a Selected tulajdonsgot kell
hasznlni az elemek kivlasztottsgnak lekrdezshez. Azt, hogy egy lista egyszeres vagy tbbszrs
elemkijellst enged-e meg, a MultiSelect tulajdonsg szablyozza.
Az esemnykezel forrskdja:
'A listban kivlasztott adat trlse
Private Sub CommandButton2_Click()
If ListBox1.ListIndex = -1 Then
MsgBox "Nincs kivlasztott adat!"
Else
ListBox1.RemoveItem ListBox1.ListIndex
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

5. Feladat: Ne lehessen kt egyforma adatot megadni!


Megolds: Egy keresciklus segtsgvel megvizsgljuk, hogy szerepel-e mr a felvett adatok (azaz a lista
elemei) kztt a beviteli mezben megadott (kezd s zr szkzket mr nem tartalmaz) adat, ha igen,
akkor zenetet adunk, egybknt meg felvesszk a lista elemei kz.
A keressre (egy elltesztel) While ciklust hasznlunk. A ciklus sorban megvizsglja a lista elemeit az
els elemtl kezdve, legrosszabb esetben egszen az utolsig. Ha megtalljuk a keresett adatot, akkor
kilpnk a ciklusbl.

53

'Felvtel (nem vesz fel res vagy mr ltez adatot)


Private Sub CommandButton1_Click()
Dim st As String, i As Integer, van As Boolean
st = Trim(TextBox1.Text)
If st = "" Then
MsgBox "res adat!"
Else
'Szerepel-e mr a kijellt elem a ListBox1-ben?
van = False: i = 1
While Not van And (i <= ListBox1.ListCount)
If st = ListBox1.List(i - 1) Then van = True Else i = i + 1
Wend
If van Then
MsgBox "Van mr ilyen adat!"
Else
'Nem szerepel mg, felvesszk
ListBox1.AddItem st
End If
End If
End Sub

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. A hasznlhat objektumok, objektumtpusok


Az objektumokhoz ktd alapfogalmakrl mr olvashattunk (lsd 2.6. fejezet), most az Excel VBA
krnyezetben hasznlhat objektumokrl s objektumtpusokrl lesz sz.
A fejlesztkrnyezetben egysgesen hasznlhat osztlyokat (illetve modulokat, szubrutinokat, tpusokat)
az ket trol fjlok (illetve rendszerfjlok) csoportostjk (lsd 3.32. bra):
Excel osztlyok (pl. Workbooks, Range, Chart, Dialogs)
MS Forms osztlyok (pl. TextBox, ListBox, UserForm)
MS Office osztlyok (pl. CommandBar, CommandBarControl)
VBA osztlyok (pl. Collection)
VBA Project osztlyok (az adott projektben definilt osztlyok)
Megjegyzs
Az ltalunk hasznlt objektumok (pl. Application, Debug) az Excel futsakor mr ltez (azaz
hivatkozhat) objektumok.
Futsidben is ltrehozhatk j objektumok (pl. Worksheets.Add), illetve mr ltez objektumok
megszntethetk (pl. Charts(1).Delete).
Az objektumtpusokat hasonlan kezelhetjk, mint a VBA tbbi tpust (pl. Dim r As Range).

4.1.1. Az Application objektum


Az Application objektum az Excel alkalmazs objektuma. Segtsgvel az alkalmazshoz tartoz sszes
objektum (pl. a nyitott munkafzetek, projekt objektumok) elrhet. Az Application objektum feladata az
alkalmazsszint belltsok, tevkenysgek vgrehajtsa is (pl. DisplayAlerts, ReferenceStyle).
Az Application objektum nhny fontosabb tulajdonsga: Workbooks, Worksheets, Charts, Sheets,
ActiveWorkbook, ActiveSheet, ActiveCell, ActiveChart, Range, Cells, Rows, Columns, Selection.
Megjegyzs
Az Application objektum tulajdonsgaira, illetve metdusaira val hivatkozsbl az Application
sz elhagyhat (pl. Application.ActiveCell helyett elegend az ActiveCell hivatkozs), ezrt
ltalban el is hagyjuk. Az objektum nlkli hivatkozsokban (pl. Range) az Application objektum
tulajdonsgait, illetve metdusait hivatkozzuk.
A Selection olyan specilis tulajdonsg, amely az aktulisan kijellt objektumot adja eredmnyl,
gy az eredmny tpusa attl fgg, hogy ppen mi van kijellve (pl. cellatartomny esetn egy
Range objektum, diagram esetn egy Chart objektum lesz az eredmny).

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.

4.1.3. A Range objektum


A Range objektum cellatartomny kezelsre hasznlatos. Az albbiakban felsoroljuk a Range objektum
nhny fontosabb tulajdonsgt s metdust, majd mintapldkkal szemlltetjk ezek hasznlatt.
Tulajdonsgok: Address, Areas, Cells, Column, Columns, ColumnWidth, Count, CurrentRegion, Font,
Formula, FormulaLocal, FormulaR1C1, FormulaR1C1Local, Height, Name, NumberFormat,
NumberFormatLocal, Offset, Range, Resize, Row, RowHeight, Rows, Value, Width.
Metdusok: AutoFill, Clear, ClearFormats, Copy, Delete, Find, PasteSpecial, Select, Sort.
Megjegyzs: A cellatartomnyra a blokk sz is hasznlatos (mert rvidebb), de a kt dolog nem pontosan
ugyanazt jelenti. Blokkon ugyanis egy sszefgg, tglalap alak cellatartomnyt rtnk. Egy
cellatartomny llhat tbb blokkbl is, de ez fordtva nem igaz.
Hivatkozs
Az A1 stlus hivatkozs: a cellatartomnyt egy sztringben megadott kifejezssel hivatkozzuk.
Pl.
Range(A1), Range(c2), Range(A2:B3), Range(A:A), Range(1:1),
Range(A1:A5,C1:C5), Range(A:A,C:D).
Az R1C1 stlus hivatkozs: a cellatartomnyt a sor- s oszlopindexek segtsgvel hivatkozzuk.
Pl.
Cells(1,1), Cells(2,3), Range(Cells(2,1), Cells(3,2)), Columns(1), Rows(1).
Kijells: Select metdus
Pl.
'Az els munkafzet els munkalapjn az A1:B3 blokk kijellse
Application.Workbooks(1).Worksheets(1).Range("A1:B3").Select
'Az aktulis munkalap A1:B3 blokkjnak kijellse
Range("b3:a1").Select

Adatmegads: Value tulajdonsg


Pl.
'Az aktulis munkalap celliba tesznk adatokat
Range("A1").Value = "Maci Laci"
'Egy szveg
Range("A2").Value = 2*3
'Egy szm
Cells(3,1).Value = Date
'Az aktulis dtum
Cells(4,1).Value = CDate("2012.12.24")
'Egy adott dtum
Cells(4,1).Value = ""
'Adat trlse

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

Formtum trlse: ClearFormats metdus


Pl.
'Az aktulis munkalap egy blokkjnak formtumt trljk
Range("A1:A4").ClearFormats

A tartalom s a formtum trlse: Clear metdus


Pl.
'Az aktulis munkalap egy blokkjnak formtumt s tartalmt trljk
Range("A1:A4").Clear

A blokk cellinak trlse: Delete metdus


Pl.
'Az aktulis munkalap egy blokkjnak cellit trljk
Range("A1:A4").Delete
'A jobbra lv cellk balra lpnek
Range("A1:D1").Delete
'A lenti cellk feljebb lpnek

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 $"

Az aktulis cellt tartalmaz sszefgg blokk: CurrentRegion tulajdonsg


Pl.
'Az aktulis munkalap A1-es celljt tartalmaz blokk mretei
s = Range("A1").CurrentRegion.Rows.Count
'Sorok szma
o = Range("A1").CurrentRegion.Columns.Count
'Oszlopok szma

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

vlasztgomb) be van kapcsolva, de ez ltalban bekapcsolt llapot az Excel-ben). A programmal


kiszmolt eredmnyek frisslshez ugyanis az eredmnyt szmt forrskdot jra kell futtatni.
Ahhoz, hogy forrskdbl olyan Excel kpleteket tudjunk az egyes cellkba tenni, amelyek a kvnt
feladatot elvgzik (kiszmoljk a megfelel eredmnyeket a megfelelen hivatkozott cellatartomnyok
adataibl), szksgnk van az Excel cellahivatkozsainak ismeretre.
A cellahivatkozsok stlusa az Excel-ben bellthat (lsd Fjl, Belltsok, Kpletek, S1O1 hivatkozsi
stlus jellngyzet). ltalnosan elterjedt az A1 stlus cellahivatkozs, amely az oszlopokat egy vagy tbb
betvel, mg a sorokat sorszmokkal jelli. Bellthat azonban az n. S1O1 stlus cellahivatkozs is, ahol
az oszlopok is sorszmokkal azonosthatk.
Megjegyzs: Az S1O1 stlus hivatkozsban az S bet a sort, az O bet az oszlopot jelenti. Az S1O1
cellahivatkozsi stlus angol elnevezsben (R1C1 style) R jelenti a sort (row), C pedig az oszlopot
(column).
A VBA krnyezetben az Excel cellahivatkozsi stlust az Application objektum ReferenceStyle
tulajdonsga trolja, gy a cellahivatkozsi stlus lekrdezse, illetve belltsa ezzel a tulajdonsggal
trtnhet.
Pl.
'Lekrdezs
If Application.ReferenceStyle = xlR1C1 Then
MsgBox ("Az Excel S1O1 stlus cellahivatkozst hasznl")
Else
MsgBox ("Az Excel A1 stlus cellahivatkozst hasznl")
End If
'Bellts
Application.ReferenceStyle = xlA1

Az S1O1 cellahivatkozsi stlusban a cellkra a sorok s oszlopok sorszmval hivatkozunk. A


cellahivatkozsok ugyangy lehetnek abszolt, relatv s vegyes hivatkozsok, mint az A1 stlus esetn. A
relatv hivatkozsnl a megadott sorszmokat szgletes zrjelbe kell tenni, az abszolt hivatkozsnl nem.
A relatv hivatkozs mindig a hivatkozst tartalmaz cellhoz kpest relatv, ahhoz viszonytva rtend. Ha
a hivatkozst tartalmaz cella sort, illetve oszlopt szeretnnk hivatkozni, akkor nem kell sorszmot
megadnunk.
Az albbiakban az S1O1 cellahivatkozsi stlusokra adunk pldkat (ahol a ~ karakter utn megadjuk az
S1O1 stlus cellahivatkozs A1 stlus megfeleljt).
Abszolt hivatkozs (pl. S1O1 ~ $A$1; S12O3 ~ $C$12).
Relatv hivatkozs (pl. SO[1] ~ ugyanaz a sor, az oszlop az eggyel jobbra lv; S[-1]O ~ a sor az
eggyel feljebb lv, az oszlop ugyanaz).
Vegyes hivatkozs (pl. S2O[1] ~ abszolt sor (a msodik), relatv oszlop (az eggyel jobbra lv);
SO1 ~ relatv sor (ugyanaz a sor), abszolt oszlop (az els)).
Egy cellatartomny hivatkozsnak lekrdezse: Address tulajdonsg
Az Address tulajdonsg hasznlatnak (egyszerstett) szintaktikja:
expression.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, RelativeTo)
RowAbsolute
ColumnAbsolute
ReferenceStyle
RelativeTo

Az eredmnyhivatkozs sor abszolt legyen-e (alaprtelmezsben True).


Az eredmnyhivatkozs oszlop abszolt legyen-e (alaprtelmezsben True).
Az eredmnyhivatkozs stlusa (xlA1 vagy xlR1C1, alaprtelmezsben xlA1).
Az R1C1 tpus eredmnyhivatkozs viszonytsi Range objektuma.

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

Kpletek hasznlata: FormulaR1C1, FormulaR1C1Local tulajdonsgok


Ez a kt tulajdonsg olyan kpletek megadsra hasznlhat, amelyekben a cellatartomnyokra az R1C1
cellahivatkozsi stlussal hivatkozunk. A kvetkez pldk mindegyike a C2-es cellba helyez el egy
kpletet, amely egy cella tartalmnak ktszerest szmolja ki. A cella, amire hivatkozunk, a hivatkozstl
fggen vltozik. A C2-es cellba kerl A1 hivatkozsi stlus kpletet a sorok vgn tallhat
megjegyzsekben lthatjuk.
Pl.
'Egy egyszer kpletet a C2-es cellba
Range("C2").FormulaR1C1 = "=R1C1*2"
' "=$A$1*2"
Range("C2").FormulaR1C1 = "=RC1*2"
' "=$A2*2"
Range("C2").FormulaR1C1 = "=R1C*2"
' "=C$1*2"
Range("C2").FormulaR1C1 = "=R[1]C[-1]*2"
' "=B3*2"
'A FormulaR1C1Local tulajdonsgban az S s O betk szerepelnek
Range("C2").FormulaR1C1Local = "=S1O1*2"
' "=$A$1*2"
Range("C2").FormulaR1C1Local = "=S[1]O[-1]*2" ' "=B3*2"

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]

Kpletek msolsa: Copy, AutoFill, PasteSpecial metdusok


A kpleteket tartalmaz cellkat gyakran msoljuk, hogy ne kelljen azokat tbbszr megadni. A msols az
Excel-ben tbbfle mdon is elvgezhet (pl. a vgasztal segsgvel, a msoland cella jobb als
sarknl lv kitltjel segtsgvel), gy ezt forrskdbl is tbbflekppen vgezhetjk.
Pl.
'Az s+1. sor 1. oszlopban lv kplet msolsa az s+1. sor
'oszlopaiba a 2. oszloptl az o. oszlopig
Cells(s + 1, 1).Copy Destination:= _
Range(Cells(s + 1, 2), Cells(s + 1, o))
'Az 1. sor o+1. oszlopban lv kplet msolsa az o+1. oszlop
'soraiba a 2. sortl az s. sorig
AutoFill esetn a cltartomnynak a forrst is tartalmaznia kell
Cells(1, o + 1).AutoFill Destination:= _
Range(Cells(1, o + 1), Cells(s, o + 1))
'Mint az elz, csak msolssal s beillesztssel
Cells(1, o + 1).Copy
'Beilleszts
Range(Cells(2, o + 1), Cells(s, o + 1)).PasteSpecial
'A forrstartomnyt jell (villog) szegly levtele
Application.CutCopyMode = False

60

Egyb lehetsgek: Rows, Columns, Cells, Range, Offset, Resize


A Range objektum fenti tulajdonsgai Range objektumot adnak eredmnyl. Az els ngy tulajdonsg
jelentse s hasznlata rtelemszer; az Offset tulajdonsggal egy, az adott Range objektumhoz kpest
relatv elmozdulssal nyert Range objektum hivatkozhat; a Resize tulajdonsggal pedig tmretezhet egy
adott blokk. A pldkban az egyes tulajdonsgok eredmnyeknt kapott Range objektumoknak a Select
metdust hvjuk meg (amellyel lthat lesz az eredmny). Az utols plda az A1-es cella egy feleslegesen
cifra hivatkozst szemllteti.
Pl.
'Egy Range objektum egy sora, illetve egy oszlopa
Range("C3:D6").Rows(2).Select
Range("C3:D6").Columns(2).Select
'Egy Range objektum egy cellja
Range("C3:D6").Cells(1, 2).Select
'Ugyanazt jelli ki, mint az elz
Range(Cells(3, 3), Cells(6, 4)).Range("B1").Select
'Egy Range objektum egy Range objektuma
Range("C3:D6").Range("A2:B2").Select
'Egy Range objektumbl relatv elmozdulssal nyert Range objektum
Range("C3:D6").Offset(-1, 1).Select
'Egy Range objektum tmretezse
Cells(2,2).Resize(3,2).Select
'Range objektumok egyestse
Application.Union(Columns(1), Columns(4)).Select
'Az A1-es cella egy feleslegesen cifra hivatkozsa
Range("A1").Cells(1,1).Offset(0,0).Resize(1,1).Cells(1).Select

4.1.4. A WorksheetFunction objektum


Az elz fejezetben lttuk, hogyan helyezhetnk el kpleteket az egyes cellkba. Ezzel a megoldssal az
Excel vgzi a szmolsokat, s jelenti meg az eredmnyeket a kpleteket tartalmaz cellkban. Ennl a
megoldsnl teht bizonyos cellk tartalma mdosul. Elfordulhat azonban olyan eset, amikor ez a
megolds nehezebben realizlhat (pl. ha az adatokat tartalmaz munkalap vdett, akkor egy msik (nem
vdett, akr egy msik munkafzethez tartoz) munkalap szksges a megoldshoz).
Az Excel munkalapfggvnyei azonban nemcsak a cellkban elhelyezett kpletekben hasznlhatk. A
forrskdbl meghvhat munkalapfggvnyeket a WorkSheetFunction trol (container) objektum
foglalja egy logikai egysgbe. Az objektum fggvnymetdusai az egyes munkalapfggvnyek, amelyek
paramterei egyarnt lehetnek munkalapok Range objektumai, s memriavltozk (pl. egy tmbvltoz).
A fggvnymetdusok hasonlan hvhatk, mint a VB fggvnyei (a hvs brhol llhat, ahol az eredmny
tpusnak megfelel rtk llhat), gy az eredmny megkaphat a cellk mdostsa nlkl is (igaz, az
adatok mdosulsa esetn a szmolst vgz forrskdot jra kell futtatni).
A forrskdban az objektumtpusok hasonlan hasznlhatk, mint a VB tbbi adattpusa. Az objektumok
rtkad utastsa a Set (nem opcionlis) kulcsszval kezddik (szemben az eddig hasznlt rtkads Let
kulcsszavval, ami elhagyhat volt).
Az objektumok rtkad utastsnak (egyszerstett) szintaktikja:
Set objectvar = objectexpression

Az rtket kap objektumvltoznak (objectvar) ugyanolyan tpusnak kell lennie, mint az


objektumkifejezs (objectexpression) eredmnyeknt elll objektumnak.

61

Az albbi plda a WorksheetFunction objektum hasznlata mellett az objektumok rtkadst is


bemutatja.
Pl.
'Munkalapfggvny hasznlata cellatartomnyra
Sub MunkalapFgv1()
Dim r As Range, min As Variant
Set r = Application.Worksheets("Munka1").Range("A1:C5")
min = Application.WorkSheetFunction.Min(r)
MsgBox min
End Sub
'Munkalapfggvny hasznlata vltozkra
Sub MunkalapFgv2()
Dim a(1 To 10) As Integer, i As Integer
For i = 1 To 10: a(i) = i: Next
MsgBox WorkSheetFunction.Sum(a)
'55
End Sub

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.2. Egyb VBA lehetsgek


Ebben a fejezetben olyan tmkkal foglalkozunk, amelyek taln nem alapvet fontossgak az Excel
programozst illeten, de elg hasznosak ahhoz, hogy ha rviden is, de rintsk ket.

4.2.1. Makrk rgztse


Az Excel kpes arra, hogy a felhasznl ltal elvgzett tevkenysgeket rgztse, azaz forrskd szinten
megadja azokat a VBA utastsokat, amelyekkel az elvgzett tevkenysgek vgrehajthatk. A Makr
rgztse funkci az Excel menszalagjn a Fejleszt eszkzk lap Kd csoportjban tallhat (ott, ahol a
Visual Basic Editor program ikonja is szerepel, lsd 4.1. bra).

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).

4.2. bra. A rgztend makr adatainak megadsra szolgl prbeszdablak


A rgztett makrk egy j modulba kerlnek, a forrskdok tetszlegesen felhasznlhatk (szerkeszthetk,
futtathatk, stb.). Az albbi plda egy olyan rgztett makr forrskdjt tartalmazza, amelyben egy cella
tartalmt trltk.
Pl.
Sub Makr1()
'
' Makr1 Makr
'
'
'
Range("B4").Select
Selection.ClearContents
End Sub

63

4.2.2. Diagramok kezelse


Az Excel-ben knnyen kszthetnk adatainkbl szemlletes diagramokat. A diagramok kezelse
(ltrehozs, mdosts, trls, stb.) VBA utastsokkal is elvgezhet.
A diagramkszts tipikus lpseit egy plda segtsgvel szemlltetjk. A diagramot az els munkalap A1es celljt tartalmaz sszefgg blokk adataibl ksztjk, s az els munkalapon helyezzk el. Elszr a
Charts gyjtemny Add metdusval ltrehozunk egy j (mg res) diagramot, majd megadjuk a diagram
legfontosabb adatait (tpus, forrsadatok, clhely), vgezetl pedig (hogy ne a diagram legyen az aktulisan
kijellt objektum), az els munkalap A1-es celljt aktivizljuk.
Pl.
'Diagramkszts
Sub Diagram()
Dim r As Range
'Az A1-es cellt tartalmaz sszefgg blokk adataibl...
Set r = Worksheets(1).Range("A1").CurrentRegion
'Egy j, res diagram ltrehozsa
Charts.Add
'A diagram testreszabsa
With ActiveChart
'A diagram tpusa
.ChartType = xlColumnClustered
'A diagram forrsadatai s az adatsorozatok kpzse (sorokbl)
.SetSourceData Source:=r, PlotBy:=xlRows
'A diagram elhelyezse: objektumknt az els munkalapra
.Location Where:=xlLocationAsObject, Name:=Worksheets(1).Name
End With
Worksheets(1).Activate
'Az els munkalap aktivizlsa
Range("A1").Select
'Az A1-es cella kijellse
End Sub

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)).

4.2.3. A beptett prbeszdablakok hasznlata


Az Excel sokfle prbeszdablakot hasznl, amelyek a VBA krnyezetbl is elrhetk. Az Application
objektum Dialogs gyjtemnye ezeket a prbeszdablakokat (Dialog objektumokat) foglalja egy logikai
egysgbe.
A forrskdbl hasznlni kvnt prbeszdablak a Dialogs gyjtemny egy elemnek a kivlasztsval
hivatkozhat. A kivlaszts egy XlBuiltInDialog felsorolt tpus egy elemnek a megadsval trtnhet (a
pldban a fjlmegnyit prbeszdablakot hivatkozzuk az xlDialogOpen elemmel).
A prbeszdablakok Show metdusa megjelenti a prbeszdablakot, ahol a felhasznl megadhatja a
megfelel adatokat. A metdus eredmnyl egy logikai rtket ad attl fggen, hogy a felhasznl melyik
nyomgombbal zrta be az ablakot. Az OK gomb esetn True az eredmny, a Mgse (Cancel) gomb
(illetve az ablak bezrsa) esetn False.
Az albbi plda a fjlmegnyit prbeszdablak segtsgvel megadott (Excel-ben megnyithat tpus) fjl
teljes elrsi tjt rja ki a kpernyre. Az OK gomb vlasztsa esetn a Show metdus meg is nyitja a
kivlasztott fjlt, gy ez lesz az aktulis munkafzet. A nyitott munkafzetek (gy az aktulis munkafzet)
teljes elrsi tja a FullName tulajdonsggal rhet el. Ennek megjegyzse utn bezrjuk a megnyitott fjlt,
gy jra a makrkat tartalmaz munkafzet lesz az aktulis (aktv) munkafzet.
Pl.
'Fjlvlaszts prbeszdablakkal
Sub FajlValasztas()
Dim s As String
s = ""
If Application.Dialogs(xlDialogOpen).Show Then
'A Megnyits gombot nyomtk meg, megjegyezzk a fjl specifikcijt
s = ActiveWorkbook.FullName
'Lezrjuk a megnyitott munkafzetet
ActiveWorkbook.Close
End If
If s = "" Then
MsgBox "Nem vlasztottak fjlt!"
Else
MsgBox "A kivlasztott fjl:" + vbCrLf + s
End If
End Sub

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

4.2.4. Sajt men ksztse


Ha az Excel funkciit sajt fejleszts makrkkal bvtjk, akkor a makrink elrhetsgt, futtathatsgt
egyszer, a felhasznlk ltal knnyen kezelhet mdon kell biztostanunk. Eddig csak olyan futtatsi
lehetsgekrl volt sz, amelyhez a Visual Basic Editor-t is hasznlni kellett. Ezt azonban egy tlagos
Excel felhasznltl nem vrhatjuk el.
Szerencsre megvannak azok az eszkzk, amellyel ez a problma megoldhat. Egyfell az Excel menje
VBA eszkzkkel kezelhet, gy pl. forrskdbl bvteni tudjuk az Excel menjt a makrink futtatst
vgz funkcikkal. Msfell a munkafzetekhez is tartoznak esemnykezelk, amelyek automatikusan
lefutnak a munkafzethez kapcsold esemnyek (pl. megnyits, ments, bezrs) bekvetkezsekor.
A makrinkat tartalmaz munkafzet megnyitsakor automatikusan (kln indts nlkl) lefuttathatjuk az
Excel menjt bvt makrnkat, gy a tbbi makr (az ltalunk ksztett funkcik) mr az Excel
menjbl indthat. A makrinkat tartalmaz dokumentum bezrsakor pedig visszallthatjuk a men
eredeti llapott.
Az albbi plda ezt szemllteti. A MenuKirak szubrutin bvti az Excel menjt egy j (Men felirat)
menponttal. Ez a menpont az Excel menszalagjn a Bvtmnyek lapon fog megjelenni (lsd 4.3.
bra). A menn bell egyetlen almenpontot definilunk (Form megjelents felirattal), ami egy formot
(UserForm1) jelent meg. A MenuLevesz szubrutin trli a MenuKirak ltal (akr tbb pldnyban)
ltrehozott Men felirat menpontot.

4.3. bra. A sajt men megjelense a menszalag Bvtmnyek lapjn


Pl.
'Sajt men ltrehozs
Sub MenuKirak()
Dim fomenu As CommandBar
Dim fomenupont As CommandBarControl, almenupont As CommandBarControl
Set fomenu = Application.CommandBars.ActiveMenuBar
'Egy j (felbukkan) menpont ltrehozsa
Set fomenupont = fomenu.Controls.Add(Type:=msoControlPopup)
fomenupont.Caption = "Men"
'Az j fmenponthoz egy j almenpontot
Set almenupont = fomenupont.CommandBar.Controls.Add(Type:=msoControlButton)
almenupont.Caption = "Form megjelents"
'A menpont aktivizlsakor lefut szubrutin
almenupont.OnAction = "FormKirak"
End Sub
Sub FormKirak()
UserForm1.Show
End Sub

66

'Sajt men levtele


Sub MenuLevesz()
Dim menupont As CommandBarControl
For Each menupont In Application.CommandBars.ActiveMenuBar.Controls
If menupont.Caption = "Men" Then
menupont.Delete
End If
Next
End Sub
'Az eredeti rendszermen visszalltsa (ha elrontannk a ment)
Sub MenuAlaphelyzet()
Application.CommandBars("Worksheet Menu Bar").Reset
End Sub

A fenti szubrutinokat (menkezels, a menpontok aktivizlsakor vgrehajtand szubrutinok) egy


modulban helyezendk el (gy elrhetk, futtathatk lesznek), mg az albbi esemnykezel szubrutinokat
a ThisWorkbook objektum moduljban kell elhelyezni.
Pl.
'A munkafzet megnyitsakor aktivizldik
Private Sub Workbook_Open()
'A sajt men kiraksa
Call MenuKirak
End Sub
'A munkafzet lezrsakor aktivizldik
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'A sajt men levtele
Call MenuLevesz
End Sub

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

Megolds: A feladat megoldst az egyes rszfeladatokhoz illeszkeden, tbb lpsben vgezzk.


1. lps: A jtk prbeszdablaknak (formjnak) elksztse.
A form ltrehozsa utn elhelyezzk a megfelel vezrlket a formon: egy legrdl listt (ComboBox),
egy beviteli mezt (TextBox), kt cmkt (Label), s ngy darab nyomgombot (CommandButton). A kt
cmkevezrl a legrdl lista s a beviteli mez feladatrl tjkoztat, ezrt feliratukat (Caption)
Plyamret, illetve Lvs helye rtkekre lltjuk.
A forrskd knnyebb olvashatsga rdekben a vezrlknek j nevet (Name) adunk. A legrdl lista
nevt cbPalya, a beviteli mez nevt tbLoves, a ngy nyomgomb nevt pedig btnElrejt, btnLoves, btnSugo,
btnJatek rtkekre lltjuk. A nyomgombok feliratait is megadjuk: Elrejt, Lvs, Sg, Jtk indt.
Ellenrizzk a vezrlk (Tab Order) sorrendjt, s ha nem megfelel, belltjuk az elrendezshez
igazodan.

4.4. bra. A jtk formja tervezskor


Megjegyzs
A vezrlk neveit a tpusukra utal rvidtsbl s a funkcijukra utal nvbl lltottuk ssze
(ami egyfajta programozsi konvenci).
A kt cmkevezrlnek s magnak a formnak nem adtunk kln nevet, mert nem hivatkozunk
ezekre a forrskdbl. Ha egy tbb formos alkalmazst ksztnk, akkor a formnak is clszer
beszdesebb nevet adni.
A plyamret legrdl lista tartalmt (2-tl 6-ig, egsz szmok) tervezskor nem tudjuk belltani,
ezrt a lista feltltst futskor (a kezdtevkenysgek kztt) kell majd elvgeznnk.
A legrdl lista egy tulajdonsga (Style) azt szablyozza, hogy meg lehet-e adni j adatot
(fmStyleDropDownCombo), vagy csak a legrdl listban szerepl elemekbl lehet vlasztani
(fmStyleDropDownList). A feladathoz az utbbi illeszkedik, ezrt ezt fogjuk hasznlni (amit
szintn futsi idben lltunk majd be).
A prbeszdablakokban (a gyorsabb kezels rdekben) gyakran hasznlunk az Enter, illetve az
Esc billenty letsre aktivizld nyomgombokat. Ehhez a megfelel nyomgombok Default,
illetve Cancel tulajdonsgt kell igazra (True) lltani. A pldnkban a Lvs felirat gomb
Default tulajdonsgt lltottuk igazra, gy a lvs clcelljnak megadsa utn elegend letnnk
az Enter billentyt a lvs vgrehajtshoz (amit a Lvs felirat nyomgomb vgez). A Default
nyomgomb szlesebb kerettel emeldik ki mind tervezskor (lsd 4.4. bra), mind futskor (lsd
4.5. bra).

69

2. lps: Modulszint utastsok megadsa.


Az albbi modulszint utastsok a form moduljnak elejn helyezendk el. Hasznljuk a vltozk
ktelez deklarlst kiknyszert (Option Explicit) utastst, majd a feladathoz illeszked
konstansokat deklarljuk (pl. a plyamret hatrait), illetve azokat a modulszint vltozkat, amelyeket
tbb szubrutinbl is hivatkozni szeretnnk (pl. az aktulis plyamret).
'A vltozk ktelez deklarlshoz
Option Explicit
'A plyamret hatrai
Const Tol = 2
Const Ig = 6
'A lvsek jelzsre
Const Talalt = "X"
Const Melle = "*"
Const Alakzat = "O"
'A form fejlchez
Const Fejlec = "Torped"
'Az aktulis plyamret
Dim n As Integer
'A kiltt alakzatok szma
Dim Kilott As Integer

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

4.5. bra. A jtk formja kezdetben, s a plyamret vlaszts


Megjegyzs
A legrdl listk (s a listk (ListBox)) elemei sztring tpusak. Az AddItem metdust most
egsz szmokkal hvjuk meg, ezrt egy implicit tpuskonverzi trtnik (a szm sztringg alakul),
s ezutn kerl az j elem a legrdl lista elemei kz. Az j elemek alaprtelmezetten a lista
vgre kerlnek (ahogy most is), de az AddItem meghvhat adott helyre trtn beszrsra is.
A plya trlst elvgz segdszubrutint (Torles) is meghvjuk (amelynek kifejtse a 4. lpsnl
tallhat).
A Randomize utasts a vletlenszm-genertor inicializlst vgzi el. Ekkor a vletlen szmok
ellltsra hasznlt Rnd fggvny (lsd 5. lps) futsonknt eltr vletlen szmokat fog
ellltani.
4. lps: A plyamret vltozsa, a jtktr trlse, a kiltt alakzatok szmnak megjelentse.
Ebben a lpsben a plyamret megvltozst lekezel esemnykezel, s kt segdszubrutin kapott
helyet. A plyamret megvltozsakor (cbPalya_Change) az aktulis mretet megjegyezzk (az n
vltozban), a Torles szubrutin a maximlis terlet plyt trli (hiszen nagyobb plya utn egy kisebb
plyn jtszva, ha csak az aktulis mret plyt trlnnk, akkor esetleg ott maradna egy-egy zavar
karakter az elz jtkbl), a harmadik pedig a form fejlct (Caption) aktualizlja.
'A legrdl lista rtknek megvltozsakor fut le
Private Sub cbPalya_Change()
n = cbPalya.Value
End Sub
'A jtktr (plya, httr) trlse az aktulis munkalapon
Sub Torles()
Range(Cells(1, 1), Cells(Ig, Ig)).Clear
End Sub
'A kiltt alakzatok szmt a form fejlcben jelentjk meg
Sub FejlecKirak()
Caption = Fejlec + " (kilve:" & Kilott & "db)"
End Sub

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

5. lps: Alakzatok elrejtse.


Az alakzatok elrejtsnl n db alakzatot kell elhelyezni egy n n-es tblzatban gy, hogy nem tesznk
ugyanarra a helyre tbb alakzatot. Az elrejtett alakzatokat a msodik munkalapra kell elhelyezni, ezrt
elszr aktivizljuk a msodik munkalapot. Ezutn trljk az esetleg kint lv, korbban elrejtett
alakzatokat (Torles). A kls ciklus (For) biztostja az n db alakzat elrejtst, a bels ciklus (Do) pedig
azt, hogy egy vletlenszer, mg res cellba (IsEmpty) kerljn az ppen elrejtend alakzat. Vgezetl az
els munkalapot aktivizljuk, s vlaszthatv tesszk a jtk indtsra szolgl nyomgombot.
'Alakzatok (n db) vletlenszer elrejtse
Private Sub btnElrejt_Click()
Dim i As Integer, s As Integer, o As Integer
Worksheets(2).Activate
Call Torles
For i = 1 To n
Do
s = Int(Rnd * n) + 1
o = Int(Rnd * n) + 1
Loop Until IsEmpty(Cells(s, o))
Cells(s, o).Value = Alakzat
Next
Worksheets(1).Activate
'A jtkot elkezdhessk
btnJatek.Enabled = True
End Sub

4.6. bra. Elrejts utn mr indthat a jtk

72

6. lps: Jtk indtsa, lelltsa.


Itt lnyegben csak a megfelel vezrlk vlaszthatsgt lltjuk be attl fggen, hogy a jtkot ppen
indtjuk vagy lelltjuk. Azt, hogy ppen mit kell tenni, azt a nyomgomb aktulis feliratbl derthetjk ki.
A jtk lelltsakor az elrejtsre szolgl nyomgombot (btnElrejt) hozzuk fkuszba.
'Jtk indtsa, lelltsa
Private Sub btnJatek_Click()
If btnJatek.Caption = "Jtk indt" Then
'A plya trlse
Call Torles
btnJatek.Caption = "Jtk lellt"
btnLoves.Enabled = True: tbLoves.Enabled = True
btnSugo.Enabled = True
cbPalya.Enabled = False: btnElrejt.Enabled = False
Kilott = 0
Call FejlecKirak
Else
btnJatek.Caption = "Jtk indt"
btnJatek.Enabled = False: btnLoves.Enabled = False
tbLoves.Enabled = False: btnSugo.Enabled = False
cbPalya.Enabled = True: btnElrejt.Enabled = True
'Az Elrejt gomb legyen kivlasztva
btnElrejt.SetFocus
Caption = Fejlec
End If
End Sub

4.7. bra. Egy mr elindtott jtk

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

4.8. bra. A jtk sgja

74

8. lps: A lvs clcelljnak ellenrzse.


A fggvny a paramterben megadott clcella cmnek helyessgt ellenrzi. Az adatot nagybetsre alaktja
(UCase) (gy kis- s nagybetvel is megadhat a clcella oszlopnak betjele), majd ellenrzi a hosszt, az
els, illetve a msodik karaktert (ahol is az aktulis plyamrettel (n) dolgozunk). Hiba esetn a megfelel
zenettel tjkoztatunk. A fggvny eredmnye a kapott clhely (st) helyessge (mint logikai rtk).
'A clcella helyessgnek ellenrzse
Function Ellenoriz(st As String) As Boolean
Dim kar As String, ok As Boolean
ok = False
st = UCase(st)
'Nagybetsre alakts
If Len(st) <> 2 Then
MsgBox ("Nem megfelel hossz!")
Else
kar = Chr(Asc("A") + n - 1)
If Left(st, 1) < "A" Or Left(st, 1) > kar Then
MsgBox ("Nem megfelel oszlop!")
Else
kar = Chr(Asc("1") + n - 1)
If Right(st, 1) < "1" Or Right(st, 1) > kar Then
MsgBox ("Nem megfelel sor!")
Else
ok = True
End If
End If
End If
Ellenoriz = ok
End Function

9. lps: A lvs vgrehajtsa.


A lvs vgrehajtst a beviteli mezben megadott clhely helyessgnek vizsglatval kezdjk. Ha
formailag rossz a clhely, akkor az ellenrz fggvny (Ellenoriz) a hibrl is tjkoztat. Ha a clhely
formailag helyes (azaz a plyra esik), akkor megvizsgljuk, hogy ide lttnk-e mr korbban. Ha igen,
akkor errl tjkoztatunk, egybknt meg kirtkeljk a lvst. Ha eltalltunk egy alakzatot (a msodik
munkalapon elrejtett alakzatok kzl), akkor adminisztrljuk a tallatot, frisstjk a fejlcet (ahol a kiltt
alakzatok szma megjelenik), s ha vge a jtknak (ha mr kilttk az sszes alakzatot), akkor errl
tjkoztatunk, s j jtkot kezdnk. A tallatot a Talalt, a mell lvst a Melle adattal (lsd 2. lps)
jelezzk a clcellban.
'A lvs vgrehajtsa
Private Sub btnLoves_Click()
Dim st As String
st = tbLoves.Text
If Ellenoriz(st) Then
'J a clcella cme
If Not IsEmpty(Worksheets(1).Range(st)) Then
MsgBox ("Ide mr ltt!")
Else
'Kirtkels
If Worksheets(2).Range(st) = Alakzat Then
Range(st) = Talalt
Kilott = Kilott + 1

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

4.9. bra. A jtk kzben a plyt ltjuk


Vgezetl nhny tlet (feladat) a jtk tovbbfejlesztsi lehetsgeit illeten:
A jtktr (plya, httr) kiemelse (pl. sznekkel, keretezssel), ngyzetrcsos megjelents.
rtkels bevezetse (pl. szmoljuk az sszes lvs darabszmt, s a jtk vgn a tallt/sszes
lvs arnyban minstjk a jtkos teljestmnyt).
Sg kezelse (pl. a sgt csak korltozott szmban engedjk megnzni, akkor is csak korltozott
ideig (lsd Timer fggvny)).
Hangjelzsek (lsd Beep utasts, Speech objektum, pl. Application.Speech.Speak "Great").
sszetett, tbb cellbl ll alakzatok kezelse (elrejts vltozsa, alakzat elsllyedse).
Gp elleni jtk (pl. a gp is l az ltalunk elrejtett alakzatokra).

76

5. IRODALOMJEGYZK
[1]
[2]
[3]
[4]

Kovalcsik Gza: Az Excel programozsa. Computerbooks, Budapest, 2005.


Kuzmina Jekatyerina, Tams Pter, Tth Bertalan: Programozzunk Visual Basic rendszerben!
Computerbooks, Budapest, 2006.
Pusztai Pl: Algoritmusok s adatstruktrk, UNIVERSITAS-GYR Nonprofit Kft., 2008.
Cormen T. H., Leiserson C. E., Rivest R. L., Stein C.: j algoritmusok. Scolar kiad, 2003.

77

Vous aimerez peut-être aussi