W tym poście nauczymy się jak przy listach rozwijanych zależnych sprawić, żeby lista zależna od listy głównej odpowiednio się podświetlała, jeśli jest wypełniona nieprawidłową wartością. W naszym przykładzie mamy dwie listy: w jednej możemy wybrać Region (Centrum, Wschód, Zachód, Północ i Południe), a w drugiej Sprzedawcę. Istotne jest, że w każdym regionie mamy innych sprzedawców. Jeśli zmienimy region, to nazwa sprzedawcy podświetli się (pokaże, że mamy błąd wynikający z tego, że danego sprzedawcy nie ma w wybranym przez nas regionie). Widać to na rys. nr 1.

Rys. nr 1 – podświetlony sprzedawca niewystępujący w danym regionie

Zagadnienie to omówimy na podstawie przykładowych danych z rys. nr 2.

Rys. nr 2 – przykładowe dane

Naszym zadaniem jest sprawienie, aby komórka z elementem listy zależnej była albo podświetlona albo wyczyszczona po zmianie regiony na głównej liście. Rozwiązanie z podświetleniem nazwy sprzedawcy uzyskamy za pomocą formatowania warunkowego. Natomiast rozwiązanie z czyszczeniem komórki otrzymamy przy użyciu kodu VBA.

Mamy przygotowane wcześniej listy (główną i zależną) oraz powiązaną z tymi listami tabelę, która wyświetla dane dla wybranych wartości. Tabelki te zostały przedstawione na rys. nr 3.

Rys. nr 3 – listy rozwijane

Najpierw musimy sprawdzić czy dana pozycja występuje. Do tego wykorzystamy funkcję PODAJ.POZYCJĘ. Pierwszym argumentem funkcji jest szukana_wartość, czyli komórka z aktualnie wybranym sprzedawcą (u nas G2). Drugi argument funkcji to przeszukiwana_tab, czyli kolumna Sprzedawcy (K2:K6). Trzeci argument to typ_porównania, wybieramy dopasowanie dokładne, czyli wpisujemy wartość 0. Zapis formuły powinien wyglądać następująco:

=PODAJ.POZYCJĘ(G2;K2:K6;0)

Jeśli danego sprzedawcy nie będzie w wybranym regionie to funkcja PODAJ.POZYCJĘ wyświetli nam błąd #N/D (rys. nr 4), co dla formatowania warunkowego oznacza, że nie nakładamy żadnego formatowania.

Rys. nr 4 – błąd wyświetlany przez funkcję PODAJ.POZYCJĘ

Jeśli zmienimy sprzedawcę na takiego, który występuje w wybranym regionie funkcja PODAJ.POZYCJE zwróci nam wartość 1, 2 itd. 

Formatowanie warunkowe liczby całkowite różne od zera, traktuje jako wartość logiczną PRAWDA. Za pomocą formatowania warunkowego sprawimy, że kolorystyka z komórki G2 zniknie. Mamy napisaną formułę, którą wykorzystamy w formatowaniu warunkowym (zapis funkcji PODAJ.POZYCJĘ). Kopiujemy zapis formuły w trybie edycji komórki za pomocą skrótu klawiszowego Ctrl+C. Zaznaczamy komórkę G2 i rozwijamy polecenie Formatowanie warunkowe (punkt 2 na rys. nr 5) z karty Narzędzia główne (punkt 1), następnie wybieramy polecenie Nowa reguła (punkt 3).

Rys. nr 5 – polecenie Nowa reguła

Otworzy nam się okno Nowej reguły formatowania, gdzie w polu Wybierz typ reguły, wybieramy opcję Użyj formuły do określenia komórek, które należy sformatować (punkt 1 na rys. nr 6). Następnie w polu Edytuj opis reguły wklejamy wcześniej skopiowaną formułę (punkt 2). Teraz wybieramy przycisk Formatuj, aby wybrać rodzaj formatowania (punkt 3).

Rys. nr 6 – okno Nowej reguły formatowania

Otworzy nam się okno Formatowania komórek, gdzie przechodzimy na zakładkę Wypełnienie (punkt 1 na rys. nr 7), następnie wybieramy w polu Kolor tła Brak koloru (punkt 2). Takie ustawienie formatowania zatwierdzamy przyciskiem OK.

Rys. nr 7 – okno Formatowania komórek

Excel wróci do okna Nowa reguła formatowania, które należy zatwierdzić przyciskiem OK.

Jak widać na rys. nr 8, Stanisław jest sprzedawcą z regionu Północ, więc formatowanie warunkowe zadziałało w ten sposób, że zmieniło kolor na Brak wypełnienia.

Rys. nr 8 – brak wypełnienia w komórce G2

Jeśli teraz w komórce G1 wybierzemy np. Zachód, nazwa Sprzedawcy podświetli się nam znowu na czerwono. Wynika to z tego, że funkcja PODAJ.POZYCJĘ zwróciła błąd (komórka H1) – rys. nr 9.

Rys. nr 9 – podświetlenie sprzedawcy nie występującego Zachód

W ten sposób uzyskaliśmy efekt podświetlania kolorystycznego w zależności czy wybrany sprzedawca występuje w danym regionie. Pokazaliśmy jak rozwiązać taki problem za pomocą formatowania warunkowego.

W drugim rozwiązaniu będzie nam potrzebny kod VBA, który jest relatywnie prosty w porównaniu do niektórych kodów. Jednak żeby dobrze go zrozumieć, trzeba się trochę orientować w VBA. Aby przejść do języka VBA korzystamy ze skrótu klawiszowego Alt+F11. Otworzy nam się okno VBA pokazane na rys. nr 10.

Rys. nr 10 – okno VBA

Interesuje nas sytuacja, kiedy zmienimy wartość w komórce G1, czyli Region. W VBA chcemy uzyskać rozwiązanie, które będzie polegało na tym, żeby komórka G2 wyczyściła się ,kiedy zmienimy wartość w komórce G1. Czyli kiedy zmienimy region, chcemy aby komórka zawierająca nazwę sprzedawcy została wyczyszczona.

Pracujemy na arkuszu p384_k, więc w panelu bocznym VBA znajdujemy odpowiednią nazwę (rys. nr 11) i klikamy na nią dwukrotnie.

Rys. nr 11 – wybór odpowiedniego arkusza

Otworzy się nam moduł kodu VBA dla tego arkusza, w którym będziemy pisać kod. W pierwszym polu zamiast domyślnego General wybieramy Worsheet (punkt 1 na rys. nr 12), a w drugiem zamiast SelectionChange wybieramy z listy rozwijanej Change (punkt 2).

Rys. nr 12 – zmiana ustawień kodu dla wybranego arkusza

Ostatnie dwie linijki kodu możemy skasować, są zbędne. Będziemy chcieli zastosować znany kod na przecięcie elementu/ wartości. Kod ten wykorzystuje funkcję Intersect, dla której podajemy dwa zakresy i sprawdzamy czy one się przecięły. Pierwszym naszym zakresem będzie wartość Target, czyli jeśli zmieni się arkusz, to jaki zakres w tym arkuszu ulegnie zmianie. Target to w skrócie zakres, który uległ zmianie. Nasze zadanie polega na sprawdzeniu, czy ten zakres ma część wspólną z drugim zakresem (z komórką G1). Drugi zakres zapisujemy jako Range("G1"). Cały zapis funkcji powinien wyglądać następująco:

Intersect(Target, Range("G1"))

Funkcja ta, jeśli znajdzie część wspólną, zwróci właśnie tą wartość. Jeśli zakresy nie będą miały części wspólnej funkcja zwróci Nothing, czyli pustą komórkę.

Ciężej jest zorientować się jaki zakres zwraca ta funkcja, więc musimy sprawdzić czy nasza funkcja zwraca nic. W tym celu do zapisu funkcji należy dopisać sformułowanie "is nothing". Zapis powinien wyglądać następująco:

Intersect(Target, Range("G1")) is nothing

Jeśli funkcja zwraca nothing, oznacza to, że przecięcia nie było. Nas interesuje odwrotna sytuacja, więc przed nazwą funkcji Intersect musimy dopisać Not. Zapis powinien wyglądać następująco:

Not (Intersect(Target, Range("G1")) is Nothing)

Wykonamy teraz prosty test logiczny, czyli przed zapisem wpisujemy if, natomiast po Then. Pod zapisem tej formuły wstawiamy zakończenie funkcji If w postaci zapisu End If.

Jeśli funkcja Intersect zwraca nic, oznacza to, że nasze zakresy nie mają przecięcia. W takiej sytuacji chcemy otrzymać pusty ciąg znaków (""). Zapis powinien wyglądać następująco (rys. nr 13):

If Not (Intersect(Target, Range("G1")) is Nothing)  Then

      Range("G2") = ""

End If

Rys. nr 13 – kod VBA wykorzystujący funkcję If

Możemy łatwo sprawdzić działanie tego kodu. Dla pewności zapisujemy dane z kodu za pomocą skrótu klawiszowego Ctrl+S. Przechodzimy do naszego arkusza w Excelu, gdzie zmieniamy nazwę regionu. Jak widać na rys. nr 14, zmiana nazwy regionu na taki, w którym nie ma aktualnego sprzedawcy (brak przecięcia zakresów) sprawiło, że komórka G2 została wyczyszczona.

Rys. nr 14 – wyczyszczona komórka G2 po zmianie regionu w komórce G1

Możemy pójść o krok dalej w kodzie VBA i np. zamiast wyczyszczenia komórki (pusty ciąg znaków), możemy podać tekst "Podaj sprzedawcę". Zapis kodu wyglądałby wtedy następująco:

If Not (Intersect(Target, Range("G1")) is Nothing)  Then

      Range("G2") = "Podaj sprzedawcę"

End If

Wtedy po zmianie region w komórce G1, w komórce G2 wyświetli się napis Podaj sprzedawcę, co widać na rys. nr 15.

Rys. nr 15 – wyświetlenie napisu Podaj sprzedawcę

Jest mały problem, kiedy chcemy zmienić nazwę regionu i się rozmyślimy. VBA automatycznie po rozwinięciu listy rozwijanej (mimo że nie wybierzemy innego regionu) zadziała i wyświetli nam napis Podaj sprzedawcę. 

Teraz wykonamy bardziej zaawansowane działania w celu zabezpieczenia się przed taką sytuacją. Przechodzimy do okna VBA, w którym pisaliśmy nasz kod. Możemy użyć funkcji Find. Najpierw musimy określić zakres, na którym ta funkcja ma działać(w naszym przykładzie K2:K8). Funkcja Find będzie szukała naszego wybranego sprzedawcy, czyli musimy podać zakres (Range("G2")). Jak funkcja Find znajdzie wybranego sprzedawcę to powinna zwracać odpowiedni zakres, natomiast jeśli nie znajdzie, powinna zwracać nothing, czyli nic. Zapis całej formuły powinien wyglądać następująco (rys. nr 16):

If Not (Intersect(Target, Range("G1")) is Nothing)  Then

      If Range("K2:K8").Find (Range("G2")).Value, LookIn:=xlValues) is Nothing   Then

           Range("G2") = "Podaj sprzedawcę"

      End If

End If

Rys. nr 16 – kod VBA

Zastosowanie funkcji Find w funkcji If sprawiło, że wyświetli się napis Podaj sprzedawcę tylko wtedy, kiedy faktycznie ta zmiana w komórce G1 nastąpi.


Książka Mistrz Excela + promo na 35 urodziny

Chcę Cię poinformować, że w końcu udało mi zebrać środki i dopiąć wszystkich formalności, żeby powstało II wydanie mojej książki Mistrz Excela (zostałem wydawcą)
II wydanie jest wzbogacone o rozdział (nr 22) wprowadzający w genialny dodatek (Power Query) do Excela służący do pobierania, łączenia i wstępnej obróbki danych z wielu źródeł.

Książka Mistrz Excela to historia Roberta, który musi poznać dobrze Excela na potrzeby nowej pracy. Książka jest napisana w formie rozmów Roberta z trenerem, dzięki temu jest przystępniejsza w odbiorze niż standardowe książki techniczne pisane językiem "wykładowym".

Rozmowy zostały podzielone na 22 tematyczne rozdziały, które krok po kroku wprowadzają Cię w tajniki Excela. Robert zaczyna naukę od poznania ciekawych aspektów sortowania i filtrowania danych w Excelu, przechodzi przez formatowanie warunkowe, tabele przestawne, funkcje wyszukujące i wiele innych tematów, by na koniec poznać wstępne informacje o VBA i Power Query.
A wszystko to na praktycznych przykładach i z dużą ilością zdjęć.

Żebyś mógł śledzić postępy Roberta, do książki dołączone są pliki Excela, na których pracuje Robert.

Aktualnie w promocji urodzinowej możesz mieć Mistrza Excela w obniżonej cenie, jeśli tylko wpiszesz kod 35URODZINY
https://exceliadam.pl/produkt/ksiazka-mistrz-excela

Na powyższej stronie znajdziesz dokładniejszy opis książki, opinie osób, które kupiły I wydanie oraz podgląd pierwszego rozdziału książki, żeby upewnić się, czy forma rozmów przy nauce Excela jest dla Ciebie.
Jeśli książka Ci się spodoba poinformuj o niej swoich znajomych. 

W ramach promocji na moje 35 urodziny możesz też mieć każdy z moich kursów wideo na Udemy za zaledwie 35 zł. Linki do kursów zamieszczam poniżej. W każdym kursie są udostępnione filmy do podglądu, byś mógł się przekonać czy dany kurs jest dla Ciebie.

Power Query
https://www.udemy.com/course/mistrz-power-query/?couponCode=35URODZINY

Mistrz Excela
https://www.udemy.com/mistrz-excela/?couponCode=35URODZINY

Dashboardy
https://www.udemy.com/course/excel-dashboardy/?couponCode=35URODZINY

Mistrz Formuł
https://www.udemy.com/course/excel-mistrz-formul/?couponCode=35URODZINY

VBA
https://www.udemy.com/course/excel-vba-makra/?couponCode=35URODZINY

Microsoft Power BI
https://www.udemy.com/course/power-bi-microsoft/?couponCode=35URODZINY

Książka Mistrz Excela reklama