Excel makró - Alapfogalmak

Amikor a hatékonyság-növelés a cél, előbb-utóbb eljutunk arra a pontra, hogy a grafikus felület kínálta eszköztár már nem elegendő és "kódhoz kéne nyúlni". Ezen a ponton a legtöbben nehezen lendülnek át, mert bonyolultnak, nehéznek, olykor misztikusnak tűnik. Számomra is annak tűnt, de aztán, ahogy picit (majd egyre jobban) beleástam magam, rájöttem, hogy egyáltalán nem az. Valójában teljes mértékben logikus, hasonló ahhoz, amikor egy idegen nyelven próbálunk beszélni: megvan a sajátos logikája és szókészlete, de ha tudjuk, mit szeretnénk mondani, akkor össze lehet rakni a részeket egy érthető és működőképes egésszé.

Az Excel esetében a kódolás első lépése többnyire a makróírás. A jövőben szeretnék hasznos makrókat és elkészítésük menetét bemutatni, ezért a makrókkal kapcsolatos alap ismeretekről írok most egy összefoglalót, remélhetőleg közérthetően. A későbbiekben csak visszautalok majd erre a bejegyzésre, amelyet ha szükség lesz rá, időről-időre bővítek is egy-egy aprósággal. Csak a későbbi makrók megértéséhez szükséges legfontosabb információkat próbálom összeszedni, nem tankönyvet írok, így ha további részletek is érdekelnek, keress fel bátran a témába vágó weboldalakat, néhánynak a címét én is kigyűjtöm ennek a bejegyzésnek a végén.

MI A MAKRÓ?

A makró egy olyan Visual Basic nyelven írt kód(részlet), amely az Excel objektumaival (pl. munkalap, oszlop, kijelölt terület, cella, stb.) képes műveleteket végezni. A makrók használatának legfőbb célja, hogy növelje a hatékonyságot. Ezt többféle módon is képes támogatni, segítségével

  • gyakran használt utasítás-sorozatok eltárolhatók és később újra használhatók,
  • utasítás-sorozatok sokszor, más-más (de azonos típusú) objektumokat alapul véve hajthatók végre,
  • döntési logika építhető fel, amely a feltételrendszer vizsgálatát követően eltérő utasításokat hajthat végre.

MAKRÓSZERKESZTŐ MEGNYITÁSA

Az Excel több lehetőséget is nyújt a makrószerkesztő-felület elérésére. A legegyszerűbb ezek közül a Nézet szalag Makrók paneljén található Makrók ikonra kattintva.

Makrószerkesztő megnyitása

Meg kell adni a létrehozni kívánt makró nevét (ez később változtatható), majd a Létrehozás gombra kattintani. A szerkesztőfelület külön ablakban nyílik meg, amelynek Microsoft Visual Basic for Applications - [munkafüzet neve] a neve.

SUB ÉS FUNCTION

A makrók két fő típusra különíthetők: Sub és Function. A kettő között az a különbség, hogy csak végrehajtja-e a makróban leírt utasításokat és véget ér (Sub) vagy az utasítások végrehajtását követően visszaad egy értéket (Function), amit feltudunk használni a továbbiakban, akár egy másik makróban.

Sub típusú makróra példa: haladjon végig a táblázat sorain és ha az "A" oszlopban a megadott értékek közül valamelyik előfordul, törölje a teljes sort. Ebben az esetben nem várunk semmilyen értéket (pl. egy számot vagy szöveget) válaszul, csak azt szeretnénk, ha végrehajtaná az utasításokat és leálljon.

Function típusú makróra példa: a makró több paramétert kér a felhasználótól: szövegesen a síkidom típusát (pl. kör, négyzet, téglalap), számszerűen pedig a síkidom jellemző méreteit (oldalhossz(ak), sugár). A síkidom típusától függően kiszámolja a síkidom területét. Function esetében ezt a területet visszakérjük, ez lesz a visszatérési érték. Így miután a makró lefutott, ezt a visszatérési értéket felhasználhatjuk egy másik számításban, utasításban vagy hozzárendelhetjük egy változóhoz.

KOMMENT

Mint minden programkód esetében, a makróknál is van lehetőség arra, hogy bizonyos részeit speciális jelöléssel lássuk el, amelynek hatására a megjelölt részek nem kerülnek végrehajtásra futtatáskor. Kommentelésnek hívjuk a speciális karakterek elhelyezését és kommentnek vagy kikommentezett résznek nevezzük a jelekkel ellátott kódrészleteket.

