Nemrég egy olyan Excel feladattal találtam szembe magam, amilyennel korábban nem találkoztam: több, azonos szerkezetű munkalap adataiból kellett egy összegző munkalapot készítenem. Az összegző munkalap struktúrája megegyezett a többi munkalap szerkezetével, így lényegében sok munkalap azonos celláit kellett összeadnom, ám lehetőleg olyan módon, hogy ha egy újabb munkalapot beillesztünk a munkafüzetbe, akkor is működjön. Megoldható-e ez a feladat? Milyen lehetőségek állnak rendelkezésünkre? Mit érdemes megfontolni, ha ilyen problémával találkozunk?
Bevezető gondolatok és példaadatok
A feladat azóta is gyakran eszembe jut. Legtöbbször az a kérdés merül fel bennem, hogy nekem miért nem volt szükségem még korábban ilyen megoldásra? Kicsit előreszaladva valószínűleg azért, mert én ilyen esetekben többnyire átstrukturálom az adataimat, de erre térjünk még vissza az írás végén. Rögtön ezután az szokott felmerülni bennem, hogy vajon hogyan alakulhat ki ilyen adatszerkezet, adattárolási logika? Erre a kérdésre többnyire azt a választ tudtam adni saját magamnak, hogy kezdetben az egész sokkal kisebb méretben (pl. egy munkalappal), részben vagy egészben eltérő céllal jött létre. Aztán ahogy telt az idő, bővült, fejlődött a feladat (ezzel megjelentek munkalapok), s ezzel együtt felmerültek új igények is (pl. az össszegző munkalap, de lehetne más statisztikai mutató is). Eközben pedig az adatok átstrukturálása vagy fel sem merült, vagy más szempontok ("ezt legalább mindenki tudja használni", "nincs most erre időnk", stb.) miatt megőrződött a kezdeti adatszerkezet, ami nem biztos, hogy a legalkalmasabb a megváltozott igények kiszolgálására.
A feladat könnyebb megértése érdekében készítettem egy kis mintaadatot, véletlenszerűen generált számokkal. Ezúttal azonban fontos az a(z elképzelt) történet is, amit a példaadatok mögé és köré képzeltem. Tegyük fel, hogy...
1. Az AdatTérKép ötletének felmerülése után készítettem saját magam számára egy listát a feladattípusokról és minden feladattípus mellé felírtam, hogy az adott hónapban hány órát foglalkoztam vele. Kiemelve a lényeget: egy felhasználó, nyilvántartási cél.
2. Később megmutattam Daninak, akivel közösen indítottuk az AdatTérKép oldalát, az ötlet megtetszett neki is. Együtt továbbgondoltuk, és arra jutottunk, hogy minden hónapban kitöltjük mind a ketten és a két munkalapot egy fájlba másolva eltároljuk ezeket az adatokat, hátha később szükség lesz rájuk. Kiemelve a lényeget: két felhasználó, nyilvántartási cél.
3. Pár hónap elteltével csapatunkhoz csatlakozott Anikó is, innentől ő szintén kitöltötte a számokat, a havi fájlok így már 3 munkalappal kerültek tárolásra. Mivel ismétlődő feladatról van szó (minden hónapban 3 munkafüzetből az egy-egy munkalap összemásolása egy új munkafüzetbe és ennek mentése a dátum alapján) és az automatizálást úgyis nagyon szeretjük, készítünk egy makrót, amely elvégzi az összemásolást. Ezzel egyben felkészítjük az adattárolási rendszerünket akárhány felhasználóra/munkalapra. Kiemelve a lényege: három tényleges, tetszőleges számú elméleti felhasználó, nyilvántartási cél.
4. Egy ponton felmerült a kérdés, hogy mivel is foglalkoztunk, foglalkozunk a legtöbbet, illetve megéri-e az egyes feladattípusokra a ráfordított idő. Szerencsénkre ott voltak a korábban eltárolt adatok, amelyeket elemezni lehetett (feladattípusonként összeg, átlag, maximum). Ebben a pillanatban dönthetnénk úgy, hogy az eddigi adatokat átstrukturáljuk, a jövőben eltérő módon és szerkezetben gyűjtjük azokat, hogy a megváltozott célt hatékonyabban ki tudják szolgálni, de a példa kedvéért tegyük fel, hogy időhiány (vagy bármi más) miatt ezt nem tettük meg, az összegző munkalap mellett döntöttünk. Mivel az adattárolás tetszőleges számú munkalapra már felkészült, olyan megoldást kell találnunk, ami az elemzés során is figyelembe veszi ezt. Kiemelve a lényeget: három tényleges, tetszőleges számú elméleti felhasználó, nyilvántartási és elemzési cél.
Megoldási lehetőségek és a megoldás
Miután adott a több, azonos szerkezetű munkalap és az ezekkel megegyező szerkezetű összegző munkalap, a legkézenfekvőbb megoldás, hogy a megfelelő függvény kiválasztása után végigkattintjuk az összes azonos cellát a munkalapokon. Például az Excel feladattípus összegzése (B4 cella) esetében így nézne ki ez a függvény:
=SZUM(Anikó!B4;Dani!B4;Zsolt!B4)
A végeredményt tekintve ez egy jó megoldás, a relatív cellahivatkozásoknak köszönhetően más feladattípusokra is könnyen érvényesíthető. Két esetben azonban problémát okozhat a használata:
- Ha nagyon sok munkalapot kell összegeznünk. Így a függvény is nagyon hosszú lesz, sokáig is tart kialakítani, nagyobb a hibázás lehetősége.
- Ha egy új munkalapot kell hozzáadni. A függvényt minden egyes helyen bővítenünk kell, viszonylag nagy a hibázás lehetősége.
Szerencsére az Excelben van arra mód, hogy ne csak a cellákból alkossunk tartományokat, hanem a munkalapokból is. Ehhez a tartományba bevonni kívánt első munkalap neve és az utolsó munkalap neve közé kettőspontot (:) kell tennünk, majd jöhet a felkiáltójel (!) és a cella- vagy tartományhivatkozás. Például a
=SZUM(Anikó:Zsolt!B4)
függvényt használva az Excel végig halad az "Anikó" nevű munkalaptól a "Zsolt" nevű munkalapig és ezeknek, valamint a kettő között minden további munkalapnak a B4-es celláját fogja összegezni.
Ez a megoldás már majdnem jó! Gyorsan előállítható, nem kell végighaladnunk minden munkalapon. Ha azonban bejön egy újabb munkalap (pl. "Zsuzska"), akkor nem mindegy, hogy az hova kerül! Ha az "Anikó" és "Zsolt" munkalap közé, akkor semmi gond, ha azonban az első vagy utolsó lesz a munkalapok sorában, akkor s képletet ismét módosítanunk kell minden helyen. Ha a munkalapokat szeretnénk ABC rendben tartani, akkor a "Zsuzska" munkalapot a megfelelő helyre illesztve már nem a "Zsolt" lesz az utolsó, így a képletet is javítani kellene.
Ezt egy apró trükkel lehet kiküszöbölni, ami nem feltétlenül szép, de mindenképpen hatékony megoldás! Beszúrunk egy munkalapot az első összegzendő munkalap elé, legyen a neve mondjuk "Start" és maradjon teljesen üres! Hasonlóképpen beszúrunk egy munkalapot az utolsó összegzendő után, ennek a neve legyen "End" és ez is maradjon teljesen üres! A képletet pedig módosítsuk így:
=SZUM(Start:End!B4)
Így a tartomány bevonja ugyan a "Start" és "End" munkalapokat is, ám mivel azok teljesen üresek, a végeredményt nem befolyásolják. Ha pedig újabb munkalapot kell beszúrnunk, mindegy, hogy hova kerül, amíg a "Start" után és az "End" előtt helyezkedik el, így egy "Alíz" nevű munkalapot is bátran beszúrhatunk az "Anikó" elé, a képletet mégsem kell módosítanunk!
Adatszervezési megfontolások
Bár a feladatot megoldottuk, alkalmazkodva a körülményekhez, a fenti példához sokkal jobban illeszkedne egy transzponált adatszerkezet, ahol a felhasználók találhatók a sorokban, a feladattípusok az oszlopokban és egyetlen táblázatban van minden adat, amit összegző, átlagoló, stb. sorokkal és oszlopokkal tudunk ellátni vagy kimutatást készíteni rá egy új munkalapon.
Ez az adattárolási logika sokféle módon elérhető:
- Másolhatjuk kézzel, transzponált beillesztéssel az adatokat az egyes fájlokból.
- Módosíthatjuk a munkalapokat egymás mellé másoló makrót úgy, hogy az adatokat eleve a kívánt módon illessze be.
- Elgondolkozhatunk azon, hogy az adatközlés pl. Google Űrlap segítségével történjen, a kitöltött adatok pedig egy Google Táblázatban elérhetők lehetnek.
- Stb.
Az adatszerkezet megváltoztatása, az adattárolási logika módosítása mindig egy nehéz döntés, ami sok plusz munkával jár, ezért alaposan mérlegelni kell, hogy mennyit nyerhetünk általa. Ha azonban úgy látjuk, hogy az igények jelentősen megváltoznak, érdemes belevágni és áttérni az új igényeket jobban kiszolgálni képes adatszerkezetre. Az egyszeri idő- és energiabefektetés sokszorosan megtérül majd, amikor az ismétlődő feladatokat sokkal könnyebben el tudjuk végezni!
Ha adatbázis-építés, adatelemzés, vizualizáció, térinformatika témában segítségre van szükséged, írj nekünk az Ez az e-mail-cím a szpemrobotok elleni védelem alatt áll. Megtekintéséhez engedélyeznie kell a JavaScript használatát. címre és megpróbálunk egy tippel, ötlettel segíteni!