Ostatnio napisał do mnie Radek z ciekawym pytaniem. Miał o bardzo dużą, dość specyficznie zbudowaną tabelę, w której chciał zastosować podsumowania części danych (coś a la sumy częściowe). Na koniec chciał mieć sumę wszystkiego. Przyznam, żę rozwiązanie do oczywistych nie należy i jest bardzo ciekawe, bo zawiera funkcję PRZESUNIĘCIE…
Formatka wygląda tak:
W żółtej komórce F2 ma się znaleźć suma wszystkich wartości, a te wartości mają być takie:
- tam, gdzie są szare pola, a w kolumnie B jednostką jest „ryczałt”, należy podsumować wszystkie dane pod tym ryczałtem (aż do następnego ryczałtu),
- tam,gdzie jednostka jest inna niż „ryczałt”, należy pomnożyć wartości z kolumn C i D.
W kolumnie E są formuły wstawione ręcznie w odpowiednie komórki, które sumują tam, gdzie jest „ryczałt”, a w pozostałe komórki wstawione jest proste mnożenie (plik z rozwiązaniem jest do pobrania pod wpisem). Ponieważ jest to mrówcza praca, to w całym ćwiczeniu chodzi o to, aby zrobić to za pomocą jednej formuły. Do dzieła
Formuła z funkcją PRZESUNIĘCIE
Nasze zadanie jest więc takie: w żółtych komórkach F4:F21 należy wpisać jedną formułę taką, która w przypadku napotkania jednostki = „ryczałt” podsumuje wartości poniżej, do kolejnego słowa „ryczałt”. W innym przypadku pomnoży wartości z komórek obok (kolumny C i D).
Formuła będzie dość skomplikowana. Wykorzystam w niej aż 6 funkcji: JEŻELI, SUMA, PRZESUNIĘCIE, JEŻELI.BŁĄD, PODAJ.POZYCJĘ i ILE.NIEPUSTYCH.
Funkcja JEŻELI sprawdzi, czy jednostka = „ryczałt”. Jeśli tak – będzie sumowała komórki poniżej, jeśli nie – wymnoży wartości z komórek obok. Do określenia zakresu komórek „poniżej” posłużą funkcje PRZESUNIĘCIE, JEŻELI.BŁĄD, PODAJ.POZYCJĘ i ILE.NIEPUSTYCH. PRZESUNIĘCIE zwróci nam adres zakresu. Zakres ten będzie ustalony dzięki 3 pozostałym funkcjom.
Zobaczcie formułę:
=JEŻELI(B4="ryczałt";SUMA(PRZESUNIĘCIE(F5;0;0;JEŻELI.BŁĄD(PODAJ.POZYCJĘ("ryczałt";B5:$B$21;0)-1;ILE.NIEPUSTYCH(B5:$B$21));1));C4*D4)));C4*D4)
Najtrudniej jest ustalić tutaj wysokość zakresu sumowania, czyli czwarty argument funkcji PRZESUNIĘCIE. Wysokość ta jest to liczba komórek pod wierszem, w którym aktualnie jesteśmy, do najbliższego wystąpienia kolejnego „ryczałtu”. Najłatwiej jest to określić funkcją PODAJ.POZYCJĘ, która ma sprawdzić, gdzie jest „ryczałt” w zakresie od komórki poniżej wiersza z formułą, do końca zakresu. Funkcja PODAJ.POZYCJĘ zwróci pozycję pierwszego napotkanego „ryczałtu”, czyli dokładnie to, o co nam chodzi. A ponieważ chcemy, aby wysokość zakresu sumowania kończyła się tuż przed napotkaniem słowa „ryczałt”, od wyniku PODAJ.POZYCJĘ odejmujemy 1.
I tak naprawdę to nam prawie rozwiązuje problem. Niestety nie zakłada opcji, że zakres się kiedyś skończy i to nie słowem „ryczałt”. W takiej sytuacji, PODAJ.POZYCJĘ zwróci błąd. Żeby się przed tym zabezpieczyć – wrzucamy wszystko do funkcji JEŻELI.BŁĄD i jako jej drugi argument, czyli co ma się stać w przypadku błędu, wrzucamy funkcję ILE.NIEPUSTYCH, która po prostu policzy wysokość zakresu, jako liczbę niepustych komórek z jednostkami. Dokładnie to w takim przypadku będzie wysokość sumowanego zakresu.
Mega-formułą, ale działa
Małego komentarza wymaga również dynamiczny zakres B5:$B$21. Jest on po to, aby ustalać zakres sumowania: ma on się zaczynać zawsze pod wierszem, w którym jest formuła. Dynamikę tego zakresu osiągamy zwykłym adresowaniem. Mówimy Excelowi, że ma zmieniać pierwszą komórkę zakresu (adres względny= brak dolarów), ale ma zostawić w spokoju ostatnią (adres bezwzględny = 2 dolary). Dzięki temu uzyskujemy efekt dynamicznego zakresu.
Dobrze widać to na obrazkach (fioletowy zakres) – zakres się zmniejsza wraz ze schodzeniem formuły w dół:
Formuła licząca TOTAL
Na koniec już najłatwiejsze, czyli podsumowanie wszystkiego. To zrobimy już zwykłą funkcją SUMA.JEŻELI. Kryterium sumowania, będzie oczywiście słowo „ryczałt”. Formuła w komórce F2 wygląda więc tak:
=SUMA.JEŻELI(B4:B21;"ryczałt";F4:F21)
Nic tutaj nie trzeba blokować, ponieważ formuła ta jest tylko w tym jednym miejscu.
A oto efekt wszystkiego:
Mam nadzieję, że podany przykład okaże się przydatny w tej, czy zbliżonej formie. Zachęcam też do udostępnienia tego wpisu znajomym, za co będę bardzo wdzięczna.
Malinowy Excel PRZESUNIĘCIE w podsumach dw.xlsx