Az eseménykezelés segítségével monitorozhatjuk a felhasználói tevékenységet, illetve lefuttathatunk makró(ka)t attól függően, mit csinálunk Excelben.
Ez a módszer az Excel 97-es verziójától fogva áll rendelkezésünkre. Ilyen esemény például a munkafüzet megnyitása, mentése vagy épp a munkalap celláinak változása.
Az ezekre írt VBA kódok (makrók) automatikusan lefutnak az esemény bekövetkezésekor.
Használata:
Az aktuális munkafüzetben nyissuk meg a VBA szerkesztőjét az ALT + F11 billentyűkombinációval vagy a Fejlesztőeszközök menü – Visual Basic gombjára kattintva:
A szerkesztőben a bal oldalon a projekt ablakban keressük meg a munkafüzetünk nevét. Ha nem látjuk a projekt ablakot, akkor a CTRL+R paranccsal lehet ismét megjeleníteni vagy a „View” menüben található „Project Explorer” almenüre kattintva:
Ezt követően kattintsunk duplán a munkafüzethez tartozó „ThisWorkbook” feliratra:
A „ThisWorkbook”-on belül tudjuk hozzáadni azon kódokat, melyek az egész munkafüzetre hatással vannak. Nézzünk egy olyan lehetőséget, amikor a munkafüzet megnyitásakor akarunk egy kódot automatikusan lefuttatni.
A „(General)” felirat mellett kattintsunk a lefelé mutató nyílra majd a legördülő listából válasszuk a „Workbook” opciót:
A jobb oldali „Open” felirat mellett szintén kattintsunk a lefelé mutató nyílra. Az itt lévő lista tartalmazza a munkafüzethez tartozó összes eseményt, melyhez kódot adhatunk hozzá:
Így néz ki most a szerkesztőfelületünk:
Magát a VBA kódot a Private Sub és End Sub közé kell beírnunk. Ha mondjuk a munkafüzet megnyitásakor szeretnénk megadni egy konkrét szöveget az aktuális Windows-os felhasználónévvel kombinálva, azt az alábbi makró bemásolásával tehetjük meg:
1 2 3 |
MsgBox _ "Kedves " & Environ("USERNAME") & "!" & vbNewLine & vbNewLine & _ "A riport leadásának határideje minden hónap 10-e.", vbInformation, "" |
A teljes makrónk:
Mentsük el, zárjuk be majd nyissuk meg újból a munkafüzetet. Az alábbihoz hasonló üzenet kell, hogy fogadjon (a Roland helyett a saját Windows-ban beállított felhasználónév fog megjelenni):
Az eseménykezelés ennél azonban többre is képes. Applikáció (ami itt az Excel-t jelenti) szintjén is lehet alkalmazni. Mit is jelent ez? Tegyük fel, hogy az Excel fájlunknál módosítani akarjuk a címsort (caption) úgy, hogy írja ki a fájl nevét és teljes elérési útját. Vagyis ehelyett….
… ezt akarjuk látni:
Ezt a megoldást azonban nem csak egy munkafüzetre szeretnénk használni, hanem minden megnyitott munkafüzetre.
Az előbb említett „ThisWorkbook”-on belül van egy „WindowActivate” esemény, mely éppen megfelel a célnak:
Ezt nem egy adott fájlnál, hanem minden megnyitott Excel munkafüzetnél látni akarjuk, ezért:
– Applikáció (Excel) szintjén kell a kódot megírni
– olyan munkafüzethez kell a kódot hozzáadni, amely mindig meg van nyitva, ha Excelben dolgozunk
Éppen ezért az Egyéni Makró Munkafüzet (Personal Macro Workbook vagy Personal.xlsb) az ideális választás.
Menjünk a VBA szerkesztőjébe és a PERSONAL.XLSB alatt keressük meg a „ThisWorkbook”-ot, majd duplán kattintsunk rá:
A jobb oldali részhez adjuk hozzá az alábbi kódot:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
Private WithEvents App As Excel.Application 'Inspiráció: http://www.cpearson.com/excel/FullFileNameInWindowCaption.aspx 'Készítette: XLMotyo (https://xlmotyo.hu) 'ez a kód az éppen aktív Excel fájlnál frissíti a címsort úgy, hogy kiírja a fájl nevét és annak teljes elérési útját Private Sub Workbook_Open() Set App = Application End Sub Private Sub App_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window) Application.ScreenUpdating = False If Wb.FullName <> vbNullString Then 'Wn.Caption = Wb.FullName '200 feletti karakterû szövegnél nem mûködik Wn.Caption = Left(Wb.FullName, 200) 'Application.Caption = "" 'ilyenkor a path után ez lesz: " - Excel". Vagy ez is jó: Application.Caption = "BlaBla" 'címsor visszaállítása: következõ két sor elején az aposztróf (') jel törlése. Majd Excelt: ment - bezár - újranyit: 'Wn.Caption = Wb.Name 'Application.Caption = "" End If Application.ScreenUpdating = True End Sub Private Sub App_WorkbookAfterSave(ByVal Wb As Workbook, ByVal Success As Boolean) Application.ScreenUpdating = False If Wb.FullName <> vbNullString Then 'ActiveWindow.Caption = Wb.FullName '200 feletti karakterû szövegnél nem mûködik ActiveWindow.Caption = Left(Wb.FullName, 200) 'Application.Caption = "" 'ilyenkor a path után ez lesz: " - Excel". Vagy ez is jó: Application.Caption = "BlaBla" 'címsor visszaállítása: következõ két sor elején az aposztróf (') jel törlése. Majd Excelt: ment - bezár - újranyit: 'ActiveWindow.Caption = Wb.Name 'Application.Caption = "" End If Application.ScreenUpdating = True End Sub |
Mentsük el, zárjuk be majd nyissuk meg újból az Excelt (vagyis itt minden munkafüzetet és az Excelt is be kell zárni, majd egy munkafüzetet újból megnyitni). Most már a címsorban a fájl nevét és teljes elérési útját kell látnunk:
Az eseménykezelő technikán alapul a „Naplózás (cellamódosítások monitorozása)” címen található bejegyzésem is:
További ötletek a címsor módosításához, eseménykezelés alkalmazásával:
– a munkafüzet utolsó mentésének ideje
– cégnév illetve saját név kiíratása a professzionálisabb kinézetért
– idézet/motivációs szöveg megjelenítése
– mennyi idő van hátra a következő határidőig/nyaralásig/napfogyatkozásig 😉
– személyre szabott köszönés, pl. „Jó reggelt kedves XY” (bár ez lehet, hogy túl gyanús lesz, ha olyan helyen dolgozol, ahol a köszönés is ritkaságszámba megy 😊)
Remélem hasznos volt a poszt.
Kérdésed, észrevételed van? Hívj fel vagy dobj egy emailt: xlmotyo@gmail.com