Aki már jó ideje gyűri a táblázatkezelők családjának legismertebb tagját, az Excelt, az biztosan találkozott már azzal az igénnyel vagy kéréssel, hogy egy meghatározott számsorozatból egy bizonyos végösszeget kiadó számokat kellett megadnia.
Az ilyen problémáknak több megoldási módszere is létezik, ezek közül a leginkább alkalmazott az valamilyen custom VBA-s megoldás, de az Excel újabb verzióinak már van erre beépített megoldása is a Solver személyében.
A Solver Add-Int egyszerűen, az Excel Options alatt tudjuk bekapcsolni:
Értelemszerűen az Options alatt az Add-Ins almenüre kattintunk.
Majd a felugró ablakban, ha a Solver még nem aktív, akkor a Manage Excel Add-Ins menü melletti Go gombra kattintva megjelenő Add-Ins ablakban tudjuk bekapcsolni. Ha ez megvan, akkor a Data fülön megjelenő új, Analysis szekcióban meg is találjuk a gombját:
Ha ezzel megvagyunk, már nézhetjük is a konkrét feladványt:
Elég egyértelmű mi a célunk, meghatározni azon számokat az oszlopban, amelyek a célszámunkat fogják pontosan visszaadni. A példa alapvetően egyszerű és nagyon gyorsan ki is található, mely számok adják ki az 1033-as végösszeget, de most nem ez a lényeg.
A Solveres megoldáshoz most két segédoszlopot fogok létrehozni, az egyiket Szorzó néven, a másikat Számok2 néven.
Utóbbi elég egyszerű tartalommal bír, a Számok oszlopban található számok és a Szorzó oszlopban található szorzók szorzata szerepel itt. A Szorzó oszlopban egyesek szerepelnek, a végeredmény meghatározásához van erre szükségünk, a Solver ugyanis ezen szorzókat fogja egyesnek meghagyni vagy átírni nullára, attól függően, hogy melyik számra lesz szükség a célszám meghatározásához.
A végeredmény eléréséhez még két segédcella kell majd nekünk:
A Teljes összeg értelemszerűen a Számok2 oszlop teljes szummáját mutatja, a Különbség pedig a Célszám és a Teljes összeg különbsége - a Solvert fogjuk megkérni arra, hogy a Különbséget vigye le pontosan nullára, azaz határozza meg azon számok halmazát, amelyek kiadják célszámunkat.
Most szépen kattintsunk a Solver funkcióra a Data fülön.
Ezt az ablakot kell kitöltenünk ahhoz, hogy a Solver megadja nekünk a megoldást.
Set Objective mezőbe írjuk, hogy melyik cellának akarunk célértéket megadni, jelen esetben ez most a Különbség cellánk, azaz G6 lesz.
Mit szeretnénk ettől a cellától? Hogy nulla legyen.
Hogy hozza ki a Solver ezt az eredményt? Értelemszerűen a "változó" celláink módosításával, azaz a Szorzó oszlopot adjuk be a By Changing Variable Cells mezőbe:
Ezután már csak ezen "változó" celláink értékeinek kell határokat szabnunk, tehát a Solvert terelgetnünk kell, hogy csak 0 vagy 1 értékeket használjon a Szorzó oszlopban.
Ezt három feltétellel fogjuk elérni, egyrészt definiáljuk, hogy a Szorzó oszlopban vagy 0 vagy annál nagyobb érték kell, hogy szerepeljen, azt is meghatározzuk, hogy csak 1 vagy annál kisebb érték lehet ezen cellákban és végül kikötjük, hogy csak egész szám kerülhet ide - azaz konkrétan 0 és 1 maradt a Solver számára. Ez így néz ki a Solver ablakában:
Ezután pedig már csak a Solve gombra kell kattintanunk és láss csodát, meg is van, hogy mely számokra van szükségünk az 1033-hoz:
És ehhez nem volt szükségünk VBA-tudásra, szimplán csak bekapcsoltuk a Solver Add-Int, ami ráadásul ennél sokkal-sokkal többre képes. De erről majd később.
Simplex LP megoldási metódus egy lineáris programozási feladat szimplex módszerrel történő megoldását jelenti, ezt használjuk akkor, ha elég egyértelmű a célunk és változóink.
Szépen illesszük be egy diára, majd ezt a diát a jobb egérgombbal előcsalogatható menü Duplicate Slide opciójával duplázzuk meg:
Ezután a duplikációnak számító diánk Insert Ribbonfülének Illustrations szekciójában található Shapes menüből szúrjunk be egy ovális formát:
Ezt a formát aztán szépen formázzuk olyan alakúra és méretűre, amekkora pont lefedi azt a területet, amit később majd zoomolni akarunk. Én most Avaruára fogok koncentrálni, így az ovális formám pontosan azt fogja lefedni:
Értelemszerűen a Format Ribbonfül Shape Fill és Shape Outline parancsainak felhasználásával távolítsuk el a kitöltésünket és vastagítsuk meg a körvonalat:
Ha ez megvan, akkor ismét az egész képet kell kijelölnünk, majd a megjelenő Format Ribbonfül alatt a Size szekcióban található Crop menü alatti kis nyílra kell kattintanunk és a Crop to Shape opciónál ugyanazt az ovális formát kell választanunk, amit fentebb megtettünk eredetileg:
Így nézünk most ki:
Menjünk szépen vissza a Format Ribbonfül Size szekciójába, ott is ismét a Crop menü alatt kis nyílra kell kattintanunk, majd az Aspect Ratiot 1:1-re kell állítanunk:
Ezután szép aprólékos munkával méretezzük rá a Cropot a már ott lévő fekete körvonalunkra. Fontos a pontosság, hiszen ha valahol kicsúszunk, akkor az később elég igénytelenül fog kinézni:
Ha szépen beméreteztük, akkor kattintsunk ki a képből valahova a dián és ezt fogjuk látni:
A megmaradt körvonalat és képet jelöljük ki, majd CTRL+X segítségével vágjuk ki a duplikált diáról és egy az egyben illesszük be az eredetire. Ezt fogjuk látni:
A kijelölést még mindig a most beillesztett körvonalon és képen tartva, kattintsunk az Animations Ribbonfülre:
Ezután először csak a fekete körvonalat jelöljük ki, majd az Entrance szekcióból szúrjunk be rá egy Wheel típusú animációt:
Ha ez megvan, akkor ugyebár az történik majd kattintásra, hogy a prezentációnkban ezen a dián Avarua szépen körbe fog rajzolódni egy fekete körvonallal. Viszont nekünk ez nem elég, úgyhogy a körvonalat most már a kör alakú kis képpel együtt kijelölve az Animations Ribbonfül Advanced Animation szekciójában kattintsunk az Add Animation menüre, majd az Emphasis csoportból állítsunk be egy Grow/Shrink típusú animációt.
Kattintásra tehát megrajzolódik a körvonal, majd még egy kattintásra (de ezt kattintás nélkül hozzá is köthetjük az előző esemény befejeződéséhez) szépen zoomolódni fog a körvonal és a kis kép is:
Roppant gyorsan összedobható, tényleg vizuális kis animáció, aminek segítségével könnyen felhívhatjuk a figyelmet prezentációnk valamely fontos adatára.
Tegyük fel, hogy ehhez szeretnénk hozzáadni valamilyen általunk gyakran használt funkciót, ami eddig nem volt így elérhető - érdemes azért hozzátenni, hogy a billentyűkombinációk gyakorlásával és használatával ezek az igények elég gyorsan eliminálhatóak. Mindenesetre a cél tehát egy újabb menüpont hozzáadása, jelen esetben ez legyen a Freeze Pane parancs, hiszen ennek elérése alapesetben Ribbonról történne.
Ennek hozzáadása egy öt soros kód segítségével pillanatok alatt megtörténhet, úgyhogy ugorjunk is át gyorsan ALT+F11 lenyomásával a VBA Editorunkba.
Ha ezt lefuttatjuk, már láthatjuk is az eredményt:
Ha esetleg valamilyen okból ezt törölni is szeretnénk, írjunk egy hasonló Subot, amit meghívhatunk majd egy főmakróban és abban a szubrutinban mindössze ezt a sort:
És a fenti felvetés nem csak ennél az egyszerű példánál merülhet fel, hasonlót könnyedén tudunk előállítani pozitív és negatív számok papíron nullát eredményező összesítésével is.

