Az Excelben általánosságban elmondható, hogy a Conditional Formatting alatt elérhető ikonkészletek vagy éppen az Insert Ribbonfül Symbol parancsával beszúrható szimbólumok tárháza elképesztően hatalmas, mindennemű alapelváráshoz és általános feladathoz találhatunk itt nekünk megfelelő ikonokat. Na de mi van akkor, ha mi mégsem ezeket szeretnénk használni, hanem például az általunk interneten talált képeket, emotikonokat vagy egyéb ikonokat akarjuk egy táblázatunkban bizonyos státuszokhoz rendelni? És most itt akár az arcképünkre vagy bármilyen más képre is gondolhatunk, a következő kis módszerrel akármilyen képekkel végrehajtható módosításról van szó.
Adott tehát egy táblázatunk, amelynek az egyik, kisegítő sheetjére beszúrjuk azon képeket, amelyeket fel szeretnénk használni, az én esetemben ezek most képformátumú emotikonok:
A számok a képek mögött a státuszt jelentik, de ez akár lehet szöveg is, most azonban az egyszerűség kedvéért egy számos skálát alkalmazunk.
Van egy egyszerű kis táblázatunk is, amelyben megyénként kitűzött bevételi célokat, eredményeket és ez alapján kiértékelt státuszt láthatunk:
A feladat végrehajtása érdekében már kapásból kezdhetünk is egy segédoszlop beszúrásával. Erre azért van szükség, mert itt fogjuk meghatározni az adott cél-eredmény kombinációra vonatkozó státuszértéket (a fentebb említett skálának megfelelően). Ezt a következőképpen tesszük meg:
=MATCH((C2/B2)*100,{0,95,99,105})
A rendszeres Olvasóknak és gyakorlott felhasználóknak valószínűleg ezt már nem kell magyarázni, de röviden azt tesszük, hogy az eredményünket százalékosítjuk (ez lesz a MATCH függvény első paramétere, mint lookup_value), majd besoroljuk a második paraméterként megadott tartomány értékei alapján - így pedig a skálának megfelelő értékeket fogjuk visszakapni mindenféle százalék esetén. Értelemszerűen mondjuk 94%-os teljesítési aránnyal egyest kapunk, 100%-os teljesítéssel pedig hármast.
Ezután a Státusz oszlopba a segédsheetről másoljuk be ide az értéknek megfelelő kis képformátumú ikonunkat (de bármelyiket átmásolhatjuk, nincs jelentősége):
Majd rákattintunk és a Formulas Ribbonfül Defined Names szekciójában nevet adunk neki (Define Name), legyen mondjuk ez Status:
És itt jön az egész történet kulcsa, a korábban már itt is többször bemutatott INDEX-MATCH párosítás, amelyet hozzárendelünk ehhez az elnevezett elemhez:
=INDEX(HelpSheet!$A$1:$A$4,MATCH(Sheet1!$D$2,HelpSheet!$B$1:$B$4,0))
Ahogy azt már megtanultuk korábban, az INDEX egy megadott tömbben megadja a megadott sor és oszlop találkozásánál lévő értéket, MATCH pedig az első paramétereként megadott érték helyzetét fogja a második paramétereként megadott tartományból megadni nekünk (a harmadik paraméter a pontos egyezés, kisebb-nagyobb feltétel megadására ad lehetőséget).
Így értelemszerűen az INDEX függvényünk oszlop-paramétere a HelpSheet ikonokat tartalmazó A oszlopa lesz, az ezen oszlopból szükséges sor számát pedig a beágyazott MATCH eredménye adja - amely ugyebár az eredeti sheet Segédoszlopába kerülő státuszérték HelpSheet B oszlopában lévő sor száma lesz.
Azaz ha a státuszértékünk 3, akkor a HelpSheet A oszlopában a harmadik sorban szereplő ikont kapjuk vissza.
Ennek a trükknek azonban van egy óriási problémája, ami miatt túlságosan nem is javasolt belemélyedni - ez pedig az, hogy az adott sorba az alapikont mindig nekünk kell beszúrni, plusz minden egyes beszúrt ikonhoz nekünk kell definiálni a nevet és a hivatkozott formulát. Erre mondjuk VBA-ban lehetne kódsort összehozni, de annyira valószínűleg már nincs szükségünk customizált ikonok használatára.


