Még mindig roppant egyszerű VBA kódolgatás, minimális ciklushasználattal

Gyönyörű eredmény, kis munkával - mi kell még?

2015. október 11. - Office Guru

Tovább folytatva apró kis makrókról szóló posztsorozatomat, most következzen egy olyan kis VBA-kód leírása, amely alapvetően haszontalannak is nevezhető eredményt produkál, mégis mivel jelentősen javíthatja táblázataink kinézetét és felhasználhatóságát illetve mivel ez is tökéletes kiindulópont lehet egy komolyabb VBA-fejlesztgetéshez, amondó vagyok, hogy vágjunk bele!

A célállapot egyszerűen megfogalmazható, a lentebb látható kiindulótáblázatunkra ráhúzni egy olyan kódot, amelynek eredményeként aktív, kijelölt cellánk sorát és oszlopát is kijelöljük, megkönnyítve ezzel sokoszlopos, soksoros táblázataink áttekinthetőségét.

200.jpgErre is van többféle megoldás, én már láttam Conditional Formattingos és komplexebb VBA-s megoldást is, mindenesetre mostani megoldásunk első lépéseként kattintsunk jobb gombbal az adott sheetünk nevére majd a legördülő menüből válasszuk ki a View Code menüpontot:

201.jpgA VBA-editor felületre jutunk a kattintás után, ahol a fenti két legördülő menüből egyrészt a Worksheetet kell választanunk, eseményként pedig a SelectionChange menüpontot, azaz adott sheetünkhöz rendelünk hozzá egy kijelölési eseményt. Ezután a program automatikusan létrehozza az eseményt:

202.jpgHozzunk ezután létre négy változót (hogy miért négyet, az mindjárt kiderül majd), mindet egész szám, azaz Integer típussal:

206.jpgSorszam változónkba majd az aktuális sor számát, Oszlopszam változónkba pedig az aktuális oszlop számát fogjuk betölteni, a másik két változó, x és y pedig egy olyan ciklusban lesz majd a segítségünkre, ahol az aktuális sorunk illetve oszlopunk számáig kijelöljük a tartományt. Remélhetőleg ez így érthető volt, ha mégsem, a későbbi lépéseknél egyértelművé válik majd.

Úgyhogy ahogy akkor csináljuk is meg az első két változónk feltöltését, az előbbi leírás alapján elég egyértelmű hogyan:

207.jpgCélszerű ide beszúrni egy "kifehérítést" egy, celláinkhoz tartozó Interior objektum ColorIndexének fehérre állításával, azaz:

Cells.Interior.ColorIndex = 0

Ezzel már egyébként majdnem kész is vagyunk, hiszen most jön a legfontosabb része programunknak, a két For-Next ciklus. Ez a ciklus arra szolgál, hogy egy meghatározott VBA-kódot meghatározott számban futtassunk le, szintaktikája elég egyszerű:

FOR "Egyik változó" = Kezdőérték to "Másik változó"
Mit csináljon a kód
Next "Egyik változó"

Azaz az "Egyik változó"-ba betöltjük a kezdőértékünket (egyet, nullát stb.), majd innentől kezdve a másik változónkba töltött értékig annyiszor le fogja futtatni a kódot, amit a FOR és a NEXT közé ágyaztunk.

Azaz amit most tennünk kell, az az, hogy az első sortól (illetve oszloptól) addig a sorig és oszlopig megváltoztatni celláink hátterét, amekkora oszlop- illetve sorszámot a két erre kijelölt változónkba betöltöttünk, majd lezárni a ciklust.

Egy cella hátterszínét VBA-ban úgy tudjuk megváltoztatni, hogy fogjuk az érintett cellát, majd a hozzárendelt Interior objektum ColorIndexét megváltoztatjuk (a színek listája bárhol hozzáférhető könnyedén). Egy cellát úgy tudunk kijelölni, hogy használjuk a Cells(sor, oszlop) parancsot.

Tehát a következő képen szereplő kódrész már érthetővé is válik:

208.jpg