Értelemszerűen a Város oszlop első cellájában szereplő városhoz szeretnénk az összes értéket bekeresni, nem csak az elsőt. Tömbfüggvény lesz a megoldás, amelynek "motorja" egy IF formula lesz, amelyben azt vizsgáljuk meg, hogy városneveink között melyek azok, amelyek egyeznek az eredetileg megadottal:
A célunk is roppant egyszerű - ezeket az adatokat egy VBA-kódsor segítségével másoljuk be egy meghatározott Excel-fájl valamelyik sheetjére. Az Excel megnyitása után Alt+F11 lenyomásával gyorsan masírozzunk is át a VBA-editorba, ahol hozzá is láthatunk a kód kidolgozásának.
Ezután jön az a lépés, amiről fentebb már volt szó, azaz az adatbázisunkat meg is nyitjuk, tehát a connection objektum Open metódusát használjuk és megadjuk az adatbázis típusát (értelemszerűen Access esetén a Provider könnyen meghatározható) és elérési útvonalát, ahogy fentebb már leírásra került:
Nagyon kevés van már csak hátra, most jön a Recordset objektum CopyFromRecordset metódusának bevetése, ami jelen esetben az első sheetünk A1 cellájába fogja bemásolni az előbb megnyitott rs Recordsetünket:
Kódunk lefuttatása után pedig ott is az eredmény az első munkalapunkon:
Innentől kezdve pedig a határ a csillagos ég, hiszen egyrészt több táblából is szedhetünk össze adatokat, csak úgy kell megírnunk az SQL-t, másrészt az Excelben pedig már bármit megcsinálhatunk ezen adatokkal.
A dolgozók neve helyett nyugodtan képzelhetünk/írhatunk projektszakaszokat is, a lényeg úgyis a dátumokban rejlik. Ezután egy teljesen egyszerű és még üres Stacked Bar diagramot szúrjunk be a munkalapunkra az Insert Ribbonfül Charts szekciójából:
Kattintsunk jobb gombbal az üres diagramunkon és válasszuk a Select Data menüpontot:
A felugró ablakban értelemszerűen az Add gomb segítségével adjunk adatokat a charthoz, méghozzá úgy, hogy a Series neve az Oktatás kezdete cellánk (tehát az elnevezés), míg az értékek az oktatás kezdetét jelző időpontok cellái legyenek:
Tegyük meg ugyanezt egy másik adatsorral is, ez pedig legyen az Időtartam oszlopunk - az Időtartam elnevezés lesz a Series neve, az értékek pedig értelemszerűen a napok, hónapok stb.:
Maradva még mindig a Select Data Source ablakban, az Y tengelyünkre varázsoljuk rá az adott kolléga, feladat, projektszakasz nevét, szimplán az Edit gombra való kattintással majd az érintett cellák kijelölésével:
Ezután jön az egész történet kulcsa, kattintsunk a kék adatsorunkra a diagramban (vagy arra, amelyik a kezdés időpontját mutatja), majd jobb gombbal való kattintás után Format Data Series:
A jobb oldalon felugró formázási lehetőségeknél a kitöltést és a keretet is tüntessük el:
Ezután már csak az marad, hogy formázgassuk a megmaradt adatsort, ahogy szeretnénk - a gap növelésével a különböző sorok között, a méret növelésével, csökkentésével stb.:
És ezzel készítettünk is egy iszonyúan egyszerű (ez hangsúlyozandó, hiszen komplexebb projektek esetén ez bőven nem lesz elég semmire) Gantt-chartot, amelynek előnyei mellett van egy hátránya is: túl lelkes projektkezelők akár túl is lőhetik a célt és valami olyan komplex dolog születhet belőle, aminél egy manuálisan összerakott apró tábla is többet érhet. A Gantt erőssége igazából más projektmenedzsment eszközzel (és mondjuk automatizmussal) kombinálva adja ki magát és ilyen eszközöket a továbbiakban is szeretnék majd megmutatni.
Erre fogunk most beszúrni egy Submit gombot, ami majd egy e-mail címre küldi el a formot. Első lépésként a Home Ribbonfül Controls szekciójából szúrjunk be egy gombot (Button):
Kattintsunk jobb gombbal és válasszuk a gomb tulajdonságait:
A felugró ablak General fülén, az Action legördülő menüt állítsuk át Submitra, majd kattintsunk a Submit Options gombra:
Az újabb ablakban két dolgot kell tennünk. Egyrészt megengedjük usereinknek, hogy elküldjék a formot (Allow users to submit this form pipa), másrészt az Add gombra is kattintanunk kell, hogy összehozzunk egy data connectiont a gombhoz:
Ezután már csak azt kell megadnunk, hogy milyen e-mail címre, milyen tárggyal és milyen szöveggel menjen az e-mail - itt a lehetőségeink egyébként jóval nagyobbak, hiszen az f(x) gombra kattintva képletet is tudunk bevinni, azaz megadhatjuk például, hogy a form melyik mezőjéből milyen értéket vegyen fel az e-mail.
A Next gombra való kattintás után már csak azt kell eldöntenünk, hogy az e-mail mit küldjön még - legyen-e csatolmány vagy csak a form aktív képe:
Ezután már csak egy óriási okét kell nyomnunk és kész is vagyunk:
Ahogy látjuk, innentől kezdve már szépen hasít is az e-mailes küldés:
Nem egy ördöngősség volt a fentebb taglalt dolog és elképzelhető, hogy sokaknak ez a kisujjában van már, de a poszt pont azoknak szól, akik érdeklődnek ilyen jellegű megoldások iránt még a leállított fejlesztés ellenére is.


Mit is kellene most tennünk? A megoldást a mindenféle más formáknál és trükkökknél igencsak hasznos Segoe UI Symbol Font jelenti, annak is a Geometric Shapes subsetje, ahol szépen meg fogjuk találni a Harvey-labdákat:
Ezeket a rövidesen értelmet nyerő másolás okán szúrjuk be egy munkalapra, nagyjából teljesen mindegy, hogy hova, hiszen csak rövid ideig lesz rájuk szükségünk:
Vegyük észre, hogy ezek már értelemszerűen könnyedén méretezhetőek és színezhetőek:
Ezután következő lépésként szépen ezt az öt ikont vigyük fel Custom Number formátumként a CTRL+1 billentyűkombinációval megnyitható Format Cells Number füle alatt és innentől kezdve már a Conditional Formattingban ezek meghivatkozható, felhasználható formátumok lesznek.
Most az előbb már Segoe UI Symbol fonttal megalkotott Harvey-labdáink mellé szúrjuk be az általunk meghatározott értékhatárokat:
Aki pedig sokat dolgozott már Conditional Formattinggal, az valószínűleg azonnal látja, hogy mi is itt a befejező lépésünk - egyszerűen készítünk öt formázási feltételt a színes, nagyméretű Harvey-labdákat igénylő táblán, valahogy így:
Mit is csináltunk? Egyszerűen megfogtuk a formázandó, Harvey-labdákra alakítandó táblánkat, kijelöltük, majd a Home Ribbonfül alól beillesztettünk öt formázási feltételt a New Formatting Rule - Use a formula to determine which cells... felhasználásával, ahol minden feltételnél értelemszerűen az adott, előbb meghatározott Custom Number formatot válasszuk ki:
A feltételek pedig magukért beszélnek, legyen teljes a kör, ha nagyobb az ehhez megadott határértéknél a szám, aztán félkör ha annál az értéknél nagyobb és így tovább.
Ennek a tartománynak aztán persze célszerű nevet adni, hogy bővítése esetén automatikusan változzon a legördülő menünk is, de a lényeg, hogy a lista elkészülte után a Ribbonunk Data füle alatt található Data Tools szekció Data Validation funkcióját kell használnunk:
Itt készítsünk egy List típusú adatvalidációt, amelyhez a lista legyen az előbb elkészített tartományunk, akár szimplán cellákként, akár nevesített tömbként meghivatkozva:
És íme, már a felület meg is van, ami mögé a kódot kell majd beillesztenünk:
Szépen mehetünk is át a VBA Editorba ALT+F11 alkalmazásával, ahol a kiinduló munkalapunkra a megszokott alapesettől eltérően a Worksheetünk Change eseményéhez fogunk beszúrni egy futtatandó kódot, azaz az ezen a munkalapon történő változások indítják el a program futását:
Két változóra lesz mindenképpen szükségünk, elsőként definiáljunk egy ws névre hallgató Worksheet típusú változót, amelyet majd a ciklusunkban fogunk felhasználni, másodsorban kell majd egy "kival" névre hallgató String típusú változó is, amelyben a kiválasztott lehetőség nevét tároljuk el. Értelemszerűen tehát a deklarálás után már be is adhatjuk "kival" változónk értékét, ami ugyebár annak a cellának az értéke lesz, ahol kiválasztjuk a sheetünk nevét (vagy a Minden opciót):
És ezzel már szépen meg is van a működő programunk, bármilyen sheet kiválasztása esetén csak az jelenik meg plusz a kiinduló munkalapunk: