Egy Excel-tanfolyamon a Conditional Formatting bemutatása valószínűleg már az első órák egyikén sorra kerül, hiszen egy elég gyakran szükséges és hasznos kis funkcióról van szó a táblázatkezelőben, annak ellenére, hogy vannak korlátai, amelyeket csak ilyen-olyan trükkökkel lehet kijátszani. Egy ilyen problémakört fogok bemutatni most két lehetséges megoldással, de értelemszerűen nem csak ez a két megoldás létezik, bármilyen ötlet, gondolat jöhet hozzászólásban akár itt, akár Facebookon.
Szóval adott a következő kis táblázat, beépítve egy alap Conditional Formattinggal, amely pirosra színezi a D11:E12 egyesített cellát, ha a benne lévő függvény eredménye NINCS, zöldre ha az eredmény IGEN:
Ez így flottul is működik, de mi van ha nem cellát szeretnénk színezgetni, hanem egy dashboard bizonyos alakzatát vagy akármilyen formát (Shape)?
Formákra nem működik a maga szigorúan vett értelmében a Conditional Formatting, így nyúlhatunk a legegyszerűbb és legkézenfekvőbb megoldáshoz: kimásoljuk, majd a dashboardba beillesztjük képként (Linked Picture a Paste Special menüben) a már conditional formattingot tartalmazó cellát.
Innentől kezdve pedig bármikor változik az eredeti, D11:E12 egyesített cella színe, változni fog a kép színezése is.
A szöveg a képben ne frusztráljon minket, hiszen ha nagyon szeretnénk, könnyedén kivehetjük azt is, akár úgy is, hogy az eredeti conditional formattingnál a függvények által adott válaszhoz (IGEN vagy NINCS) hozzápárosított szín egy másik cellában jelenjen meg. Ez volt mindenesetre a legegyszerűbb megoldás a Conditional Formatting érvényesítésére egy alakzaton, eltekintve attól az aprócska kis tévedéstől, hogy jelen esetben nem is alakzatról beszélünk, hanem egy szimpla képről.
Ha egy valódi Shapet szeretnénk conditional formattingra reagáltatni, akkor a második gondolat, ami felötlik a felhasználóban, az egy rövid VBA-kódsor, hiszen Visual Basicból jóval egyszerűbb vezérelhetőek a formák színei.
Itt van ez a beszúrt, pluszjelnek tűnő alakzat:
Értelemszerűen azt szeretném, ha a színe zöld lenne IGEN, piros NINCS eredmény esetén.
Abból indulunk ki, hogy nem szeretnék semmilyen kódot manuálisan futtatgatni vagy gombhoz hozzárendelni, így egy
Private Sub Worksheet_Change(ByVal Target As Range)
eseménnyel kezdjük a kódsorunkat, azaz ha bármi megváltozik az adott munkalapon, le fog futni a kis program. Innentől kezdve pedig nagyjából mintha leírnánk angolul, hogy mit szeretnénk csinálni, azaz ha a D11-es cellában szereplő érték NINCS (If Range("D11") = "NINCS"), akkor az aktív sheeten található Cross 5 nevű Shapet jelölje ki (ez lesz az ActiveSheet.Shapes.Range(Array("Cross 5")).Select), majd változtassa meg a színét pirosra:
If Range("D11") = "NINCS" Then
ActiveSheet.Shapes.Range(Array("Cross 5")).Select
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(255, 0, 0)
Értelemszerűen ellenkező esetben (ELSE), legyen a színe zöld:
Else
ActiveSheet.Shapes.Range(Array("Cross 5")).Select
Selection.ShapeRange.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent6
Ezzel pedig meg is vagyunk. Nem nagy ördöngősség összehozni ezt a kódot, főleg úgy nem, hogy komolyabb VBA-ismeret sem kell hozzá, hiszen az alakzatunk nevét és a változtatott szín kódját akár makrórögzítéssel is kideríthetjük pillanatok alatt.
Szövegként a kódunk:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("D11") = "NINCS" Then
ActiveSheet.Shapes.Range(Array("Cross 5")).Select
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(255, 0, 0)
Else
ActiveSheet.Shapes.Range(Array("Cross 5")).Select
Selection.ShapeRange.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent6
End If
End Sub