Folytatódik a végtelen történet: újabb SUMPRODUCT-bevetés

2016. május 04. - Office Guru

Folytatva a pár hónappal ezelőtt elkezdett sorozatot, ismét az Excel egyik titkos fegyveréről, a szinte mindenre képes SUMPRODUCT függvényről lesz szó, annak egy újabb felhasználási módjáról. Az alapdefiníció és funkcióleírás valószínűleg mindenkinek a könyökén jön ki: két vagy több tömb elemeit szorozza majd adja össze, azaz két tömb egymással egy sorban lévő elemeit összeszorozza majd az eredményeket szummázza.

Na de ez csak a legalapvetőbb felhasználási módja, a múltban írtam már egyéb lehetőségekről is, ma pedig ismét bővítjük ezen tudásanyagot. A következő példatáblában tegyük fel, hogy az elmúlt két hétben egyik kollégánk ledolgozott óráinak számát látjuk, a munkaidő következetesen nyolc óra, ha valaki ennél többet dolgozik, az nem számít, ha kevesebbet, akkor értelemszerűen a kevesebb óra kerül majd figyelembe vételre az elszámolásnál:

s01_2.jpgA 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 simán szummázunk, látjuk, hogy összesen 86 óra 32 percet dolgozott a kolléga, de valójában ennél jóval kevesebbet fog majd az elszámolásában látni, hiszen a 8 óra feletti rész nem számít.

s02_2.jpgHa pontosan akarjuk kiszámolni, láthatjuk, hogy így valójában csak 77 óra 38 perce kerül majd elszámolásra:

s03_2.jpgA 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.

Tehát kezdjük a képletünket egy egyszerű szummával, hiszen ebből vonjuk majd le a többletidőt:

s04_2.jpgA 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.

{=(TIME(8,0,0)-B2:B11<0)}

A következő kép részkalkulációjában látható, hogy milyen tömböt kapunk eredményként:

s05_2.jpgTRUE é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.

Ne felejtsük el, hogy ez még csak a végső tömbfüggvényünk második része (az első a ledolgozott idő sima szummája volt), úgyhogy jön a harmadik fázis, ahol az is kiderül, hogy mire fogjuk a FALSE/TRUE értékeket felhasználni. Azt már korábbi posztokban taglaltam és fel is használtam, hogy mi történik akkor, ha a TRUE illetve FALSE értéket megszorozzuk egy számmal: TRUE esetén a számot, FALSE esetén nullát kapunk vissza.

Ergó most van egy tömbünk TRUE és FALSE értékekkel, tehát azoknál a soroknál, ahol TRUE értéket kaptunk eredményül, meg tudjuk határozni, hogy pontosan számértékben mekkora időmennyiséggel dolgozott többet a kolléga. Ehhez nem teszünk mást, mint simán összeszorozzuk a TRUE/FALSE tömbünket az egyes sorokra kiszámolt időkülönbséggel (ami 8 órához képest többlet esetleg hiány):

{=(TIME(8,0,0)-B2:B11<0)*(TIME(8,0,0)-B2:B11)}

A lenti segédkalkulációban látszik, hogy jelenleg milyen tömbünk van, TRUE és FALSE értékek helyett a pontos számértékként megjelenő időtöbbleteket látjuk:

s06_1.jpgA 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:

s07_2.jpg

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr368687628

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.