Általánosságban ha azt akarjuk megtudni, hogy dokumentumunkat (most a példában Excel-fájlról lesz szó, de ugyanez működik más Office-programoknál is) ki és mikor frissítette utoljára, akkor el sem indítjuk magát a programot, hanem kattintunk jobb gombbal a fájlon, kiválasztjuk a Properties menüpontot, majd a Details fül alatt láthatjuk a minket érdeklő információkat.
De ha esetleg ezt nehézkesnek tartjuk, akkor egy alig néhány soros makró segítségével szinte bármilyen információ (köztük az utolsó mentés dátuma mondjuk) megjelenítésére felhasználhatjuk az Excel Title Bart, a sort, ahol alapesetben csak a fájlunk neve látszik:
Alt+F11 lenyomásával ugorjunk is a VBA-editorba, ahol a Workbook objektumhoz szúrjuk be majd a Workbook Open eseményéhez tartozó kódunkat:
A pár soros makróhoz mindössze két, eddig még nem ismert objektumot illetve tulajdonságcsoportot kell megismernünk, ezek közül az első a Window objektum vagyis a Windows objektumcsoport, amely a Workbook objektum esetén az összes adott munkafüzeten belüli ablakot kezeli, tehát a ThisWorkbook.Windows(1) az első nyitott ablakra mutat. Ennek aztán van bőven tulajdonsága, ezek listáját megtalálhatjuk a Microsoft hivatalos oldalán példákkal együtt: ilyen például a WindowState amellyel teljes képernyőre tudjuk tenni a munkalapunkat vagy a Visible, amivel láthatóvá példának okáért. Minket azonban most a Caption érdekel, ugyanis ez a tulajdonság a Title Bar szövege.
Ezzel a kód első fele meg is van, hiszen ThisWorkbook.Windows(1).Caption utasítást kell majd egyenlővé tennünk a fájl nevével illetve az utána megjelenő, általunk akart információval.
Megint csak irány a Microsoft hivatalos oldala, ahol nagyon könnyen rálelhetünk a Workbook.BuiltinDocumentProperties tulajdonságra, amelynek segítségével legalább több tucat információt megtudhatunk dokumentumunkról, a teljes igénye nélkül például a nevét, utolsó nyomtatási dátumát, a teljes szerkesztési időt, az oldalszámot, a kategóriát és többek között az utolsó mentés dátumát is.
Eddig itt tartunk a kódban:
Azaz a munkafüzet megnyitásakor az alap Title Bar legyen egyenlő az alap Title Barral plusz ehhez fűzzük hozzá most a kért információt, ami nem más mint a fentiek alapján a ThisWorkbook.BuiltinDocumentProperties tulajdonságcsoport Last Save Time tulajdonsága.
Ha most bezárjuk és mentjük a doksit, majd újra megnyitjuk, már látjuk is az eredményt:
Hangsúlyozom, hogy ismét ne a konkrét példánál ragadjunk le, hanem annál, hogy a Windows objektumcsoport tulajdonságaival illetve a BuiltInDocumentProperties csoporttal mennyi minden elérhető még.
Jelöljük ki, majd jobb gombbal való kattintás után válasszuk ki az Edit Points funkciót, ami lehetővé teszi, hogy default formánkat mindenféle irányba és méretbe alakítgassuk:
Az Edit Points kiválasztása után valahogy így néz majd ki téglalapunk, a pontok mentén tudunk görbíteni, szélesíteni, elhúzni stb.:
Én most szimplán behullámosítom két pont elhúzásával a téglalapomat:
Mire mentem ezzel? Hát így önmagában semmire, ezért gyorsan készítek is egy szélességét tekintve az eredeti téglalappal megegyező méretű "magas" téglalapot:
Ebből eltávolítom a kitöltést és megvastagítom a körvonalakat (Format Ribbonfül alatt Shape Fill and Shape Outline):
Ezután következik néhány fontos lépés: elsőként a View Ribbonfül alatt található Show szekció Gridlines pipájának eltávolításával eltüntetem a táblázatkezelőm háttérvonalalait. Folytatásként az üres, nagy téglalapomba belehúzom a hullámosított eredetit, majd a jobb gombbal való kattintással előhívható Group funkció segítségével egyesítem őket. Nem maradt más hátra, mint hogy rádobjunk valamilyen információs szövegdobozt vagy feliratot és kész is:
Lássuk meg, hogy ez csak egyetlen kiragadott lehetőség volt, az Edit Points segítségével nagyjából a csillagos ég a határ, csinálhatunk félig tele poharat hullámzó vízzel, megcsinálhatjuk ezt körrel vagy háromszöggel is, de a színek és alakzatok hatalmas skáláját böngészve látható, hogy bőven tudunk még kreatívkodni.
Nem ez az egyetlen megoldás, amit most fel fogok vázolni, de ez bátran használható régebbi Excel-verziókban és PowerPivotban is, bár nem tartom kizártnak, hogy vannak még ilyen megoldások. Szóval első lépésként a Pivot-táblánkra kattintva megjelenő PIVOTTABLE TOOLS Ribbon-fülek közül az ANALYZE fülre kattintva a Calculations funkciócsoport Fields, Items, & Sets gombja alól a Calculated Field funkckiót hívjuk meg.
Vigyünk fel mondjuk egy Blank névre hallgató kalkulált oszlopot, amely mögött a formula legyen =0, de használhatunk más, üres vagy egyszerűen átalakítható eredményt hozó kalkulációt is.
Ha ezt hozzáadjuk a Pivot-táblánkhoz, akkor ugyebár lesz egy alapból Sum of Blank nevet viselő és csupa nullát tartalmazó oszlopunk, amelyet aztán jobb gombbal kattintva szépen meg fogunk formázni, elsőként a Number Format menüpont alatt:
Az oszlopunkban található celláink formátuma legyen Custom formátum, majd három pontosvessző megadásával érjük el, hogy teljes egészében (láthatólag) üres celláink legyenek:
Ezután a következő lépésben a szintén jobb gombos kattintás után előcsalogatható Value Field Settings menüből tüntessük el az oszlopunk nevét, ami legyen mostantól egy egyszerű szóköz például:
Aztán innentől kezdve már csak a fantáziánk szabhat határt, hogy mennyire akarjuk a beszúrt oszlopainkat formázgatni, alakítgatni, szóval a fentebb felvázolt, manuális megoldás csak az első lépés volt Pivot-tábláink még vizuálisabb megjelenítése felé.
Ötletek, javaslatok jöhetnek kommentben!
Már ránézésre egyértelmű az is, hogy mi itt a kérdés, simán keressük meg a megadott városhoz tartozó bevételi értéket a segédtáblában. Én most egyféle megoldást fogok felvázolni, de hozzászólásokban jöhet minden más javaslat is, hiszen ez tipikusan az a kérdés, ahol legalább féltucat függvényalapú megoldást el bírok képzelni (az egyebekről ne is beszéljünk).
És íme, az eredmény:
Na de mi is ezzel a probléma? Hát elég egyértelmű: kizárólag számokra használható, tehát ha mondjuk nem numerikus értékeink is vannak, akkor ez így már nem lesz jó - lásd a következő módosított példa:
De még mielőtt azonban erre is bemutatok egy lehetséges megoldást, hangsúlyozni kell, hogy egy ilyen jellegű probléma már nem mindennapos, az pedig, hogy formulával próbáljuk megoldani, még annál is ritkább, hiszen előbb alakítjuk "normál" módon kezelhető táblázattá vagy fordulunk VBA-hoz, minthogy függvények egybeágyazásán gondoljunk. Ettől függetlenül jó kihívás a gondolkodni vágyó elme számára egy ilyen probléma - lássuk is, hogy én mire jutottam.
Innen már nyílegyenes út vezet az oszlopszám meghatározásához, elég ismernünk a COLUMN függvényt, ami teljesen ugyanazt tudja, mint a ROW, csak oszlopokra, azaz oszlopok hivatkozásait adja vissza, tehát egy megadott celláról megmondja, hogy az hányadik oszlopban szerepel.
Ezzel pedig az egész történetnek a végére is jutottunk, hiszen ezt a két függvényt kell csak beágyaznunk egy INDEX formulába, amelynek első paramétere értelemszerűen a táblánk, második paramétere a SUMPRODUCT és ROW függvények felhasználásával készült sorszám, a harmadik pedig a COLUMN száma:
Works like charm!
A fenti definícióval egyébként meg is határoztam a feladatot: hogyan lehet egyetlen képlettel (VBA-val még egyszerűbb amúgy) meghatározni, hogy pontosan mennyi óra kerül elszámolásra? Ismétlem, a 8 óra feletti időtartam nem számít, ha viszont kevesebbet dolgoztunk, akkor a ledolgozott órák számítanak.
Ha pontosan akarjuk kiszámolni, láthatjuk, hogy így valójában csak 77 óra 38 perce kerül majd elszámolásra:
A probléma megoldása ott rejlik a manuálisabb, segédoszlopos megoldásban, hiszen azt a képletet kell összehoznunk egy cellába, ami az összes ledolgozott idő szummájából levonja az érintett sorok nyolc órán felüli részét.
A következő lépésben azt a kérdést kell megválaszolnunk, hogy hogyan tudjuk meghatározni egy tömbre vonatkozóan a tömb összes eleme és a 8 óra közötti differenciát. A TIME függvényt fogjuk bevetni, ami az első, második és harmadik paramétereként megadott óra, perc, másodperc értékeket alakítja számmá, azaz TIME(8,0,0) 0.33-at fog eredményül adni, hiszen ez pont egy nap harmadrésze. Minden egyes sor esetében ebből a meghatározott számból vonjuk ki az aznapi ledolgozott időt (tehát tömbfüggvényként fogjuk kezelni ezt a formulát) és ha ez a különbség kisebb, mint nulla, akkor TRUE, ellenkező esetben FALSE értéket dobjon vissza. CTRL+SHIFT+ENTER lenyomásával tömbfüggvényként használjuk.
TRUE értéket látunk majd a tömbben ott, ahol 8 óránál többet dolgozott az illető, FALSE értéket pedig ott, ahol kevesebbet.
A SUMPRODUCT függvényt most azért fogjuk bevetni, hogy összeadjuk ezeket a differenciákat a tömbben, majd az egész eredményt szépen hozzáadjuk az eredeti ledolgozott idő összegünkhöz. Azért hozzáadjuk, mert a SUMPRODUCT összegzésünk eredménye egy negatív szám, ergó ha kivonnánk, akkor a -- okán hozzáadnánk, ami nem a valós eredményt tükrözné, hiszen duplán elszámolnánk a többletmunkát. A helyes eredmény tehát:
Jelöljük ki mondjuk az ötös sort és jobb gomb lenyomása után a menüből válasszuk a Cut (Kivágás) funkciót:
Szépen el is kezd a villogó keret futkározni a sorunk körül:
Kattintsunk a hetes sorra majd a jobb gomb ismételt lenyomása után illesszük be a kivágott sorunkat (Insert Cut Cells):
Meg is történik a csere:
Ezután nyomjunk egy Undot, hogy visszalépjünk egy lépést a történetben:
Oppá, nem történt semmi!
Nyomás az Excel Optionsbe, ahol a legelső, a General fül alatt, legalul a Start up options szekcióban találjuk a megoldást, a Show the Start screen when this application starts opciónál kell kivennünk a pipát:
A szűrő beszúrása után lenyitjuk a lehetőségek kis ablakát, ahol a megszokott opciókat láthatjuk, de mi most ezeket hagyjuk és menjünk a Text Filters alatt található Custom Filter menübe:
És itt látjuk is a fentebb már említett funkcióleírást, kérdőjelek használatával a karakterszámra tudunk szűrni - annyi kérdőjelet használjunk, ahány karakterről beszélünk, lehet egyenlőséget vagy akár kisebb-nagyobb feltételt is megadni.
Csillag használatával pedig karaktersorozatokat tudunk helyettesíteni, ergó töredékekre is tudunk szűrni, azaz például olyan szavakra, amelyek tartalmazzák az "office" szócskát mondjuk.
Ha megvan:
Akkor már csak használni kell, jelöljük ki azt a tartományt, amit le szeretnénk fényképezni, majd kattintsunk a kis fényképezőgép ikonra:
Ezután pedig már csak azt kell meghatározni, hogy hova illesszük be az elkészült fényképet, amit aztán méretezhetünk, formázhatunk és mozgathatunk.
Mire használhatjuk? Alapvetően én eddig főleg dashboardoknál használtam, ahol például egy legördülő menüből kiválasztott lehetőség alapján jeleníthettük meg a kis képünket, de egyszerű vizualizációra is használható eredmények prezentálásakor. Sőt akár ennek segítségével az egyébként elég küzdelmes úton kinyomtatható anyagokat is be tudjuk egyetlen lapra varázsolni. Ha esetleg valakit bővebben érdekelne a Camera funkció, az jelezze kommentben és szentelek neki egy külön posztot.
Jobb gombbal kattintás után a View Code menü kiválasztásával a VBA-editorba jutunk, ahol a gombra kattintás eseményéhez fogunk egy kódot rendelni.
A már azért sokak által valószínűleg ismert Documents.Open metódussal kezdünk, amely után első és egyetlen kötelező paraméterként a FileName paramétert használjuk a fájlunk nevével és elérési útjával, ezzel fogjuk elérni a fájl megnyitását:
Ahogy látható ebből a rövid kis kódrészletből, a Find objektumnak aztán van bőven tulajdonsága, a Text értelemszerűen megkeresi a Lafayette szócskát a szövegünkben, a Replacement.Text lecseréli ezt OfficeGurura, de hogy ez ténylegesen meg is történjen, az Execute metódust is használnunk kell, ami lefuttatja a keresési-cserélési műveletünket.
Ennek is van jópár paramétere, például a Replace paraméter azt határozza meg, hogy az összes találatot cserélje-e (wdReplaceAll) vagy sem vagy mondjuk a Forward, ami a keresést folytatja tovább a dokumentumban a következő találatig.
A Ribbonunk Insert füle alatt található Illustrations szekcióból a Shapes menüpont segítségével szúrjunk be egy téglalapot:
Aztán a Format Ribbonfül alatt szépen formázzuk meg ezt a téglalapot, a keretét, a háttérszínt stb.:
Ezután ugyanúgy a Shapes menüpontból szúrjunk be egy kört:
Formázzuk meg és helyezzük el a téglalapra úgy, ahogy szeretnénk, írjunk hozzá szöveget és értelemszerűen a Shape Properties alatt állítsuk be, hogy egyéb cellák méretének állítása ne változtassa formáink méretét:
Ezután kattintsunk jobb gombbal a kis körünkre (ami innentől kezdve már gombként fog majd funkcionálni) és rendeljünk hozzá egy makrót a kattintás eseményre:
És ezzel át is jutottunk a Visual Basic Editorba, ahol elvégezzük a szükséges kódolást, hogy elérjük, amit szeretnénk:
Alapvetően elég egyszerű az a terv, amit most végre fogunk hajtani, hiszen egyrészt a gombra való kattintás esetén megvizsgáljuk, hogy van-e szűrés a táblánkon, ha nincs, értelemszerűen szűrünk és elmozdítjuk a körünket plusz megváltoztatjuk a színét. A másik irányban pedig nagyjából ennek az ellenkezőjét tesszük.
Ne felejtsük, hogy még mindig az If műveletben vagyunk, az előbb vizsgáltuk, hogy mi történjen ha nincs bekapcsolva semmilyen Filter, most azt nézzük meg, hogy mi történjen, ha már be van kapcsolva.
És kész is vagyunk, próbáljuk ki működés közben:
Ahogy látható, ez egy roppant egyszerű kis példa volt, aminél biztos, hogy létezik jobb megoldás is, de remélhetőleg sokak számára ez jó kiindulási alap lehet egy jóval fejlettebb dashboard elkészítéséhez.
Szóval mi az első, amire bárki gondolna egy ilyen kérdés kapcsán?
2. GESTEP
3. SUMPRODUCT
4. AND
5. VBA
Ezután már csak a ciklusunk van hátra, azaz jelen esetünkben a harmadik sorunktól kezdve az utolsó sorunkig elvégezzük azt a vizsgálatot, hogy minden sorban összehasonlítjuk a március és február oszlopokat és amennyiben március a nagyobb, akkor egyet írunk a meghatározott (most I) oszlopba, egyébként pedig 0-t.
Ha ezt lefuttatjuk (rendelhetjük gombhoz, eseményhez, amit csak akarunk), akkor meg is kapjuk azt az eredményt, amit más úton is elértünk már.
Én eddig jutottam a lehetőségek halmazában első gondolattal, de valószínűleg csak a felszínt kapargattam. Szóval milyen egyéb lehetőségeink/módszereink vannak még, amivel ugyanezt az összehasonlítást el tudjuk végezni?