Nagyon fontos, hogy a komment megléte vagy hiánya nem befolyásolja a makró működését!

Kommenteket sokféle okból használnak. Ideiglenesen kikommentezett sorok segíthetnek a kód futásában jelentkező hibák felderítésében. Hasonlóképpen segíthetnek abban, hogy hasonlónak tűnő megoldásokat ki tudjunk próbálni. Az ideiglenes kommentekről most nem írok részletesebben, ez kódírás közben úgyis kialakul mindenkinél és mindenki kicsit másként használja ezeket (ha használja egyáltalán).

Állandó jelleggel elhelyezett kommentek szerepe sokkal általánosabb, ha használják, többnyire ugyanazzal a céllal használja majdnem mindenki. A cél pedig az, hogy megjegyzésekkel lássuk el a kódot. Ezek a megjegyzések segítenek megérteni a kódot, ha később újra hozzá kell nyúlnia valakinek (akár nekünk, akár másnak).

Az Excel makrók esetében a Visual Basic programozási nyelv szintaktikáját kell követni, és eszerint a kommentezni kívánt sor elé egy aposztrófot kell tenni. (Lehet a végére is, de nem szükséges.)

Sub MakroAlapfogalmak

'Komment elhelyezéséhez aposztrófot kell tenni a kommentezni kívánt sor elejére.'
'(A sor végi aposztróf Excel makrók esetében elhagyható.)'
'A kommentek elhelyezésének legfőbb célja, hogy érthetőbbé tegye a kódot.'

'Változók definiálása'
Dim valtozo As String
Dim masikValtozo As Integer

End Sub

Személyenként változik, hogy ez a komment milyen hosszú, van aki egyáltalán nem ír, van aki csak egy-egy szót biggyeszt oda és van olyan is, aki szinte kisregényt ír. Én próbálok egy-egy mondatot elhelyezni minden fontos lépéshez, ami persze sok többletidő a makró írásakor. Önző módon nem azért csinálom, hogy más is tudja olvasni az általam írt kódot, hanem azért írok kommenteket, mert sokszor előfordul, hogy egy korábban írt kódot újra elő kell vennem, hogy egy az egyben vagy kicsit átírva újra használjam. Hatalmas a különbség aközött, ha írtam magamnak kommentet és aközött, ha nem. Komment híján sokkal tovább tart megértenem a saját kódomat, így a munkát is lassabban tudom elvégezni. A legfontosabb pedig mindebből: a kommentet leggyakrabban saját magadnak írod (vagy nem írod)!

A tanácsom: légy előrelátó, segítsd jövőbeli önmagad és írj kommenteket!

VÁLTOZÓK

A programozási nyelvek lehetőséget biztosítanak arra, hogy a kód szempontjából fontos értékeket eltároljuk, illetve ha a kód működése szükségessé teszi, akkor meg is változtassuk ezeket a tárolt értékeket. Ezen értékek változókban tárolhatók, amelyek rendelkeznek egy névvel és típussal. A névnek egyedinek kell lennie és ezzel lehet hivatkozni rá később a makró többi részében. A típus azt határozza meg, milyen értékek kerülhetnek a változóba. A makrók elején gyakran található egy olyan részlet, amely ezen változókat definiálja (deklarálja), megadva a nevüket és típusukat.

Sub MakroAlapfogalmak
'Ide a makró céljával és működésével kapcsolatos gondolatokat szoktam írni.'

'Változók definiálása'
'A változónak érdemes "beszédes" nevet adni, hogy tudjuk, mi a szerepe'
'a kód többi részében.'
Dim eletkor As Integer
Dim duplaEletkor As Integer

'A fenti változók típusa integer, ami azt jelenti, hogy (rövid) egész számokat'
'tartalmazhatnak.'

'Értéket adunk a változónak'
eletkor = 21

'Egy új értéket adunk a változónak, szimulálva egy év elteltét:'
eletkor = eletkor + 1

'A fenti esetben először az egyenlőségjel jobb oldala kerül végrehajtásra.'
'Az eletkor helyére behelyettesítjük a 21-et, hozzáadunk egyet, tehát az'
'eredmény 22. Ezt az értéket rendeljük aztán az eletkor változóhoz, aminek'
'értéke innentől 22 lesz.'

