Az Excel Makro-programozása
Változók Változók deklarációja (csak Option Explicit esetén) {Dim|Public|Private|Protected|Static} vá1tozó1 <adattípus>, változó2 As <adattípus> A VBA-ban kétféle érvényességi (láthatósági) kört különböztethetünk meg: eljárásszintű modulszintű Eljárásszintű láthatóság esetében a változót kívülről nem érhetjük el, annak a metódusnak a sajátja, amelyben deklarálva van. A deklarációs kulcsszó a Dim vagy Static. A két deklaráció között a különbség a memóriahasználatnál van, míg Static kúlcsszóval deklarált változó az alprogram lefutása után a változó értéke a memóriában marad, míg a Dim kulcsszóval deklarált változó értéke megszűnik. Modulszintű érvényességi kör esetében private és protected és public érvényességi szintű változókat deklarálhatunk. Private esetben a változó csak az őt tartalmazó modulból érhető el, public esetben pedig bárhonnan. A Protected-nek csak öröklődés esetén van szerepe. Fontos megjegyezni, hogy a típusok deklarálása sem eljárások sem függvények esetében nem kötelező, az első értékadás határozza meg a változók típusát.
Változó típusok Integer egész szám Single lebegőpontos szám Double duplapontosságú lebegőpontos szám String karaktersorozat Boolean logikai (true, false) Date dátum Variant szöveg, szám vagy dátum (automatikus típus) Object objektum
Vezérlési szerkezetek a programokban Szekvencia – egymás utáni lépések végrehajtása Szelekció – elágazás (egyágú, kétágú, háromágú többágú) Iteráció – ciklus (előírt lépésszámú, feltételes elöl vagy hátultesztelő)
Egy – két és háromágú elágazás If 1. feltétel Then 1. utasítások (ha a 1. feltétel igaz) [ElseIf 2. feltétel 2. utasítások] (amennyiben a 2. feltétel igaz) [Else 3. utasítások] (minden egyéb esetben) End If
Többágú elágazás – értéktől függő Select Case <kifejezés> [Case <1. kifejezés> <1. utasítások>] [Case <2. kifejezés> <2. utasítások>] … [Case Else <különben utasítások>] End Select
Feltételes operátorok Feltételek összeállításához használható operátorok: relációs operátorok: < ; > ; <= ; >= ; = ; <> logikai operátorok: And ; Or ; Not ; Xor
Előírt lépésszámú ciklus - For For ciklusváltozó =ettől To eddig [Step +/-lépésköz] [utasítások] Next [ciklusváltozó]
Előírt lépésszámú ciklus – For Each For Each valtozo In Collection [utasítások] Next valtozo
Feltételes ciklus - elöltesztelő Amennyiben nem tudjuk előre megmondani, hogy hányszor kell lefuttatnunk az utasítássorozatot, akkor a feltételes ciklusok valamelyikét kell használnunk. Egy feltételes ciklus lehet elöl- illetve hátultesztelő. Elöltesztelő ciklusnál a feltétel kiértékelése a ciklus elején a Do While kulcsszavak után történik. Elöltesztelő ciklus esetben a feltétel teljesülése esetén futnak le a ciklusmagban szereplő utasítások. Do While feltétel [utasítások] Loop
Feltételes ciklus - hátultesztelő Hátultesztelő ciklusnál a feltétel kiértékelése a ciklus végén a Loop Until kulcsszavak után történik. Mindaddig történik az ismétlés, amíg a feltétel hamis. A hátultesztelő ciklus esetében a ciklusmagban lévő utasítások legalább egyszer biztosan lefutnak. Do [utasítások] Loop Until feltétel
Üzenet ablakok A program futása során a felhasználóval történő kapcsolattartás legpraktikusabb módja az üzenőablakok használata. Adatbekérésre az InputBox függvényt, míg üzenetek, válaszok küldésére a MsgBox függvényt használhatjuk. Az InputBox szintaxisa: változó = InputBox("szöveg","címke") A MsgBox szintaxisa: MsgBox („üzenet”) vagy MsgBox „üzenet” változó = MsgBox ("üzenet", paneltípus) vbOKOnly - OK gomb; vbOKCancel - Ok és Mégse gombok; vbAbortRetryIgnore - Leállítás, Ismét és Kihagyás gombok; vbYesNoCancel - Igen, Nem és Mégse gombok; vbYesNo - Igen és Nem gombok
Eljárások Mivel a VBA egy objektumorientált nyelv, utasításainkat eljárásokba és függvényekbe szervezhetjük. Minden egyes eljárást a Sub utasítással kell kezdenünk, majd a makró nevét kell megadnunk és végül zárójelek között a futáshoz szükséges paraméterlistát. Az eljárásokat az End Sub utasítással zárjuk. Sub <eljárásnév>([paraméterlista]) [<deklarációk>] <utasítások> End Sub Eljárás hívása: [Call] <eljárásnév> ([aktuális paraméterlista])
Függvények Minden egyes függvényt a Function utasítással kell kezdenünk, majd a függvény nevét kell megadnunk végül zárójelek között a futáshoz szükséges paraméterlistát. A függvényeket az End Function utasítással zárjuk. Minden függvénynek kötelezően tartalmaznia kell legalább egy olyan értékadó utasítást, amelynek bal oldalán a függvény neve szerepel. Function <függvénynév>([paraméterlista]) [<deklarációk>] <utasítások> függvénynév = (legalább egy értékadó utasítás) End Function Függvény hívása: <függvénynév> ([aktuális paraméterlista])
Megjegyzések Megjegyzéseket a program kódjába a sor elején vagy akár sorban elhelyezett aposztróffal (’) tehetünk. A Visual Basic zöld színnel jelöli a megjegyzéseket. Célszerű minél több, és minél részletesebb megjegyzést elhelyezni a programkódban, hiszen ezzel egyrészt áttekinthetőbbé tehetjük, másrészt megkönnyíthetjük a kód későbbi esetleges újraértelmezését.
Makro rögzítése
Makro szerkesztő ablak Amennyiben a Szerkesztés gombra kattintunk a Visual Basic szerkesztőben megjelenik a makrónk VBA kódja. Váltás szerkesztőnézetbe (Visual Basic Editor-ba) az Alt + F11 billentyűkombinációval is történhet.
Visual Basic editor kezelőfelülete
Munkafüzetek kezelése Munkafüzet megnyitása: Workbooks.Open (file) Munkafüzet nevének megadása felhasználóbarát módszerrel: file = Application.GetOpenFilename() Üzenetablak kezelése: If file = "False" Then MsgBox ("Nem választott vagy adott meg fájlnevet!") /A szöveg zárójel nélkül is megadható Else End If
Munkafüzetek kezelése Munkafüzet bezárása: Workbooks(2).Close (a zárójelben a munkalap indexe, hányadik munkafüzet a megnyitottak közül) Aktív munkafüzet bezárása: ActiveWorkbook.Close
Munkalapok kezelése Munkalapok számának kiírása: MsgBox "A munkalapok száma=" & Worksheets.Count Új munkalap hozzáadása: ActiveWorkbook.Sheets.Add Before :=Worksheets(Worksheets.Count) – utolsó munkalap elé ActiveWorkbook.Sheets.Add After :=Worksheets(Worksheets.Count) – utolsó munkalap után ActiveWorkbook.Sheets.Add Count :=5 - öt új munkalapot szúr be Munkalap törlése: Worksheets(index).Delete Munkalap átnevezése: Activesheet.Name
Többágú elágazások kezelése Select Case valasz Case 1: ActiveWorkbook.Sheets.Add Before:=Worksheets(Worksheets.Count) Case 2: ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count) Case 3: darab = InputBox("Hány új munalapot adjak hozzá?", "Hozzáaad", "5") ActiveWorkbook.Sheets.Add Count:=Val(darab) Case Else: MsgBox "1-3 közötti számot adjon meg!" End Select
Munkafüzetben lévő munkalapok kiírása For Each munkafuzet In Workbooks szoveg = szoveg & "Munkafüzet: " & munkafuzet.Name & vbNewLine & "Munkalapok: " & vbNewLine For Each lap In munkafuzet.Worksheets szoveg = szoveg & lap.Name & vbNewLine Next lap Next munkafuzet MsgBox szoveg
Képernyő villogás ideiglenes kikapcsolása kiírás idejére Application.ScreenUpdating = False //Kiíráskor ne villogjon a képernyő Application.ScreenUpdating = True //Visszakapcsolás
Könyvtár- és fájlkezelés Könyvtár megadása: konyvtar = "C:\Users\varal\Documents\„ Fájl megadása: Fajlnev = Dir(konyvtar & "*.xl*") Munkafüzet megnyitása az adott könyvtárban: Workbooks.Open (konyvtar & Fajlnev) Ciklusban végigjárható a könyvtár és megkeresi az Excel fájlokat: For Each Munkalap In Workbooks(Fajlnev).Worksheets Cells(i, j).Value = Munkalap.Name j = j + 1 Next Munkalap
Tartomány és cellaműveletek For i = 1 To 25 Cells(i, 1).Value = i // az aktuális ciklusváltozó értékével tölti fel az 1.oszlopot Range("B1:B25").Value = i //25-tel tölti fel a végén a B oszlopot Range("C1:C25").Value = "=RandBetween(1, 25)” // véletlen számokkal tölti fel a C oszlopot Next i Range(Cells(1, 4), Cells(7, 4)).Value = "=RandBetween(10, 20)” // 10-20 közötti számokkal tölti fel a D oszlop első 7 sorát
Tartomány és cellaműveletek Range("Árak").Value = "=RandBetween(100, 250)" //Előtte E1:E10 tartományt elnevezni "Áraknak„ Set minta = Range("F1:H6") 'Tartomány deklaráció minta.Value = 14 minta.Select 'Tartomány kijelölése
Sor illetve oszlop kijelölés Set probasor = Range("A1:C25") probasor.Rows(Val(sor)).Select //Tartományon sor kijelölés, ha nincs ott a probasor, akkor az egész sort kijelöli! Set probaoszlop = Range("A1:C25") probaoszlop.Columns(Val(oszlop)).Select //Tartományon oszlop kijelölés, ha nincs ott a probaoszlop, akkor az egész sort kijelöli!
Tartomány másolása Range("A1:A2").Select Selection.Copy Range("G15").Select ActiveSheet.Paste Range("G17:G18").Value = Range("A1:A2").Value 'Ugyanez egy sorban
Kijelölt tartomány celláinak megszámlálása Set tartomany = Range("A1:C25") Range("A1:C25").Select MsgBox ("A tartomány celláinak száma=" & tartomany.Count) MsgBox ("Sorok száma a tartományban=" & tartomany.Rows.Count) //Sorok száma MsgBox ("Oszlopok száma a tartományban=" & tartomany.Columns.Count) //Oszlopok száma
Tartomány törlése valasz = MsgBox("Valóban törölni akasr minden elemet?", vbOKCancel + vbQuestion + vbDefaultButton2, "Kérdés") If valasz = vbOK Then Range("A1:C25").ClearContents
Számolás és cellába írás Range("D26").Value = "Összeg" Range("D27").Value = "Átlag" Range("D28").Value = "Darab" Range("D29").Value = "Minimum" Range("D30").Value = "Maximum" Range("A26").Value = "=SUM(A1:A25)" Range("A27").Value = "=AVERAGE(A1:A25)" Range("A28").Value = "=COUNT(A1:A25)" Range("A29").Value = "=MIN(A1:A25)" Range("A30").Value = "=MAX(A1:A25)"
Keretezés és színezés Range("F1:H6").Interior.Color = vbGreen Range("F1:H6").Borders.Weight = xlThick Range("F1:H6").Borders.LineStyle = xlSolid //xlDash vagy xlDot is lehet, ha nincs semmi, akkor xlNone
Színes betűs cellák összege osszeg = 0 For i = 1 To 12 If Cells(i, 15).Font.Color = vbRed Then osszeg = osszeg + Cells(i, 15).Value End If Next i MsgBox "Az O-oszlop piros számainak összege = " & osszeg
Üres cellák törlése nem folytonos oszlopból szamlalo = 0 For i = 1 To 24 If Cells(i, 16).Value <> "" Then Cells(szamlalo + 1, 17).Value = Cells(i, 16).Value szamlalo = szamlalo + 1 End If Next i
Tartomány sorbarendezése Set Rng = Range("S1").CurrentRegion For i = 1 To Rng.Count For j = i + 1 To Rng.Count If Rng.Cells(j) < Rng.Cells(i) Then temp = Rng.Cells(i) Rng.Cells(i) = Rng.Cells(j) Rng.Cells(j) = temp End If Next j Next i
Ismétlődések megkeresése oszlopban és eltávolításuk Cells(1, 22).Value = Cells(1, 21).Value egyediszam = 1 hozzaad = True For i = 2 To 10 For j = 1 To egyediszam If Cells(i, 21).Value = Cells(j, 22).Value Then hozzaad = False End If Next j If hozzaad = True Then Cells(egyediszam + 1, 22).Value = Cells(i, 21).Value egyediszam = egyediszam + 1 Next i
Lépésközök For ciklusban (STEP) For i = 1 To 16 Step 2 Cells(i, 25).Value = 100 Next i For j = 25 To 13 Step -2 Cells(20, j).Value = 50 Next j
Hibakezelés Set Rng = Selection For Each cell In Rng On Error Resume Next cell.Value = Sqr(cell.Value) Next cell
Adatok fájlba írása fajlnev = Application.DefaultFilePath & "\adatok.txt" Set tartomany = Selection Open fajlnev For Output As #1 For i = 1 To tartomany.Rows.Count For j = 1 To tartomany.Columns.Count cellaertek = tartomany.Cells(i, j).Value If j = tartomany.Columns.Count Then Write #1, cellaertek Else Write #1, cellaertek, End If Next j Next i Close #1
Adatok fájlból olvasása i = 35 fajlnev = Application.GetOpenFilename() Open fajlnev For Input As #1 Do While Not EOF(1) //Fájl vége jelig olvasunk, mert nem tudjuk hány adat van benne Line Input #1, sor pozicio = InStr(sor, ",") elso = Left(sor, pozicio - 1) //Vesszőt, mai az elválasztó megkeressük és annál elvágjuk az adatokat egymástól masodik = Right(sor, Len(sor) - pozicio) Cells(i, 1).Value = Val(elso) Cells(i, 2).Value = Val(masodik) i = i + 1 Loop Close #1