A mai posztot egy bocsánatkéréssel kezdem, hiszen sajnos az elmúlt hetekben nem igazán jutott idő a blogra, de ennek persze azért volt olyan előnye is, hogy ebben a néhány napban azért sikerült pár érdekes problémával és megoldással találkoznom, úgyhogy megint bőven van miről írni. Ma két olvasói felvetés gyors megválaszolásával melegítünk be, az első az ezen a linken már hosszassabban kifejtett, egymáshoz kapcsolódó Data Validation Listekhez kapcsolódik - ugye ez az a megoldás, amikor egy listából kiválasztott értékünk meghatározza a következő lista értékeit és így tovább.
A probléma ezzel a megoldással az, hogy ha már kiválasztottunk értékeket minden listánkból és utána visszamegyünk az első legördülő menübe, akkor hiába választunk más értéket, a kapcsolódó listákban default értékként a korábban kiválasztott elemek szerepelnek:
Ugyebár Toyotát választottam az Autó legördülő menüben, így jó lenne, ha nem maradna a Típus legördülő menünél egy Audi típus. Ennek kiküszöbölésére az egyik megoldás, ha az Autó legördülő menünk Data Validation beállításait megbütyköljük, azaz a Source mezőhöz beírunk egy feltételt:
=IF(F4="",Autó,INDIRECT("XY"))
Ezzel azt érjük el, hogy ha az első kapcsolódó legördülő menü (jelen példánkban ez a típus, az F4 cella) cellája nem üres, akkor nem tudjuk kiválasztani az Autó legördülő menünket egyáltalán, tehát konkrétan elakad a történet. Ennek súlyos hátránya, hogy állandóan törölgetni kell a korábbi kiválasztásokat, amiről persze tájékoztatni kell a felhasználókat, ellenkező esetben felesleges kommunikációval tölthetjük az időnket. Mindenesetre egymásnak ellentmondó kiválasztások nem maradhatnak.
A másik megoldás egy apró makró használata a VBA-editorban:
Az adott munkalapunk változás eseményéhez fogunk egy kódot hozzárendelni, méghozzá úgy, hogy megnézzük, hogy a változás hányadik oszlopban történt (If Target.Column = 4) és ha ez az az oszlop a negyedik (jelen példánk Autó legördülő listájának cellája), akkor megnézi, hogy az adott oszlopban van-e Data Validation Listünk (If Target.Validation.Type = 3) és ha ez is teljesül, akkor az adott data validation listától kettővel jobbra található cellát kiüríti (Target.Offset(0,2).ClearContents).
A másik kérdés a Data Validation listák mellett megtalálható nyilacskát érinti, amely ugyebár csak akkor jelenik meg, ha a listát tartalmazó cellán állunk - vajon elérhetjük-e valahogy azt, hogy mindig látszódjon nyíl az ilyen cellák mellett? Nos, beépített funkcionalitással nem (de javaslatok jöhetnek), viszont egy egyszerű kis linkeléssel megoldható a dolog. Szóval adott ez a helyzet:
Azt szeretnénk, hogy bár nem állunk a Típus melletti legördülő menü cellájában, mégis lássuk azt, hogy ez egy Data Validation List. Én egyszerűen csak készítettem egy képernyőfelvételt a Snipping Toollal egy Data Validation List nyiláról, majd beszúrtam a mellette lévő cellába:
Ezután pedig a kis ikonra való jobb gombbal kattintás után kiválasztottam az Assign Macro utasítást a context menüből, és hozzárendeltem egy
Range("F4").Select
utasítást, azaz ha valaki a kis nyílra kattint, akkor azonnal megjelenik a "rendes" nyíl is, hiszen az F4-es, data validation listet tartalmazó cellára visz minket a kattintás. Gagyi és sok ilyen listánál már eléggé melós dolog, de ettől függetlenül egyszerű és működik.