Értelemszerűen ez a funkció az első paramétereként megadott számot összeszorozza a második paramétereként megadott számmal, majd az eredményt az aktuális cellába írja be.
Itt válasszuk ki a VBAProject könyvtárat a felső legördülő menüből:
Az itt felugró osztályok listájából értelemszerűen válasszuk ki a megfelelő funkciót majd a jobb gombbal való kattintás után felugró menüből válasszuk ki a Properties menüpontot:
Itt szépen megadhatunk egy kis leírást a funkciónkhoz:
Ha ezután pedig egy másik egyetlen soros makróval hozzáadjuk a funkciónkat valamelyik formula-kategóriához, akkor meg is fogjuk látni, hogy miért jó ez a leírás. A kis makrónk kulcsa a következő sor:
Ha szükség van rá, természetesen arra is van mód, hogy custom függvénycsoportot hozzunk létre. Mindenesetre mi most maradunk az egyszerűbb megoldásnál és a fenti makró lefuttatásával (akár indításhoz is rendelhetjük és így tovább), máris láthatjuk az Insert Function listában a "szorzas" névre hallgató funkciónkat és még a leírásunkat is megtaláljuk a párbeszédablakban:
Viszont arra, hogy custom funkciónkhoz felugró kis tippeket rendelhessünk hozzá, egyszerű megoldás nem áll rendelkezésünkre. Erre a kis sárga felugró ablakocskára gondolok:
Ha valaki mégis tud egy ilyen megoldást, bátran dobja be a közösbe, mert az általam ismert megoldás egy custom megoldás, azaz egy speciális add-int kell feltelepítenünk hozzá. De ettől független egyéb ötletek és kommentek jöhetnek bátran.
Maga a megoldás roppantul egyszerű lesz, egyetlen új dolgot kell hozzá megértenünk, méghozzá a CHOOSE függvény és a tömbök kapcsolatát. Hiszen ennek a formulának a legegyszerűbb felhasználási módját valószínűleg mindenki ismeri, de senki nem használja:
Tehát az I2 cellában megadott nevet megkeresi abban az ideiglenes, CHOOSE által megalkotott táblában, amelynek első oszlopa a név, második oszlopa pedig a város. Ugye milyen egyszerű?
Fontos észrevétel, hogy az összes érték kalkulált érték, tehát más cellák értékeivel végrehajtott műveletek után "érkeznek" meg a célcellákba. Ha ebből most megcsináljuk a legegyszerűbb vonaldiagramot az Insert Ribbonfül Charts szekciójából, akkor valami ilyesmit kapunk:
Látható, hogy amíg van értékünk, szépen haladnak a vonalaink, viszont az aktuális hónaptól kezdve a jövőt érintő időszak nullái simán leugranak a diagramunk aljára. A manuális kézzel történő frissítgetés nem elfogadható megoldás, hiszen bár a mostani kis mintatáblán ez nem tűnik nagy feladatnak, egy jóval komplexebb táblában már lenne vele szenvedés.
Persze az is elképzelhető, hogy alapból is lehet nulla a számított értékünk, ebben az esetben a dátummal való machinálást javasolnám, azaz a mai dátumhoz képest jövőbeni dátumok adjanak vissza #N/A-t.
Tehát ezek lennének a kötelezően illetve opcionálisan megadható paraméterek tömb- vagy referenciafüggvény felhasználás esetén:
A vessző után az options paraméter mezőre lépve szintén felugró listából kiválasztjuk, hogy pontosan mit hagyjon figyelmen kívül a függvény - ez lesz az options sorszáma:
Ezután dől majd el, hogy tömbfüggvény vagy szimpla hivatkozás irányába mozdulunk el, hiszen szimplán beadhatjuk azon tartomány hivatkozását, ahol az AGGREGATE függvényt használni szeretnénk, de például LARGE függvény esetén még azt is meg kell adnunk, hogy a sorban hányadik legnagyobb itemre vagyunk kíváncsiak, így értelemszerűen nem lesz elég a referenciafüggvény sorban megadott ref1, hanem az array, [k] megoldásra lesz szükségünk, ahol [k] a nagyság sorrendjében elfoglalt helyezés lesz.
Ahogy látható is a képeken, az eredeti függvények egyszerű felhasználásával esélytelenek vagyunk, viszont AGGREGATE bevetésével mind a 19 függvényt működésre tudjuk bírni - lehet persze IF és ISERROR felhasználásával más megoldást is kitervelni, de a rejtett sorok és hibák ennyire egyszerű és hatékony megoldásánál nem nagyon látok jobbat formulák terén.
Ha nem szeretnénk használni az Insert Ribbonfül beépített Hyperlink funkcióját, akkor arra is van módunk, hogy az Excel-fájlon belül hivatkozzunk mondjuk egy másik sheet egyik cellájára az előbb már idézett Hyperlink formulával. Itt jön képbe a sokszor zavart okozó # karakter, amely a Hyperlink formulában megmutatja a programnak, hogy "házon belül" fogunk linkelni. Azaz példánknál maradva:
Teljesen ugyanezzel a módszerrel tudunk egy nevesített tartományra is lépni:
VBA-val majdnem ugyanilyen egyszerű a történet, hiszen simán írhatunk rá egy apró kis kódsort, ugyanis ennyi lenne az egész:
Sokkal akkor sem bonyolultabb a dolog, ha egy Excel-munkafüzet összes sheetjének összes linkjét szeretnénk eltávolítani, hiszen akkor minden ciklusok egyik legegyszerűbbjére van szükségünk, valami ilyesmire:
Ha megcsináljuk az Insert Ribbonfül PivotTable parancsával, akkor a következőt tapasztaljuk:
A Home fül Styles szekciójában található Cell Styles menüpont Hyperlink stílusa segítségével kinézetre linkké tudjuk alakítani:
De ez így még mindig nem kattintható. Egy egyszerű VBA-kódra lesz szükségünk, hogy ez működjön, szóval ALT+F11 lenyomásával lépjünk gyorsan a VBA-editorba, majd a Pivot-táblát tartalmazó sheetünkön felépítünk egy egyszerű kódot.
Deklaráljunk két változót. Az első egy PivotField típusú változó lesz, ami a Pivot-táblánk mezőit hivatott majd tartalmazni, a második pedig azt mutatja majd meg, hogy éppen melyik mezőt akarjuk ellenőrizni a táblában. Ez utóbbit egyébként fel is tudjuk tölteni, hiszen értelemszerűen az "Oldal" mezőit szeretnénk validálni:
Ezzel pedig el is készültünk, a stílust alapból átállítottuk Hyperlink-kinézetre, a kis kódunkkal pedig a link kattinthatóvá is válik.
Helyette szimplán már csak ennyit látunk:
Aki használ beállított mozgatási szabályokat vagy régebbi leveleket már nem tárol az Inboxában, azok számára ez nem okoz problémát, de aki nem így tesz és nem volt erre felkészülve, annak igazából workaround megoldás után kell néznie, mert ahogy olvastam, a Microsofttól elvileg várható egy fix kiadása, ami visszahelyezi majd a korábbi verziókból megismert linket, de ez még a kanyarban sincs.
Itt a saját mailboxunkon állva válasszuk a Change menüpontot az E-mail fülről:
A felugró ablakban pedig a Use Cached Exchange Mode boxba tegyünk pipát (ha még nem lett volna, de elvileg defaultban ott van), majd a Mail to keep offline csúszkát húzzuk fel Allra, azaz az összes, Inboxban lévő levelünket letöltve, saját gépen tároljuk.
Nagy tárhelyigényre lesz hozzá szükség (főleg ha az egész családi fotóalbumot itt tároljuk), de vagy ezt választjuk vagy megpróbáljuk elkerülni a régi levelek bejövő postafiókban történő megőrzését.
Természetesen a fentiek csak saját elmélkedések, így ha esetleg van valakinek jobb ötlete vagy javaslata, ne habozzon megosztani.
Ha ez megvan:
Akkor ismét menjünk vissza a Shapes menübe, majd ezúttal egy elnyújtott téglalap-formát szúrjunk be:
Valahogy így:
Ha ez megvan, akkor szimplán CTRL+C és CTRL+V lenyomásával másoljuk le ezt az elvékonyított kis téglalapot, majd a Format Ribbonfül Arrange szekciójának Rotate menüjében állítsuk a dőlési szöget 15%-ra:
Ezt egészen addig ismételgessük a dőlési szög 15 százalékkal történő folyamatos növelésével, amíg el nem jutunk ehhez:
Ezt most jelöljük ki, majd másoljuk le:
Az egyik formát teljesen kijelölve lépjünk a Format Ribbonfül Insert Shapes szekciójában található Merge Shapes menüre, majd válasszuk ki a Subtract típust:
Tehát valahogy most így állunk.
Ezúttal a másik formánkat jelöljük ki, majd térjünk vissza az előbb már említett Merge Shapes menühöz, ám ezúttal a Fragment típust válasszuk:
A töredékesítés után ha kijelölnénk a formánkat, valami ilyesmit látnánk:
De most erre nincs nagyon szükségünk, amit tennünk kell az az, hogy a státuszunknak (feltöltendő színünknek) megfelelő mértéket kijelölünk a Fragmentált formánkból, majd lemásoljuk és áthelyezzük a másik forma mellé:
A körív nagyobb formáit leszámítva az összes többit kijelöljük majd töröljük:
Ha ezzel megvagyunk, valahol itt tartunk:
Ezután már csak színeznünk és forgatnunk kell a formákat, majd összeillesztve őket megkapjuk az eredményünket:
De még nem is kell hibára gondolnunk, simán megtörténhet, hogy egyszerűen azokhoz a cellákhoz vagy nincs adatunk, vagy tényleg valamilyen különös okból kiugró eredményünk van - amit elemeznünk kell tovább, mindenesetre valóságosabb átlageredményt szeretnénk kimutatni.
Tehát van két igen fontos tudnivaló a TRIMMEAN-ről és ezen tudnivalók egyébként be is határolják alkalmazási lehetőségeit:
Az első paraméter az a tartomány, ahol átlagolandó számaink szerepelnek, a második paraméter a kritérium tartománya, azaz itt akár már városaink nevére is írhatnánk feltételt, a harmadik kötelező paraméter pedig maga a kritérium - a többi pedig opcionális, feltételeink számától függően.
És hát nem kell se programozónak, se tapasztalt VBA ismerőnek lenni ahhoz, hogy a fenti alapján lássuk a TRIMMEAN VBA-verzióját:
Azoknak persze, akik egész nap gyűrik a VBA-t és az Excelt, valószínűleg a fenti poszt minimális hozzáadott értékkel sem bír, de ha valakinek sikerült kicsit segíteni bármilyen feladatban vagy akár gondolatébresztőként volt segítség, már megérte.

