Előadó: Édes Péter http://epeter.hu Az Excel programozása Előadó: Édes Péter http://epeter.hu
Visual Basic Visual Basic - VB Visual Basic for Applications - VBA önálló Windows alkalmazások készítése eseményvezérelt programkód Visual Basic for Applications - VBA a VB bizonyos részeit tartalmazza a programot valamely Office alkalmazás futtatja - makró
Objektummodell Objektum (object) Objektumgyűjtemény (collection) Az Excel alkotóelemei az objektumok (pl. munkafüzet, munkalap, stb.) Objektumgyűjtemény (collection) A több példányban előforduló, azonos típusú objektumok gyűjteményt alkotnak. Tulajdonság (properties) az objektum viselkedésmódját, megjelenési formáját (szín, méret, stb.) határozzák meg Metódus (method) az objektumok műveleteinek összefoglaló neve (pl. Add, Open, Close, PrintOut, stb.)
Workbooks gyűjtemény wokbooks.Add ?workbooks.Count workbooks.Close Alt+F11 (VBE), Nézet (View) - Próbaablak (Immediate) wokbooks.Add új munkafüzet hozzáadása ?workbooks.Count munkafüzetek számának kiírása workbooks.Close összes munkafüzet bezárása workbooks(„Munkafüzet1”).Close Munkafüzet1 bezárása
Worksheets gyűjtemény Worksheets.Add új munkalap beszúrása ?Worksheets(1).Name kiírja az aktív munkafüzet első munkalapjának nevét Worksheets(1).Name=„Első” az aktív munkafüzet első munkalapjának nevét „Első”-re változtatja Worksheets(„Első”).Move after:=worksheets(3) az „Első” nevű munkalapot átmozgatja a 3. után
Tartományok és cellák Cells(3,2).Select Cells(3,2)=25% kiválasztja a B3-as cellát Cells(3,2)=25% a B3 cellába beírja a 25%-ot Range(„B2:C10”).Select kijelöli a B2:C10 tartományt Range(„B2:C10”)=„Excel” a B2:C10 tartomány minden cellájába beírja az Excel szöveget ?Range(„B5”) megjeleníti a B5 cella tartalmát
Makró létrehozása rögzítéssel
1. feladat– Makró rögzítése Hozzunk létre egy makrót, amely az aktív cellába elhelyezi a mai dátumot, Arial, 20p magas, kék színű betűkkel! A makró a Ctlr+M billentyűkombinációval is legyen elindítható!
Adattípusok Adattípus Adat Jel Boolean Igaz-Hamis Integer Egész szám (2bájt) % Long Hosszú egész (4bájt) & Single Tizedestört (4bájt) ! Double Tizedestört (8bájt) # Currency Pénznem @ Date Dátum Object Objektum String Szöveg $ Array Tömb
Változó definiálása Dim Változó As String Dim V1, V2, V3 As Integer Nem kötelező, de ajánlott. A Modul első sorába beírt Option Explicit sorral kötelezővé tehetjük. Dim Változó As String Dim V1, V2, V3 As Integer Dim Név As String* 15 Dim Lap As Worksheet Felhasználói típus Type Adataim Név As String Életkor As Integer End Type … Dim Dolgozó As Adataim
Változók hatóköre Public (régebben Global) Dim Static Modulszintű, a modul tetején kell definiálni. Dim Modulszintű, vagy eljárásszintű. Static Csak eljáráson belül definiálható.
Műveletek Aritmetikai Logikai Relációs Szöveg + - * / ^ Mod Not, And, Or, Xor, Eqv Relációs < > = <= >= <> Szöveg & (konkatenáció)
2. feladat Jelenítsük meg két szám összegét! Sub Összeg() Dim A, B, Össz As Integer A = 10 B = 20 Össz = A + B MsgBox (A & "+" & B & "=" & Össz) End Sub A = Range("A1") B = Range("A2") Range("A3") = Össz
Üzenet megjelenítése - MsgBox MsgBox(prompt[,buttons][,title]) Prompt: a kiírandó üzenet Buttons: nyomógombok és szimbólumok Title: a párbeszédablak címe
A MsgBox Buttons paraméterei Constant Value Description vbOKOnly OK button only (default) vbOKCancel 1 OK and Cancel buttons vbAbortRetryIgnore 2 Abort, Retry, and Ignore buttons vbYesNoCancel 3 Yes, No, and Cancel buttons vbYesNo 4 Yes and No buttons vbRetryCancel 5 Retry and Cancel buttons vbCritical 16 Critical message (X) vbQuestion 32 Warning query (?) vbExclamation 48 Warning message (!) vbInformation 64 Information message (i) vbDefaultButton1 First button is default (default) vbDefaultButton2 256 Second button is default vbDefaultButton3 512 Third button is default vbDefaultButton4 768 Fourth button is default
A MsgBox visszaadott értékei Constant Value Description vbOK 1 OK button pressed vbCancel 2 Cancel button pressed vbAbort 3 Abort button pressed vbRetry 4 Retry button pressed vbIgnore 5 Ignore button pressed vbYes 6 Yes button pressed vbNo 7 No button pressed
Jelenítsünk meg egy „kérdés” ablakot „igen” és „nem” gombokkal! 3. feladat Jelenítsünk meg egy „kérdés” ablakot „igen” és „nem” gombokkal! Sub Kérdés() Dim Válasz As Integer Válasz = MsgBox("Szereted a számítógépet?", vbQuestion + vbYesNo, "Fontos") If Válasz = vbYes Then MsgBox ("Akkor jó!") Else MsgBox ("Sajnálom!") End If End Sub
Adat beolvasása - InputBox Változó = InputBox(Üzenet, Cím, Alapérték) Üzenet: ez a szöveg jelenik meg az ablakban Cím: az ablak címsorának felirata Alapérték: alapértelmezett érték
4. feladat Írassuk ki egy négyzet kerületét, területét Sub négyzet() Dim a, K, T As Double Dim Kiírandó As String a = Cdbl(InputBox("Kérem az a oldal hosszát!", "Négyzet", 10)) K = 4 * a T = a ^ 2 Kiírandó = "K = " & K & Chr(10) & "T = " & T MsgBox (Kiírandó) End Sub
5. feladat Írassuk ki egy háromszög kerületét, területét Sub háromszög() Dim a, b, c, K, T, s As Double a = CDbl(InputBox("Kérem az a oldal hosszát!", "Háromszög", 1)) b = CDbl(InputBox("Kérem a b oldal hosszát!", "Háromszög", 1)) c = CDbl(InputBox("Kérem a c oldal hosszát!", "Háromszög", 1)) K = a + b + c s = K / 2 T = Sqr(s * (s - a) * (s - b) * (s - c)) Kiírandó = "K = " & K & Chr(10) & "T = " & T MsgBox (Kiírandó) End Sub
Vezérlési szerkezetek Ugrás (GoTo) Feltételes elágazás (If) Többirányú elágazás (Select Case) Ciklusképzés Do…Loop For … Next For Each … Next While
6. feladat - GoTo Számítsuk ki a kör kerületét, területét. Sub kör() Dim r, K, T, Pi As Double Dim Kiírandó As String Pi = Application.Pi() Adatbekérés: r = CDbl(InputBox("Kérem a kör sugarát!", "Kör", 1)) If r <= 0 Then MsgBox ("A kör sugara nem lehet negatív, vagy 0!") GoTo Adatbekérés Else K = 2 * r * Pi T = r ^ 2 * Pi Kiírandó = "K = " & K & Chr(10) & "T = " & T MsgBox (Kiírandó) End If End Sub
Feltételes elágazás If feltétel Then Else End If If feltétel Then parancsok Else End If If feltétel Then parancsok ElseIf feltétel2 Then Else End If
7. feladat Olvassunk be egy számot, és állapítsuk meg, hogy pozitív-e. Sub pozitív() Dim szám As Double szám = CDbl(InputBox("Kérek egy számot!", "Számvizsgáló")) If szám > 0 Then MsgBox ("Ez a szám pozitív!") ElseIf szám < 0 Then MsgBox ("Ez a szám negatív!") Else MsgBox ("Ez a szám a nulla") End If End Sub
Többirányú elágazás Select Case érték End Select Case vizsgálat1 parancsok1 Case vizsgálat2 parancsok2 … Case vizsgálatn parancsokn Case else parancsok_else End Select
Végezzük el egy dolgozat értékelését! 8. feladat Sub dolgozat() Dim pontszám As Integer pontszám = CInt(InputBox("Kérem a pontszámot!", "Dolgozat")) Select Case pontszám Case 72 To 80 MsgBox ("Jeles") Case 64 To 71 MsgBox ("Jó") Case 56 To 63 MsgBox ("Közepes") Case 48 To 55 MsgBox ("Elégséges") Case 0 To 47 MsgBox ("Elégtelen") Case Else MsgBox ("Nemlétező pontszám") End Select End Sub Végezzük el egy dolgozat értékelését! 72-80 Jeles 64-71 Jó 56-63 Közepes 48-55 Elégséges 0-47 Elégtelen
Do … Loop ciklus - While A ciklus addig fut, amíg a feltétel igaz. Do While feltétel ‘Elől tesztel ciklusmag Loop Do Loop While feltétel ‘Hátul tesztel
9. feladat Az A1:A100 tartományt töltsük fel számokkal! Sub DoLoop_1() Dim i As Integer i = 1 Do While i <= 100 Cells(i, 1) = i i = i + 1 Loop End Sub
10. feladat Olvassunk be egy 100-nál kisebb pozitív számot, és tároljuk az A1-es cellában a szám köbgyökét! Sub köbgyök() Dim x As Double Do x = CDbl(InputBox("Kérem a számot!", "Köbgyök")) Loop While x <= 0 Or x >= 100 Range("A1") = x ^ (1 / 3) End Sub
Do … Loop ciklus - Until A ciklus addig fut, amíg a feltétel hamis. Do Until feltétel ‘Elől tesztel ciklusmag Loop Do Loop Until feltétel ‘Hátul tesztel
Az A1:J1 tartományba írjuk fel 2 hatványait (1-től 10-ig)! 11. feladat Az A1:J1 tartományba írjuk fel 2 hatványait (1-től 10-ig)! Sub hatványok() Dim x As Integer x = 1 Do Until x > 10 Cells(1, x) = 2 ^ x x = x + 1 Loop End Sub
12. feladat Számítsuk ki a felhasználó életkorát! Sub életkor() Dim napok As Integer Dim szüldátum As Date Do szüldátum = CDate(InputBox("Add meg a születési dátumod!", "Életkor")) Loop Until szüldátum < Date napok = Date - szüldátum MsgBox ("Életkorod: " & napok & " nap") End Sub
For … Next Előre tudjuk, hogy hányszor kell lefuttatni a ciklusmagot! For i = kezdőérték To végérték Step lépésköz ciklusmag Next i
13. feladat Olvassunk be 5 számot, és írassuk ki a szorzatukat! Sub szorzat() Dim szám, szorzat As Double Dim i As Integer szorzat = 1 For i = 1 To 5 szám = CDbl(InputBox("Kérem a(z) " & i & ". számot", "Szorzat")) szorzat = szorzat * szám Next i MsgBox ("Az öt szám szorzata = " & szorzat) End Sub
For Each … Next Egy objektumgyűjtemény minden egyes elemén egy parancsszériát hajt végre. 14. feladat Zárjuk be az összes munkafüzetet! Sub bezár() Dim munkafüzet As Variant For Each munkafüzet In Application.Workbooks munkafüzet.Close Next munkafüzet End Sub
Exit Do Kilépés Do … Loop ciklusból Sub kilép_Do() Dim sorszámláló, folytatás As Integer Worksheets(1).Select Worksheets(1).Cells(5, 1).Value = 77 sorszámláló = 1 Do Cells(sorszámláló, 1).Select If Cells(sorszámláló, 1).Value = 77 Then MsgBox ("Megtaláltuk a 77-et tartalmazó cellát!") Exit Do End If sorszámláló = sorszámláló + 1 folytatás = MsgBox("Folytassuk a keresést?", vbYesNo) Loop While folytatás = vbYes End Sub
Exit For Kilépés For … Next ciklusból Sub Keres() Dim üzenet, Szöveg As String Dim karakter As Integer ' A program megadja egy szövegben az r betű pozícióját. üzenet = "Adj be egy szöveget, megadom az r betű pozícióját!" Szöveg = LCase(InputBox(üzenet, "R betű keresés")) For karakter = 1 To Len(Szöveg) If Mid(Szöveg, karakter, 1) = "r" Then MsgBox ("A(z) " & karakter & "." & "pozícióban" _ & " r" & " betű van!") Exit For End If Next karakter End Sub
While A ciklus akkor fut le, ha a vizsgált feltétel igaz. While feltétel utasítások Wend
17. feladat 'Az eredmény látható: Nézet menü Próba ablak-ban... '(View/Immediate Window) Sub WHILE1() Dim számláló As Integer számláló = 0 While számláló < 10 számláló = számláló + 1 Wend Debug.Print "Számláló értéke"; számláló ' 10 látható a Debug ablakban. End Sub
Vételen ciklus Program leállítása Egyéni kezelés: Esc (Ctrl+Alt+Del) Application.EnableCancelKey= … xlDisabled – A megszakítás nem lehetséges. xlInterrupt – A megszakítás lehetséges. xlErrorHandler – Egyéni hibakezelés.
18. feladat Sub hiba() Dim x As Integer On Error GoTo cancel_kezelés Application.EnableCancelKey = xlErrorHandler MsgBox "Ha unod, nyomd le a Ctrl+Break billentyűt!" For x = 1 To 1000000000 Next x cancel_kezelés: If Err = 18 Then MsgBox "Itt a vége!" End If End Sub
Eljárás adott számú argumentummal 19. feladat Function összefűz(Sz1 As String, Optional Sz2) If IsMissing(Sz2) Then Sz2 = "---" összefűz = Sz1 & " " & Sz2 End Function Sub proba() Dim kiír As String kiír = összefűz("Excel", "programozás") MsgBox kiír End Sub
Eljárás előre nem ismert számú argumentummal 20. feladat Function összeg(első As Double, ParamArray többi()) Dim részérték As Double Dim i As Integer részérték = első For i = LBound(többi) To UBound(többi) részérték = részérték + többi(i) Next i összeg = részérték End Function Sub proba() MsgBox (összeg(5, 4, 3, 5)) End Sub
Paraméterátadási módszerek ByRef paraméter átadása referenciával ez az alapértelmezett átadási mód az argumentum módosulhat ByVal paraméter átadása érték szerint az argumentum nem módosulhat
ByRef – 21. feladat Sub ArgumentumÁtadásaByReference() Dim Felhasználó_Neve As String Felhasználó_Neve = "Palkó" ChangeName Felhasználó_Neve MsgBox Felhasználó_Neve End Sub Sub ChangeName(ByRef Felhasználó_Neve) Felhasználó_Neve = "Józsi"
ByVal – 22. feladat Sub ArgumentumÁtadásaByValue() Dim Felhasználó_Neve As String Felhasználó_Neve = "Palkó" ChangeName3 Felhasználó_Neve MsgBox "Még maradt a " & Felhasználó_Neve & " az eredeti makróból." End Sub Sub ChangeName3(ByVal Felhasználó_Neve) MsgBox "Az eredeti név " & Felhasználó_Neve & "." Felhasználó_Neve = "Józsi" MsgBox "A név megváltozott " & Felhasználó_Neve & _ " a meghívott makróban."
Események
Munkalap események BeforeDoubleClick Change Activate SelectionChange Deactivate BeforeRightClick Calculate
A munkalapra kell bevinni! BeforeDoubleClick Dupla kattintás valamelyik cellán. 23. feladat Private Sub Worksheet_BeforeDoubleClick(ByVal Target As _ Excel.Range, cancel As Boolean) MsgBox ("Duplán kattintottál a következő cellára: " _ & Target.Address) cancel = True ' Az alapértelmezett művelet nem hajtódik végre End Sub A munkalapra kell bevinni!
A munkalapra kell bevinni! Change Érték beírása valamelyik cellába. 24. feladat Private Sub Worksheet_Change(ByVal Target As Excel.Range) MsgBox "Ezen a lapon megváltozott a következő cella:" _ & Target.Address End Sub A munkalapra kell bevinni!
A munkalapra kell bevinni! Activate Kiválasztjuk a munkalapot. 25. feladat Private Sub Worksheet_Activate() MsgBox "Az aktív munkalap neve: " & ActiveSheet.Name End Sub, A munkalapra kell bevinni!
A munkalapra kell bevinni! SelectionChange Tartomány kijelölése. 26. feladat Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target.Interior.ColorIndex = 4 ' Kitöltőszín zöld Target.Borders.Color = vbBlue ' Szegélyszín kék End Sub A munkalapra kell bevinni!
A munkalapra kell bevinni! Deactivate Elhagyjuk a munkalapot. 27. feladat Private Sub Worksheet_Deactivate() MsgBox ("Viszlát!") End Sub A munkalapra kell bevinni!
A munkalapra kell bevinni! BeforeRightClick Kattintás a jobb egérgombbal. 28. feladat Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Target.Font.Bold = True Cancel = True End Sub A munkalapra kell bevinni!
A munkalapra kell bevinni! Calculate Táblázat újraszámolása. 29. feladat Private Sub Worksheet_Calculate() MsgBox ("Most újraszámoltam a táblázat képleteit!") End Sub A munkalapra kell bevinni!
Munkafüzet események Activate BeforeClose BeforePrint BeforeSave Deactivate NewSheet Open SheetBeforeDoubleClick SheetChange SheetSelectionChange SheetDeactivate SheetBeforeRightClick SheetActivate SheetCalculate
A munkafüzetbe (ThisWorkbook) kell bevinni! NewSheet Új munkalap létrehozása. 30. feladat Private Sub Workbook_NewSheet(ByVal Sh As Object) Dim név As String név = InputBox("Mi legyen az új munkalap neve?", _ "Munkalapnév", "Új munkalap") If név = "" Then név = "Névtelen" ActiveSheet.Name = név End Sub A munkafüzetbe (ThisWorkbook) kell bevinni!
A munkafüzetbe (ThisWorkbook) kell bevinni! Open Munkafüzet megnyitása. 31. feladat Private Sub Workbook_Open() MsgBox "Dátum: " & Date & Chr(10) & "Idő: " & Time End Sub A munkafüzetbe (ThisWorkbook) kell bevinni!