Aki csinált már feladat- vagy akár ötletlistát Excelben, abban biztos felmerült már olyan igény, hogy egyes cellák/oszlopok tartalmát ne kézzel kelljen a felhasználóknak kitölteni, hanem mondjuk legördülő menükből választható legyen az adott feladat fontossága vagy éppen választható legyen mondjuk a dátum is, ne kézzel kelljen gépelgetni.
Az Office táblázatkezelője erre is kínál beépített megoldást, ami ugyan önmagában még nem teljesen tudja azt, amit szeretnénk, de a következő kis posztban bemutatok egy verziót arra, hogy lehet ezt szépen működésre bírni.
Több módon és formában is megvalósítható a dolog és mivel előfordulhat, hogy bizonyos ActiveX-vezérlők nem érhetőek el mindenki gépén, ezért maradjunk egy default verziónál, amelynek mintájára bármilyen vezérlővel meg tudjuk ezt csinálni.
Első lépésként a Ribbonunk Developer füle alatt a Controls szekcióban található Insert parancs segítségével szúrjunk be egy ActiveX-vezérlőt a munkalapunkra, méghozzá a More Controls apró ikonja alatt található listából egy olyat, ami naptár- vagy éppen idővezérlőként funkcionál.
Ha valakinek a listában ott van a Microsoft Date and Time Picker Control, akkor használja azt, hiszen az a legjobb erre a célra, de a tapasztalatom azt mutatja, hogy ez a vezérlő nem elérhető mindenki számára (a Microsoft oldaláról letölthető egyébként a kapcsolódó OCX), ezért maradjunk egy olyannál, ami biztosan használható bárki számára, így én most a poszt első részéhez a Calendar Controlt választom.
Szúrjuk be, formázgassuk, méretezgessük, én maradok egy egyszerű verziónál most:
Ahogy látható, van egy naptárunk, amiből választhatunk, illetve van egy mezőnk, ahová majd a naptárból kiválasztott dátumot töltjük későbbi felhasználás céljából.
Innen már csak két lépésünk van hátra, először a Ribbonunk Developer füle alatt lévő Controls szekcióban található Design Mode-ot be kell kapcsolnunk, majd a naptárunkra jobb gombbal kattintva elérhető válik a Properties menüpont.
Itt pedig már csak annyit kell tennünk, hogy a Linked Cell utasítás segítségével a vezérlőnket összekötjük a dátumhoz kitalált kis cellánkkal:
És működik is, úgy ahogy szerettük volna.
Ez a felvázolt verzió nem fog működni egy listában önmagában, egyrészt mérete szerint sem, másrészt pedig egy cellát tudunk csak linkelni, de a koncepció szerintem követhető volt - viszont a fentebb már említett Microsoft Date and Time Picker controlja pontosan olyan, amit egy cellába tudunk legördülő mezőként beszúrni és onnantól kezdve tökéletesen alkalmazható listás célra a fentebb felvázolt módszerrel.
Egyszerűen válasszuk ki a Date and Time Picker Controlt, majd a beszúrt és megfelelően formázott kis legördülő menünkhöz ugyanúgy hozzá kell rendelni a megfelelő cellát, ahogy az előbb a Calendar controlnál már mutattam:


Ha esetleg valaki szeretné ezt a vezérlőt feltelepíteni, az is roppant egyszerű:
1. Töltsük le a Microsoft oldaláról az mscomct2.ocx-et
2. Másoljuk be a C:\Windows\SysWoW64 könyvtárunkba (64-bites Windowsunk esetén)
3. Majd a Commant promptból futtassuk le a regsvr32.exe mscomct2.ocx parancsot
Itt rengeteg beállítási lehetőségünk van postafiókunk kinézetét illetően, itt tudunk beállítani szűréseket, itt tudunk oszlopokat hozzáadni vagy eltávolítani és igen, a Conditional Formatting menü alatt bizonyos típusú leveleket bizonyos feltételek esetén úgy formáz nekünk, ahogy szeretnénk:
És igen, itt tudjuk beállítani azt is, hogy olvasatlan üzeneteink, hogy nézzenek ki, milyen formátumban jelenjenek meg, de itt egyéb típusú leveleinknek is extrább kinézetet tudunk kölcsönözni, ha akarunk.
Megint egy másik megoldás az lehet, ha a fentebb beszúrt printscreenen is látható View Settings menüből az Other Settings almenüt választjuk, majd itt a Message Preview szekcióban szimplán csak a Font színét kell átállítanunk.
Első lépésként a Ribbonunk Insert fülének Charts szekciója alól szúrjunk be mondjuk egy egyszerű vonalas pontdiagramot:
Kicsit formázzuk meg a tengelyeink értékeit, távolítsuk el például a segédvonalakat, de tényleg mindenkinek a saját képzeletére van bízva, hogyan tupírozza fel a kis grafikonját:
Ezután én szimplán beszúrtam egy oszlopot a táblázatunk mögé, Átlag címszóval és ebben az oszlopban minden cellába az AVERAGE függvény felhasználásával értékeink átlagát fogom beírni:
Ha ezzel megvagyunk, akkor jelöljük ki a diagramunkat egy egyszerű belekattintás segítségével:
Lépjünk a Ribbonunkon megjelent Chart Tools fülek közül a Design alatt található Data szekcióba, ahonnan a Select Data paranccsal hívjuk elő az ábránk alapadatait megmutató kis ablakot:
És itt a Chart data range mező alatt bővítsük ki diagramunk adatterületét a pluszban hozzáadott Átlag oszloppal is:
Nincs más hátra, mint a legtöbb diagram lelkének számító formázgatás, én például a mostani esetben eltávolítottam a markereket a vonalamról, megvastagítottam, kicsit módosítottam a címen, de bármit megtehetünk, amiről úgy gondoljuk, hogy a jobb eladhatóságban a segítségünkre lehet.
Most tekintsünk el azoktól az egyszerű, többlépcsős megoldásoktól, mint hogy végzünk egy kivonást, maximalizáljuk a különbséget és bekeressük a hozzá tartozó városnevet, hiszen értelemszerűen a leggyorsabb utat keressük (hangsúlyozom, a most taglalt megoldási javaslatnál is lehet egyszerűbb út).
Következő lépésben kell megkeresnünk, hogy ebben az új tömbben, melyik a legnagyobb érték, itt kell majd a MAX függvényt használnunk:
Ezután ha visszagondolunk a fentebb leírt MATCH definícióra, akkor láthatjuk, hogy a következő lépésünk az lesz, hogy a MATCH segítségével meghatározzuk a maximum értékünk helyzetét az abszolútérték-különbségeink tömbjében:
Innen pedig már csak egy INDEX formulára lesz szükségünk, hiszen ezzel az eredeti tömbünk városnév oszlopából kell visszakapnunk az előbbi tömbfüggvénnyel meghatározott sorszám szerinti értéket, azaz:
És láthatjuk is, mi a megoldásunk. Bárkinek van más ötlete, javaslata, VBA-kódja a témában, szívesen látom!
Mi történik, ha szimplán =A1+A2+A3-ként összegezzük?
Nem kérdés, az eredmény kettő lesz, hiszen két TRUE és egy FALSE értékünk van.
Bár nem erre számítanánk, defíníció szerint nem kétséges, hogy az eredményünk nulla lesz, hiszen a SUM függvény leírása szerint, ha tömböt összegzünk, csak a számok vagy az arra való hivatkozások kerülnek összesítésre, a logikai értékek, szövegek, hibaüzenetek természetesen nem.
Na de mi történik, ha VBA-ban próbáljuk összehozni az eredményt? Menjünk át a VBA-editorba és szúrjunk be egy új modult - ebben fogunk gyorsan egy szumma funkciót definiálni.
Most tehát nem szubrutinról van szó, hanem funkcióról szó, ezt ne feledjük. Definiálunk tehát egy funkciót (legyen a neve SAJATSZUMMA), amelynek paramétere a tartomány lesz, amit összegezni szeretnénk:
Mielőtt továbbolvasna bárki is, azt javaslom a VBA-ban kevésbé járatos Olvasóknak, hogy próbálkozzanak meg ezzel saját maguk, hiszen alapvetően nem komplikált kódról van szó. Szóval szükségünk lesz egy cell névre hallgató változóra, amit Range típussal definiálunk, hiszen tartományokat fogunk összegezni, illetve még arra is szükségünk lesz első lépésként, hogy SAJATSZUMMA funkciónk/formulánk kezdőértékét nullára állítsuk:
Ezután már csak egy For..Next ciklusra van szükségünk, ahol meghatározzuk, hogy minden egyes cella esetében a paraméterként megadott tartományunkban hajtsa végre az adatok összegzését, valahogy így:
SAJATSZUMMA funkciónk eredménye tehát nulláról indul, majd ehhez hozzáadja tartományunk első cellájának értékét, majd ahhoz a következőt és így tovább, tehát alapból ez egy jól működő funkció lesz.
Az eredmény mínusz kettő lett! A Microsoft leírása azért nagyjából megmagyarázza ezt a furcsaságot is, elsőként persze hangsúlyozva, hogy Boolean értékeket nem igazán célszerű számként használni/összegezni. A lényeg viszont az, hogy alapesetben ha nem konvertálja az ember ezeket az értékeket, akkor a False 0, a True pedig -1 értékkel kerül majd összegzésre.
De akkor miért van benne a BAHTTEXT? Sokan sokféleképpen gondolkodnak erről, de több bennfentes is utalt rá, hogy valószínűleg az Excel programozói voltak oda a thai kajáért és ennek a funkciónak a kidolgozásával igyekezték saját rendeléseiket megkönnyíteni. Aki nem hiszi, járjon utána...
De akkor hol és mire használhatják ezt napi rendszerességgel? Ha nem is rendszeresen, de bizonyos esetekben, ha valamiért Excelben szeretnénk felvázolni a normális eloszlású adataink görbéjét egy koordináta-rendszerben, akkor a megfelelően elegáns görbe kialakításához értelemszerűen a görbe alatti területet is pontosan kell meghatározni - ez pedig alapesetben PI négyzetgyöke lenne. És itt jön be majd egy-két szorzás is a képbe a megfelelő ív kialakítása érdekében, azaz elképzelhető, hogy a SQRTPI is kapóra jön nekünk.
Ezt előcsalogathatjuk a Windows + Shift + S billentyűkombináció lenyomásával is, majd a képet a vágólapra vagy akár egy jegyzetbe (én így hívom a OneNote által készíthető Note-okat) is be lehet illeszteni. 
3. Rendkívül hasznos funkció (hangsúlyozom, a fentieket és ezt is tudja más tool is, de ettől függetlenül ajánlatos barátkozni a OneNote-tal) a képekből a szöveg kinyerését egyszerűen lehetővé Copy Text from Picture funkció, amelyet a szöveget tartalmazó képen jobb gomb lenyomása után tudunk előcsalogatni:
4. Megbeszéléseken sokan WORD-ben, draft e-mailban jegyzetelnek, de a OneNote erre is kínálhat alternatívát, hiszen Outlookból meghívható a OneNote jegyzete:
És ide, már beütemezett megbeszélésnél bekerül az időponttól, helyszíntől kezdve a résztvevők névsoráig minden, amit tudni kell róla, utána pedig ezt már jóval könnyebb felhasználni egy megbeszélés összefoglaló elkészítéséhez.

Írjuk be a kiválasztott Time formátumban, hogy pontosan mennyiről szeretnénk visszaszámolni - 1 óra, 1 nap, 1 hónap stb.:
Ezután nyomás a VBA-editorba, ahol az itt már korábban leírtaknak megfelelően szúrjunk be egy új modult az Insert menü Module parancsa segítségével:
Mielőtt összedobnánk ezt az aprócska kódot, két fontos parancsot jegyezzünk meg magunknak, mert ez a kettő fog segíteni ennek a makróban az összehozásában. Az egyik a TimeSerial funkció, ami nem tesz mást, mint a paramétereiként megadott óra, perc és másodperc értékek alapján visszaad egy időpontot, például
Ahogy látható, változónk neve az Ido (hibát követtem el, hiszen igencsak nem célszerű szubrutinunknak és változónknak ugyanazt a nevet adni, de most már így marad), ezt Date típussal deklaráltuk, majd az itt már többször átbeszélt módon feltöltöttük jelen pillanatunk idejével plusz egyetlen másodperccel. Jelen pillanatunkat a Now paranccsal határozhatjuk meg, ami visszaadja az adott időpillanatot, ehhez pedig hozzáadunk 1 másodpercet. A TimeValue alkalmazására kódunk második részlete miatt lesz szükség, hiszen az Application.Ontime Now +Timevalue (meghatározott időparaméter) azt fogja meghatározni, hogy az ezután megadott szubrutin mennyi idő eltelte után fusson le, azaz kódunknál maradva az
Második szubrutinunkról már tudjuk, hogy a "Visszaszamlalo" nevet viseli és ez nem fog mást csinálni, mint megadott I8 cellánk értékét módosítja másodpercenként. Ehhez először deklaráljunk egy változót Range típussal, ebbe fogjuk beállítani majd kezdőértékként azt a cellát, ahol a visszaszámlálónk fut majd:
Utolsó lépésünk pedig már csak annyi, hogy eme szubrutinunk végén indítsuk el/hívjuk meg a másik szubrutint, hogy jól működjön a visszaszámlálás. Más szubrutinokat a Call parancs segítségével tudunk meghívni.
Maga a kód nem bonyolult és a felhasználási területek is elég szűkösnek tűnnek, de a lényeg, hogy tanuljunk belőle és ha már van fogalmunk az időkhöz kapcsolódó parancsok egy részéről, már el tudunk indulni ilyen kódokkal is.
2. Ha gyakran vagyunk kénytelenek mások dokumentumait felülvizsgálni, ellenőrizni, akkor a formátumok (kövérítés, döntés stb.) eltávolítása fontos lehet és bár a Ribbonról is elérhető a Clear Formatting opció, gyakoriságtól függően érdemes lehet a Toolbarhoz hozzáadni a Clear Formats parancsot.
3. Jómagam elég sokszor használom pdf-olvasóként a szövegszerkesztőt és esetenként mentek is pdf formátumban - ha más is van ezzel így, akkor két opciója van: az egyik a Save as Pdf Add-in feltelepítése (és így a Save as Pdf custom parancs megjelenítése a Toolbar parancsai között), a másik pedig a Save as Other Format parancs hozzáadása a Toolbarhoz.
4. Megelőzendő és megválaszolandó az esetleges megjegyzéseket, igen, az előbb említett pontok és egyáltalán, a default Quick Access Toolbar parancsok is előhozhatók billentyűkombinációkkal, de ha sok parancsról beszélünk, akkor nem mindig sikerül mindent észben tartani - azokról az esetekről ne is beszéljünk, amelyeknek pedig nincs is billentyűkombinációja. Ilyen például a Style Inspector parancs, amely bármikor bármelyik szövegrésznél megadja az adott szöveg stílusát.
5. Ha valaki igényli, az olyan alapparancsokat is hozzáadhatja, mint az Open, Save és társai, ezekről most is nem is tennék említést, viszont az általam egyik leggyakrabban használt Quick Access Toolbar parancsról, a Paste Special as Values parancsról igen, amelynek hozzáadását mindenkinek csak ajánlani tudom.
7. A Paste Special as Values parancsnál már írtam a használat gyakoriságáról, ugyanígy igen sűrűn használom a Document Location parancsot, amivel nagyon könnyen meg tudjuk határozni, hogy az adott doksink éppen hol található a könyvtárstruktúránkban - és ez bizony sokszor tényleg elég nagy kihívás egy ilyen kis segítség nélkül.
9. Utolsóként pedig inkább csak érdekességként jöjjön a Who Is parancs, amelyet szintén hozzáadhatunk a Quick Access Toolbarhoz, ennek segítségével a szövegünkben szereplő nevekre kereshetünk az Outlook kontaktlistájában és találat esetén már olvashatjuk is az adott kontakt adatait, telefonszámát stb.. Lehet nélküle élni, de ez is spórolhat néhány kattintást.
Most a Ribbonunk Home füle alatt található Defined Names szekcióból, a Name Manager segítségével hozzunk létre két elnevezett tartományt a két táblánkra:
Történik valami, ha most elkezdünk zoomolni és mondjuk kicsinyítjük vagy nagyítjuk a munkalapunkat? Alapvetően legtöbben úgy gondolnánk, hogy nem, hiszen mondjuk 50%-ra kicsinyítve sem láthatunk semmi extrát:
Na de mi történik ha 40%-ra vagy az alá kicsinyítünk?
Bizony, jól látjuk, a táblázatkezelő megjeleníti az elnevezett tartományaink nevét a kis táblákon, ami igazából csak viccesnek nevezhető, hiszen nem nagyon látom be jómagam sem, hogy ez hol jöhet kapóra, de ha valakinek segít valamiben vagy csak egy mosolyt csalt az arcára - már megérte.