Projektes státuszjelentésekben, bevételről szóló beszámolókban időnként hasznos lehet, ha bizonyos státuszú, bizonyos telephelyhez köthető elemeinket kiemelten tudjuk prezentálni diagramos formában, ehhez fog segítséget nyújtani a következőkben bemutatásra kerülő kis makró, ami nem tesz mást, mint az általunk megadott paraméterek alapján egy diagramban bizonyos oszlopok, sorok színét fogja megváltoztatni.
Legyen a kiindulópontunk a következő apró kis táblázat:
Most készítsünk ebből egy teljesen egyszerű oszlopdiagramot (persze lehet akár háromdimenziós oszlop vagy "bar" is) mondjuk a lentieknek megfelelően:
Ennek az elkészítéséről már nem fogok részletesen írni, korábbi posztokban részletesen taglaltam a diagramok elkészítésének menetét, ha valakinek segítségre lenne szüksége, jelezze nekem valamilyen kommunikációs csatornán. Az igényesebb megvalósítás érdekében (persze azért az igazi igényességtől ez messze lesz) szúrjunk be még a Ribbonunk Developer füle alatt található Controls szekció Insert parancsával egy gombot is, ami kattintással fogja elindítani a kis színezésünket.
Ehhez fogjuk aztán majd hozzárendelni azt a makrót, ami az x tengelyünk elnevezései közül mondjuk Gyömrő esetében átszínezi az oszlopot, mert például erre a városra szeretnénk nagyon koncentrálni bemutatónkban (de hangsúlyozom, lehet akár érték, akár más paraméter alapján is átdolgozni a makrót).
Kattintsunk jobb gombbal a gombon és View Code parancsot használjuk:
És máris a VBA-editorban vagyunk, ahol szépen a kattintás eseményünkhöz kidolgozhatjuk a kódot, amit szeretnénk kattintás esetén lefuttatni. Ahogy megszoktuk, első lépésként kezdjük változók deklarálásával, méghozzá kapásból néggyel.
Kell egy változó Chart típussal magának a táblázatunknak, kell egy változó Series típussal a táblázatunk összes adatmező sorozatának tárolására (itt gondoljunk például mondjuk az X vagy Y tengely megnevezéseire, sor illetve oszlopértékeire) illetve még két változó Integer típussal, amelyekre majd a ciklusunkban lesz szükség - hiszen itt is csak ciklussal tudjuk végignézni az összes megnevezésünket a diagramban:
Most lássunk hozzá és kezdjük feltölteni a változóinkat, azaz állítsunk be kezdőértéket, legalább a táblázatoshoz illetve az adatmezőshöz. Amikor egy Chart aktív objektum, akkor az ActiveChart tulajdonsággal tudunk rá hivatkozni, így az első esetben c változónk kezdőértéke legyen az ActiveChart, tehát a diagramunk - itt álljunk meg arra a gondolatra, hogy ha nincs éppen kijelölve a diagramunk vagy más diagramok is vannak más sheeteken a táblázatunkban, akkor mindenképpen aktiválni kell a megfelelőt az Activate utasítással. Itt most annyiban leegyszerűsítettem a kódot, hogy ettől eltekintek.
S változónkat pedig ActiveChart objektumunk SeriesCollection(1) tulajdonságával kell feltöltenünk, ami az aktív objektumunk első sheetjén szereplő diagramunk első adatsorának (series - a tengelyeinket szereplő nevek) értékeit fogja visszaadni, jelen esetben városaink nevét töltjük be ide.
A ciklusban felhasználásra kerülő l változónkba pedig töltsük be az aktív diagramunk első adatsorának adatmező darabszámát, avagy VBA-ra átfordítva az:
ActiveChart.SeriesCollection(1).Points.Count
utasítást, ami ebben a kódban már meghivatkozható a korábbi változók felhasználásával.
Sok már nincs hátra, ahogy kitalálhattuk, következik a ciklusunk maga, azaz a másik változónkba töltött egyes kezdőértéktől egészen az l változónkba az előbb már betöltött adatmező darabszámig futtasson egy IF utasítást, méghozzá a következőkben kifejtettet.
Előbb azonban két dolgot kell megértenünk, az egyik az ActiveChart.SeriesCollection(1).XValues tulajdonság, ami konkrétan az aktív táblázatunk első adatsorozatából adja vissza az x tengely értékét a megadott helyre vonatkozóan, a másik pedig a Right funkció, ami teljesen ugyanúgy működik VBA-ban, mint az Excelben, azaz a paramétereként megadott darabszámnyi karaktert fog nekünk visszadobni a megadott szöveg jobb oldaláról.
Így pedig össze is állt nagyjából If utasításunk első sora:
If Right(s.XValues(i), 40) = "Gyömrő" Then
Ha az ActiveChart.SeriesCollection(1) x tengelyének i helyén szereplő érték utolsó negyven karaktere az mondjuk, hogy Gyömrő akkor ugrik a második sorra, ahol az
s.Points(i).Interior.Color = RGB(255, 0, 0)
utasítással fogjuk szépen az ActiveChart.SeriesCollection(1) i-edik pontjának színét átállítani RGB(255, 0, 0) színre, ami a piros.
Fekete: RGB(0, 0, 0)
Fehér: RGB(255, 255, 255)
Zöld: RGB(0, 255, 0)
Kék: RGB(0, 0, 255)
És ha ezzel megvagyunk, akkor csak le kell zárnunk az IF-et és a FOR ciklust:
Most futtassuk le a makrót. Oppá, hibaüzenetet kaptunk:
Ezt a részt könnyedén kivehettem volna a posztból, de úgy gondoltam talán hasznos lehet egy kis közös problémamegoldás is, szóval mit jelenthet az üzenet? Az üzenet szerint egyértelműen valamelyik változónkkal lehet a probléma. Na de melyikkel? Ahogy végigfutjuk ezt a tényleg roppant aprócska kis kódot, egyből szemünkbe ötlik a fent már emlegetett megoldás, azaz c változónk kezdőértékének ActiveChartra való beállítása. Hiszen ha a gombra kattintunk, akkor nem lehet kijelölve a diagramunk!
Azaz egyetlen egy plusz sorra van szükségünk a kód elején még (mindenképpen a Set c = ActiveChart elé), ami nem tesz mást, mint a gomb lenyomása után kijelöli a táblánkat, valahogy így:
ActiveSheet.ChartObjects("Chart 4").Activate
Azaz aktív sheetünk Chart 4 névre hallgató diagramjának (ezt a nevet diagramunk tulajdonságai közül tudjuk kinyerni) aktiválása.
És most már szépen lefut: