Już od jakiegoś czasu chodziło mi po głowie, aby napisać o tym triku artykuł. Dodatkowo zmotywował mnie Waldkorg, bo dziś właśnie o niego zapytał. Trik, który bardzo sobie chwalą użytkownicy formularzy. Trik, który ułatwia i przyspiesza im pracę. Trik, dzięki któremu twoje formatki będą im przyjazne.
Kiedyś wykorzystałam go, gdy tworzyłam formularz, za pomocą którego handlowcy zamawiali towar. Spośród całego asortymentu mieli oni wybrać te produkty, które zamierzali sprzedać. Każdy handlowiec najpierw określał grupę produktową, a następnie konkretny produkt z tej grupy. Na formularzu miała się znaleźć cała nazwa grupy oraz konkretny indeks produktu. Ponieważ wpisywanie tego z palca byłoby zbyt czasochłonne (i denerwujące), zaproponowałam bardzo sprytne i proste rozwiązanie – 2 listy rozwijane. Pierwsza była listą wszystkich kategorii produktów, druga zaś listą wszystkich produktów znajdujących się w wybranej kategorii. Stworzyłam więc listę rozwijaną zależną od wyboru dokonanego na poprzedniej liście.
Taki sam efekt chce uzyskać Waldkorg (ufam, że już uzyskał po przeczytaniu tego artykułu:) – Waldkorg, daj znać), który do budżetu domowego potrzebuje kategorii i podkategorii wydatków. Przykładowe dane znajdują się na poniższym obrazku:
Czyli np. jeśli wybierzemy kategorię Rozrywka, to na liście podkategorii powinny się znaleźć: Kino, Teatr, Basen. Bardzo sprytne rozwiązanie, jeśli w swoim budżecie domowym chcecie analizować więcej szczegółów. Przyznam, że w mojej propozycji budżetu domowego ograniczam się tylko do kategorii, dlatego że taki podział wydatków w zupełności mi wystarcza. Jeśli jednak potrzebujecie podzielić to na podkategorie, to metoda, którą opiszę dalej będzie idealna. Korzystajcie śmiało!
A efekt końcowy wygląda tak:
Żeby go osiągnąć należy zrobić nieco inną tabelę z danymi, niż gdybyśmy tworzyli pojedynczą listę rozwijaną. Tabela powinna wyglądać tak (zakres G2:H15):
W tabeli tej należy wpisać obok siebie kategorię i jej podkategorie. Nazwa kategorii musi wystąpić tyle razy, ile jest podkategorii. Bardzo istotne jest, aby dane były posortowane po kolumnie Kategoria. Będzie to niezwykle istotne przy późniejszym pisaniu formuły.
Można byłoby też skorzystać z tabelek z pierwszego obrazka. Formuły byłyby rzecz jasna inne. Kiedyś nawet znalazłam w necie takie rozwiązanie, ale nie podobało mi się, bo określało się tam stałą długość listy: czasem więc lista zawierała puste pola, a czasem nie wyświetlała wszystkich elementów. Z pewnością da się ominąć to ograniczenie, ale przyznam, że i tak moje rozwiązanie bardziej mi się podoba, więc nad tamtym już się nie zastanawiałam.
No dobrze. Teraz po kolei opiszę kroki tworzenia zależnej listy rozwijanej.
1. Nazwanie zakresów
Jest to krok nieobowiązkowy, bez niego bowiem bez problemu sobie poradzimy. Lubię jednak stosować nazwy, ponieważ znacznie ułatwiają one zarówno pisanie, jak i czytanie formuł.
Nazwiemy 2 zakresy. Listę wszystkich kategorii i roboczą listę kategorii. Będą to zakresy A3:A5 (lista kategorii w zielonej tabelce na pierwszym obrazku) i G3:G15 (lista powtórzonych kategorii w fioletowej tabelce roboczej).
Żeby nazwać listę kategorii:
- Zaznacz zakres A3:A5.
- W polu nazwy (pole po lewej stronie od paska formuły) wpisz nazwę Kategorie.
- Zatwierdź Enterem.
Te same czynności wykonaj dla zakresu roboczej listy kategorii G3:G15, którą nazwij ListaRob. Tego zakresu będziemy używać w formule.
2. Stworzenie listy rozwijanej dla kategorii
To będzie proste:
- Zaznacz komórkę, w której chcesz umieścić listę. U mnie to A12.
- Z menu Dane wybierz Poprawność danych. Pojawi się okno Sprawdzanie poprawności danych.
- Jako wartości dozwolone wybierz lista.
- Jako źródło wpisz: =Kategorie (obrazek poniżej).
- Zatwierdź OK.
Wynik jest następujący:
3. Stworzenie (zależnej) listy rozwijanej dla podkategorii
Tutaj zaczyna się zabawa. Tworzyć listę umiemy – zrobiliśmy to przed chwilą dla kategorii. Pytanie tylko: „Jak powiedzieć Excelowi, aby wybrał tylko te wartości, które są przyporządkowane do konkretnej kategorii?”. Jak się zapewne domyślacie, skorzystam tutaj z tabeli roboczej i oczywiście z formuł.
Zacznijmy od tego, co umiemy, czyli od stworzenia listy rozwijanej w komórce B12. Zaznacz więc tę komórkę i wybierz Dane/ Poprawność danych, a jako kryterium poprawności – Lista.
W źródło listy wpisz taką formułę:
=PRZESUNIĘCIE($H$2;PODAJ.POZYCJĘ(A12;ListaRob;0);0;LICZ.JEŻELI(ListaRob;A12);1)
Wygląd okna Sprawdzanie poprawności danych:
Jak widać, cały trik listy zależnej polega na użyciu funkcji PRZESUNIĘCIE. No dobra, prawie cały. Pomagają jej funkcje PODAJ.POZYCJĘ i LICZ.JEŻELI. Funkcja PRZESUNIĘCIE pozwala dynamicznie określić zakresy. Na początku ustalamy komórkę, od której ma się zacząć przesuwanie zakresu, a w kolejnych argumentach ustalamy jego rozmiary.
W naszym przykładzie zakres będzie przesuwał się po kolumnie Podkategoria w tabeli roboczej (G2:H15). Przesuwanie zaczniemy od komórki H2, która jest jednocześnie pierwszym argumentem naszej funkcji. W formule ją zablokowałam, ponieważ zakładam, że listę rozwijaną będziemy wykorzystywać w wielu komórkach.
Ponieważ tabela robocza jest posortowana po Kategorii, to zakres, który ma być źródłem do listy rozwijanej, będzie zaczynał się tam, gdzie pierwsze wystąpienie wybranej kategorii. Np. dla kategorii Jedzenie chcemy wyświetlić zakres H6:H11, dla Transport – zakres H12:H15 itd. Zauważmy, że cały czas poruszamy się po kolumnie H, a jedyne co się zmienia to początek zakresu i jego wysokość (czyli liczba elementów na liście).
Początek zakresu zostanie przesunięty względem komórki H2 o tyle komórek w dół (o taką liczbę), ile wynosi numer pozycji pierwszego wystąpienia kategorii w kolumnie Kategoria. Łatwiej będzie na przykładzie: zakres dla kategorii Jedzenie jest przesunięty o 4 komórki w dół względem komórki H2 (zaczyna się w 4. komórce pod zakresem H2). W 4. komórce kolumny Podkategoria (nie uwzględniam nagłówka, czyli interesuje mnie nazwany zakres ListaRob) jest również słowo Jedzenie (jego pierwsze wystąpienie). Wykorzystujemy ten fakt właśnie do określenia początku zakresu. Posłuży nam do tego funkcja PODAJ.POZYCJĘ (wpisana w drugim argumencie funkcji PRZESUNIĘCIE):
PODAJ.POZYCJĘ(A12;ListaRob;0)
Wysokość zakresu ustali funkcja LICZ.JEŻELI. Zliczy ona wszystkie wystąpienia kategorii, czyli słowa Jedzenie. Słowo to występuje tyle razy, ile będzie pozycji w naszym zakresie. Liczba pozycji w zakresie to jego wysokość. Oto funkcja:
LICZ.JEŻELI(ListaRob;A12)
Oczywiście obie funkcje zawiera już funkcja PRZESUNIĘCIE opisana wyżej. Dodatkowo zauważcie, że zarówno w funkcji PODAJ.POZYCJĘ, jak i w LICZ.JEŻELI odwołałam się do nazwanego zakresu ListaRob. Tak jak wspomniałam wcześniej, nie trzeba używać nazw zakresów, można wpisać po prostu $H3:$H15. Użycie nazwy jest jednak łatwiejsze i czytelne.
I tyle. Jedna formułka, no niekoniecznie prosta, i załatwia sprawę! Dwa zastosowania tego triku już podałam. Ciekawa jestem natomiast, gdzie wy to wykorzystacie?
Redakcja językowa: Aleksandra Wasiak