Kisebb kitekintés és más területeken való kalandozás után a mai posztban térjünk vissza a VBA-hoz, amelyet legalább alapszinten mindenkinek célszerű megismernie, aki sokat dolgozik Excelben, hiszen nem kell programozónak lenni ahhoz, hogy mondjuk egy állandóan elvégzett Pivot-táblás copy-paste műveletet automatizálni tudjunk.
Szóval a mai kérdés a következő kis tábla köré összpontosul:
Tegyük fel, hogy kirándultunk egy nagyobbat az országban, felkerestünk néhány települést és az ezeken a helyeken megvásárolt dolgokról vezettünk egy kis Excel-táblázatot, de arra már nem figyeltünk, hogy mivel jelöltük az egyes cellákban, hogy mit vásároltunk, tehát szöveg, betű vagy éppen szám egyaránt található a táblában. A kérés annak meghatározása lenne, hogy a termékek egységárát figyelembe véve, pontosan mennyit költöttünk, ha a cellákba beírt érték nem számít, csak az, hogy írtunk-e be valamit vagy sem - értelemszerűen ha írtunk valamit, azt tekintsük egynek.
A feladvány jópár úton megoldható, de VBA-ban sem tartozik a nehéz feladatok közé, ezért aki még csak az érdeklődő fázisban tart, ő mindenképpen próbálja saját maga megoldani.
Alt + F11 billentyűkombinációval ugorjunk át a VBA-editorba és kezdjünk is neki Szamitas() nevű szubrutinunk összedobásának, amelyet most már biztosan a változók deklarálásával kezdünk. Tekintve, hogy tartományról van szó és ciklusra lesz szükségünk, célszerű a tartománynak is létrehozni egy változót (én ezt most rng néven Range típussal meg is teszem) illetve kell egy másik változó, amelyben a kalkulációnk eredményét tároljuk a ciklus során (én ezt a megszokott i néven Integer típussal alkottam meg). Szóval megvannak a változóink, az rng névre hallgatót fel is tudjuk tölteni táblázatunk paramétereivel.
Hangsúlyozom, egyszerű feladványról van szó, tehát aki érdeklődik VBA-ismeretek iránt, az mindenképpen kapcsolódjon be és saját maga fejezze be a megoldást - a saját verziójában.
Szóval most jön a ciklusunk, amelyet én általában simán szövegként gondolok végig (egy-két írónak volt hasonló módon megírt oktatási anyaga), azaz most minden egyes cellát nézzen meg a ciklusunk a tartományban (For Each cell in rng) és ha a cella (If Cell.Value) nem üres (cell.Value <> "") akkor (Then) ezt a cellát tegye az aktív cellánkká (cell.Activate). Majd ezután a fentebb deklarált i változó legyen egyenlő a korábban benne lévő értékkel, hozzáadva a most aktív cellánk oszlopának második sorában szereplő értéket (i = i + Cells(2, ActiveCell.Column) - persze itt is simán elkerülhetjük a konstans sorszám használatát, ha akarjuk. Ezután zárjuk le az If feltételvizsgálatot és ugorjunk a következő cellára a tartományban.
Innen már csak az van hátra, hogy kiírassuk az eredményt a képernyőre egy MsgBox segítségével, illetve kiürítsük i változónkat és bezárjuk a szubrutint:
És ezután már tuningolhatjuk, ahogy akarjuk, innen könnyen be tudjuk állítani akár azt is, hogy ha szám van, akkor ne csak egyszer számolja az egységárat, hanem a számmal szorozza meg, de akár kitölthetjük az üres cellákat is, gombhoz is hozzárendelhetjük, de akárhogy is teszünk, a fentinek meg is van szépen az eredménye:
Szövegként a kód:
Sub Szamitas()
Dim rng As Range
Dim i As Integer
Set rng = Range("B3:D8")
For Each cell In rng
If cell.Value <> "" Then
cell.Activate
i = i + Cells(2, ActiveCell.Column)
End If
Next
MsgBox i
i = 0
End Sub