'A változók felhasználhatók másik változó értékenek meghatározásakor is.'
'Itt a duplaEletkor változónak az eletkor változó értékének kétszeresét'
'adjuk értékként, tehát ebben az esetben 22 * 2 = 44 lesz majd a duplaEletkor'
'értéke.'
duplaEletkor = eletkor * 2

End Sub

LOGIKAI ELÁGAZÁSOK

Gyakran szeretnénk, hogy a kódunknak többféle kimenete is lehessen. Azt pedig, hogy a többféle kimenetel közül melyik valósuljon meg, vizsgálatok, egészen pontosan logikai vizsgálatok döntsék el. A Visual Basic is lehetőséget biztosít döntési pontok megadására, melyek közül a leggyakrabban a "ha, akkor - egyébként" logikát alkalmazzuk. Ez nem csak két ágú lehet, tetszőleges további ("egyébként ha") ággal bővíthető a döntési fa.

Sub MakroAlapfogalmak
'Ide a makró céljával és működésével kapcsolatos gondolatokat szoktam írni.'

'Változók definiálása'
Dim eletkor As Integer
Dim korcsoport As String

'Az If-Else logikai elágazás elve'
If [első logikai vizsgálat] Then
 [ezt hajtja végre, ha az első logikai vizsgálat igaz]
ElseIf [második logikai vizsgálat] Then
 [ezt hajtja végre, ha az első logikai vizsgálat hamis, a második igaz]
Else
 [ezt hajtja végre, ha az összes logikai vizsgálat hamis]
 
'Példa egyszerű elágazásra'

eletkor = 17

If eletkor < 18 Then
 korcsoport = "fiatalkorú"
Else
 korcsoport = "felnőtt"
 
'A fenti egyszerű döntés az életkor alapján határozza meg a korcsoport'
'változó értékét. A példában az If-ág valósul meg, mivel az eletkor'
'változó értéke 18-nál kisebb, tehát az első logikai feltétel igaz.'

'Példa összetett elágazásra'

eletkor = 37

If eletkor < 18 Then
 korcsoport = "fiatalkorú"
ElseIf eletkor < 65 Then
 korcsoport = "aktív korú"
Else
 korcsoport = "idős korú"
 
'A fenti több ágú döntés két logikai vizsgálatot végez. Először megvizsgálja,'
'hogy az eletkor változó értéke kisebb-e 18-nál. A példánkban ez a vizsgálat'
'hamis, ezért nem hajtja végre az első ágon belüli kódrészletet, hanem tovább'
'lép a második ágra, ahol végrehajtja a második logikai vizsgálatot. Ez már'
'igaz lesz, azért végrehajtja az ágon belüli kódrészletet és a korcsoport'
'változónak az "aktív korú" szöveget adja értékül.'
 
End Sub

A logikai vizsgálatok kombinálhatók is az Or és az And kulcsszavakkal. Előbbi esetében ha a két feltételből legalább az egyik igaz, akkor a teljes logikai vizsgálat igaz lesz. Utóbbi esetben csak akkor lesz igaz a logikai vizsgálat, ha mindkét feltétel igaznak bizonyul. Fontos még az is, hogy az If ("ha") és ElseIf ("egyébként ha") ágak logikai vizsgálata lehet egymástól teljesen eltérő is!

Sub MakroAlapfogalmak
'Ide a makró céljával és működésével kapcsolatos gondolatokat szoktam írni.'

'Változók definiálása'
Dim keszpenz As Long
Dim bankszamla As Long
Dim adossag As Long
Dim folyoKiadas As Long
Dim penzugyiHelyzet As String

'Példa a logikai vizsgálatok kombinálására'

keszpenz = 550
bankszamla = 25000

If keszpenz < 1000 And bankszamla < 5000 Then
 penzugyiHelyzet = "leégtél"
Else
 penzugyiHelyzet = "minden rendben"
 
'A fenti példában csak akkor kapja a penzugyiHelyzet változó a "leégtél"'
'értéket, ha a keszpenz változó értéke kisebb 1000-nél ÉS a bankszamla'
'változó értéke kisebb mint 5000. A példánkban ez nem teljesül, így az'
'Else-ág valósul meg.'

'Példa az eltérő logikai vizsgálatokra'

bankszamla = 10000
keszpenz = 7000
folyoKiadas = 25000
adossag = 250000

If adossag > 0 Then
 penzugyiHelyzet = "el vagy adósodva"
ElseIf keszpenz + bankszamla < folyoKiadas Then
 penzugyiHelyzet = "baj lesz a hó végén"