209.jpgÉs ezzel kész is vagyunk! Ismételni tudom csak magam, tisztában vagyok vele, hogy nem egy bonyolult VBA-kódról beszélünk, de kiindulási alapnak az otthoni gyakorláshoz tökéletes lehet! Ötletek, problémák, kritikák jöhetnek!

210.jpgMásoláshoz maga a kód:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim Sorszam As Integer, Oszlopszam As Integer, x As Integer, y As Integer

Cells.Interior.ColorIndex = 0
Sorszam = ActiveCell.Row
Oszlopszam = ActiveCell.Column

For x = 1 To Sorszam
Cells(x, Oszlopszam).Interior.ColorIndex = 37

For y = 1 To Oszlopszam
Cells(Sorszam, y).Interior.ColorIndex = 37

Next y
Next x
End Sub

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr787958406

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Atzs · https://adatrendezo.hu 2015.10.12. 16:39:23

A két ciklus ebben a példában lehet külön is. Az eredeti megoldásban a második ciklus nem csak egyszer színezi be a sorszam-adik sort, hanem sorszam-szor. Így pár ezredmásodperccel gyorsabb:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim Sorszam As Integer, Oszlopszam As Integer, x As Integer, y As Integer

Cells.Interior.ColorIndex = 0
Sorszam = ActiveCell.Row
Oszlopszam = ActiveCell.Column

For x = 1 To Sorszam
Cells(x, Oszlopszam).Interior.ColorIndex = 37
Next x

For y = 1 To Oszlopszam-1
Cells(Sorszam, y).Interior.ColorIndex = 37
Next y
End Sub

Emmanuel Goldstein 2015.10.12. 22:05:37

monnyuk. nem vok nagy ekccel programozó, de sztem, ha egy mód van rá, ne használjuk azt a csodát míg adatokkal dolgozunk..
jáccunk tömbökkel, de a wörksítbe már csak végeredményt toljuk.ha nem lehet, akkor alternatív megoldás, első sor:
szkrínápdét=fósz
uccsó sorba azér kapcsoljuk vissza persze...

I_Isti 2015.10.13. 10:34:34

@Emmanuel Goldstein: Ősi dakota mondás szerint: adatokat használjunk az adattárházbó'! :)
Főleg.

I_Isti 2015.10.13. 10:44:46

@Atzs: @Office Guru:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Megjegyzés: Minek szórakozni, ha szórakozás nélkül is meg lehet
'oldani valamit?

Cells.Interior.ColorIndex = 0
Range(Cells(1, ActiveCell.Column), Cells(ActiveCell.Row, ActiveCell.Column)).Interior.ColorIndex = 37
Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, ActiveCell.Column)).Interior.ColorIndex = 37

End Sub

Atzs · https://adatrendezo.hu 2015.10.13. 11:21:24

@I_Isti: Mert különböző szintű felhasználók vannak. OfficeGuru megoldása egyfajta oktatási anyag. Nem állítom, hogy abszolút kezdőknek mindig a legérthetőbb. Sok dolgot másként fogalmaznék meg, mint ő. Viszont ő veszi a fáradságot arra, hogy posztoljon, én meg nem... A poszt alapján olyanok is megpróbálkozhatnak első makrójuk megírásával, akik eddig nem csináltak ilyet, és ez szerintem nagyon jó dolog.
Emmanuel kommentje és a tied rajtuk nem segít, mert csak az érti meg, aki már eleve tudja, pedig jó dolgot írtatok mindketten. Egy mondatnyi magyarázat szerintem még kellene a kezdőknek. Azt még esetleg megértik egy kis guglizással, amit te írtál, de a szkrínápdét=fósz esélytelen az Application.ScreenUpdating = False helyett.

Office Guru 2015.10.13. 22:00:30

Köszönöm a hasznos javaslatokat, Excelben és VBA-ban kb. tényleg mindent ezerféleképpen meg lehet csinálni, de igyekeztem olyan formában, olyan lépésekben bemutatni valamit, ami alapján már a minimális VBA-vénával rendelkezők is elkezdhetnek ügyködni. Mindig mindent lehet jobban és másképp csinálni.

És maximális tisztelettel azért is köszönöm a hozzászólásokat, mert pont az ilyenek miatt kezdtem el az egész blogot csinálni:)