Rövidebb kihagyás után egy, Exceles automatizációk során elengedhetetlen elemmel fogunk megismerkedni, mert a UserFormok használata jelentősen javíthatja a felhasználóinkkal az interakciót, sőt, ezzel instruálhatjuk is őket bizonyos lépések végrehajtására.
Hogy kezdjünk neki? Első lépésként lépjünk a Visual Basic Editorba a Ribbonról vagy az Alt+F11 billentyűkombináció lenyomásával:
Ha bent vagyunk az Editorban, akkor az Insert menü UserForm parancsával szúrjuk be a felületünket:
Most majd erre a formra fogjuk elhelyezni mezőinket illetve azok neveit. A mezők elnevezéseit értelemszerűen a Label control gombjára való kattintással tudjuk beszúrni:

Ezután következhet a nevekhez tartozó, adatbevitelt lehetővé tevő mező, azaz a Textbox:
Értelemszerűen jobb gombbal kattintva formunk bármely elemén, annak tulajdonságait a megjelenő Properties ablakban változtatni tudjuk:
A UserFormmal kapcsolatban lehetünk teljesen kreatívak, olyat készítünk, amilyet csak akarunk vagy amilyenre szükségünk van, én most még egy gombot fogok elhelyezni ezen a formon, amivel a megadott adatokat egy Excel-táblázatba fogom rögzíteni. Ezt a Controlok közül a CommandButton beszúrásával érem el:
Így néz ki most a form:
Ha a felület elkészült, meg kell határoznunk a mögötte lévő kódot, ami jelen esetben a Hozzáadás gombra való kattintás esetén futna le. Ezt a CommandButtonon jobb gombbal katintva előhívható menüből a View Code parancs használatával határozhatjuk meg:
Mit is várunk el a kódtól a gombra való kattintás után? Az elvárásaink szerint meghatározott sorok meghatározott celláiba a UserFormon megadott értékeket rögzítse be. Ehhez nagyjából tudnunk kell, hogy hol van a következő üres sor a táblában majd a kitöltés után értelemszerűen egyenlővé kell tennünk a megfelelő cellákat a megfelelő mezőkbe felvitt értékekkel.
Kezdésként definiáljunk két változót, az elsőt sor néven az aktuális, még üres sorunk meghatározására Integer típussal, a másodikat pedig ws néven Worksheet típussal, hiszen ez fogja meghatározni, hogy melyik munkalapon fogja a formunk frissíteni a cellákat. Ez utóbbi változónak már be is állíthatjuk az értékét a Sheet1 munkalapra.
Sor változónk kezdő értékének meghatározásához a Range.Find metódust, jelen esetünkben a ws.Cells.Find metódust kell használnunk, hiszen a Sheet1 cellái között keressük azokat, amelyek tartalmaznak valamit (What:="*"), soronként keressük (SearchOrder:=xlRows - a másik opciónk az xlColumns lehetne) az utolsó (SearchDirection:=xlPrevious - ez még xlNext lehetne, ha a következőt keresnénk) értéket (LookIn:=xlValues) tartalmazó sort, majd ehhez a számhoz hozzáadunk egyet, hogy megkapjuk az első üres sort:
sor = ws.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
Innentől kezdve pedig alapvetően egyszerű a dolgunk, hiszen a mezőkbe beírt értékeinkkel kell egyenlővé tenni a sor változónkban lévő sorszám megfelelő számú celláinak értékét.
Mezőink nevét a UserFormon előhívott Properties ablakból is megtudhatjuk, ha esetleg nem standard elnevezéseket használtunk végig.
Azaz ws.Cells(sor, 1).Value (ez Sheet1 első üres sorának első oszlopában lévő cella) legyen egyenlő Me.TextBox1.Value értékkel, ami az első mezőnkbe beadott érték. Me minden esetben arra a szülő objektumra utal, amiben a kódunk "van", jelen esetben a UserFormra utal, de ha egy Sheeten írnánk a kódunkat, akkor arra utalna.
Itt célszerű esetleg informálni a usert arról, hogy mi történt a bevitt adatával, tehát az MsgBox utasítás segítségével írjunk ki neki egy üzenetet. Ezen a felugró üzenetablakon most csak egy OK gomb legyen (vbOKOnly paraméter), de ezt értelemszerűen az MsgBox további paraméterei segítségével úgy tuningoljuk, ahogy akarjuk.
Ha ez megvan, akkor szépen töröljük ki mezőinkből a bevitt értékeket (hiszen azok már a megfelelő cellákban vannak) egyszerűen úgy, hogy az Me.TextBox1.Value értékét a semmivel tesszük egyenlővé. Ezután pedig a SetFocus paraméter segítségével célszerű visszaugrasztani a kurzort az első mezőbe.
Alapvetően minden kis kódot a lehetséges hibák minimalizálásával célszerű megírni, ezért érdemes esetleg arra beszúrni egy If elágazást, hogy üresen hagyott mezők esetén ne csináljon semmit a UserForm. Hogy csináljuk ezt meg? Egyszerűen fordítsuk át gondolatainkat a kódra, azaz ha (If) a szóközök eltávolítása (Trim) után első mezőnk értéke (Me.TextBox1.Value) egyenlő a nagy semmivel (= "") akkor (Then) írjon ki egy üzenetet (MsgBox "A form nincs kitöltve!"), majd lépjen ki (Exit Sub) és ezzel le is zárhatjuk az If elágazást (End If).
If Trim(Me.TextBox1.Value) = "" Then
MsgBox "A form nincs kitöltve!"
Exit Sub
End If
Itt a kód szövegként:
Private Sub CommandButton1_Click()
Dim sor As Integer
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
sor = ws.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
ws.Cells(sor, 1).Value = Me.TextBox1.Value
ws.Cells(sor, 2).Value = Me.TextBox2.Value
ws.Cells(sor, 3).Value = Me.TextBox3.Value
MsgBox "Berögzítve", vbOKOnly
Me.TextBox1.Value = ""
Me.TextBox2.Value = ""
Me.TextBox3.Value = ""
Me.TextBox1.SetFocus
End Sub
Mi van még hátra? Hát annak meghatározása, hogy mi "triggerelje" a kis kódunkat, azaz hogy induljon el. Itt beállíthatunk eseményeket vagy billentyűkombinációt is akár, én most szimplán hozzárakom egy gombhoz a kód indulását. A Ribbonunk Developer füle alatt található Controls szekció Insert utasítása segítségével szúrjunk be egy gombot:
Design Mode-ban duplán kattintva a gombra átjutunk a Visual Basic Editorba, ahol a kattintás eseményéhez mindössze az általam Adatbevitelformként elnevezett UserForm megmutatására (Show utasítás) van szükség:
És ezzel kész is vagyunk, a gombra való kattintással feljön a UserForm, amelynek kitöltése után az adatok bekerülnek a megfelelő cellákba.
Ez most egy roppant módon lebutított kis példa volt, de remélhetőleg elég ötletet és támaszt adott egy-két Olvasónak, hogy komolyabb irányba induljon saját kis projektjével. Kritika, javaslat, ötlet, mint mindig, most is szívesen látott.