Tehát ezt a formát fogjuk a felhasználóktól egy üzenet küldésével egyidőben elzárni, megakadályozzuk, hogy hozzáférjen bárki és módosítani tudja akár szándékosan, akár véletlenül.
Ezt egy az egyben helyezzük az előbb beszúrt formánkra:
A beszúrt Labelre jobb gombbal kattintva előugró menüből a Propertiest válasszuk, majd a Label két tulajdonságát módosítsuk. Az egyik módosítás a Caption kitörlése legyen, a másik pedig a BackStyle Transparent típusúra történő átállítása. Ha ezeket megtettük, látjuk is nagyjából az eredményt, nyoma sincs a formánkra illesztett Labelnek.
Ha a most már nagyjából láthatatlannak számító Labelre duplán kattintunk, akkor a VBA-editorba kerülünk, ahol a Click eseményhez tudnánk kódot rendelni. Nekünk most erre nincs szükségünk, viszont ha az esemény típusát átállítjuk MouseMove-ra, akkor a Label fölé húzott kurzor esetén indíthatunk el egy kódot:
Rengeteg lehetőségünk van, a példa kedvéért most egy szimpla MsgBox utasítással kiíratok egy üzenetet a felhasználónak:
Ezután már látjuk is, hogy mi történik, ha a forma (valójában pedig a Label) fölé húzzuk az egeret.