Else
 penzugyiHelyzet = "minden rendben"

'A fenti példában először az adossag változó értékét vizsgáljuk meg.'
'Ha ez pozitív szám, a penzugyiHelyzet változó értéke "el vagy adósodva"'
'lesz. (A példánkban ez valósul meg.) A második logikai vizsgálat nem is'
'foglalkozik az adossag változóval, hanem a másik hármat hasonlítja össze.'
 
End Sub

CIKLUSOK

A makróktól leggyakrabban az automatizmust, ugyanazon műveletek ismétlését várjuk. Az ismétlődést ciklusok segítségével lehet elérni, amelynek két leggyakoribb megközelítése: előre meghatározott számú ismétlést szeretnénk (for ciklus) vagy minden ismétlés esetén megvizsgálunk egy feltételt, s a ciklust addig folytatjuk, amíg az igaznak bizonyul (while ciklus).

Sub MakroAlapfogalmak
'Ide a makró céljával és működésével kapcsolatos gondolatokat szoktam írni.'

'Változók definiálása'
Dim i As Integer
Dim szam As Integer

'Példa for ciklusra'

szam = 0

'A ciklusszámlálója 1-től indul és egészen addig újra és újra végrehajtja'
'a ciklusmagot, míg a számláló értéke 1000 nem lesz.'
For i = 1 To 1000
 'Ez maga a ciklusmag. Bármilyen kódrészlet kerülhet ide, akár egy másik'
 'ciklus is. Ezt fogja újra és újra végrehajtani a ciklus.
 'Ebben az esetben a szam valtozo értékét növeli minden esetben 1-el.
 szam = szam + 1
'Ez az utasítás szükséges ahhoz, hogy a ciklusszámlálója továbblépjen'
'a következő értékre.'
Next i

'Példa while ciklusra'

szam = 0

'A ciklus eleje, ahol elvégezzük a logikai vizsgálatot. A ciklus egészen addig'
'végrehajtja a ciklusmagot amíg a szam valtozó értéke 100-nál kisebb (vagyis'
'a logikai feltétel igaz).'
While szam < 100
 'A ciklusmag, amit a ciklus ismétel. Jelen esetben a szam változó értékét'
 'növeli 1-el.'
 szam = szam + 1
'A ciklusmag végét jelző kulcsszó.'
Wend

End Sub

A ciklusokkal kapcsolatban az egyik legnagyobb veszély az ún. végtelen ciklusok kialakulása. Ez azt jelenti, hogy a ciklus soha nem érhet véget, a ciklusmagot újra és újra végrehajtaná a végtelenségig. Ez eleinte véletlenül szokott kialakulni, amikor (többnyire figyelmetlenségből) olyan feltételt adunk egy while ciklusnak, amely sosem lehet hamis. Ilyenkor a futtató környezet általában érzékeli ezt és hibát jelezve leáll a kódunk. A végtelen ciklus jelensége hasznos, lehet szándékosan is használni, de erről majd később. Egyelőre javaslom, hogy kerüljük a végtelen ciklusok kialakítását, ezért mindig alaposan gondoljuk végig, hogy a ciklus milyen feltételekkel képes véget érni.

SZÖVEG JELÖLÉSE

A legtöbb programozási nyelvben kell valamilyen speciális jelölést használni, amely megmutatja, hol kezdődik a szöveg és hol végződik. Általában aposztróf vagy idézőjel ez a speciális jelölés. A Visual Basic és így az Excel makrók esetében a szöveg jelölésére az idézőjel szolgál. (Jelölés nélkül a karaktersorozat változónévre vagy kulcsszóra utal. Aposztróffal ellátott karaktersorozat pedig kommentet jelent.)

Sub MakroAlapfogalmak
'Ide a makró céljával és működésével kapcsolatos gondolatokat szoktam írni.'

'Változók definiálása'
Dim txt As String

txt = "Idézőjelek közé tett karaktersorozatot szövegnek érzékel a Visual Basic"

'Az aposztróf a Visual Basic esetében nem használható szöveg jelölésére, mert'
'az a kommentek jelölésére szolgál.'

Aposztróf és idézőjel nélküli szöveget változó névként vagy kulcsszóként próbálja
majd értelmezni, ezért ez a három sor hibát okoz majd a kód futtatása során.
(Mivel ezek a szavak se nem változók, se nem kulcsszavak.)

End Sub

LINKEK

Címkék: ,
© 2017 AdatTérKép