Quantcast
Channel: Malinowy Excel
Viewing all 291 articles
Browse latest View live

Jak wykryć duplikaty na podstawie 2 kolumn?

$
0
0

Czyli formuła w formatowaniu warunkowym

Wyobraźmy sobie sytuację, w której prowadzimy spis projektów, przykładowo obiektów budowlanych, na budowę których sprzedajemy towary. Mamy więc listę, w której odnotowujemy projekty i uczestniczących w nich klientów. Zależy nam na tym, aby na tej liście każda para Projekt-Klient wystąpiła tylko raz. Nie chcemy powiem dublować danych. Chodzi o coś takiego:

Czyli jak dopisujemy do listy nowe dane: projekt i klienta, to Excel ma nam wykrywać, czy ich kombinacja już wcześniej nie wystąpiła. O tym jak to zrobić jest ten wpis.

Zapewne się już domyślasz, że do rozwiązania tego zadania użyję formatowania warunkowego. Gdyby w zadaniu chodziło o to, aby zaznaczyć tylko jedną kolumnę (my chcemy 2), w której są duplikaty – nie ma problemu, mamy od tego wbudowaną funkcjonalność. Jednak tutaj zadanie jest bardziej złożone: chcemy zaznaczyć 2 kolumny, których para definiuje wartość, która nie może się powtórzyć. Wracając do naszego przykładu: możemy mieć sytuację, że na jeden projekt kupuje kilku klientów, ale jeden klient w jednym projekcie może wystąpić tylko raz. To już nie będzie takie oczywiste i, aby to osiągnąć, napiszę formułę w formatowaniu warunkowym. Zacznijmy więc od tej formuły.

Formuła

Załóżmy, że jesteśmy w wierszu 10. arkusza i chcemy sprawdzić, czy wcześniej w tabeli wystąpiła już kombinacja projektu i klienta. Najpierw sprawdzimy, czy wystąpił już dany projekt, a potem klient. Przekładając to na język Excela: sprawdzimy, czy w zakresie B3:B9 wystąpił już projekt (i analogicznie dla klienta). Coś takiego umie zrobić funkcja LICZ.JEŻELI. Natomiast my tutaj potrzebujemy sprawdzić jednocześnie klienta, więc mamy de facto 2 warunki do sprawdzenia. To z kolei umie zrobić LICZ.WARUNKI, którą się tutaj posłużę. Sprawdzę, czy w dotychczasowym zakresie projektów wystąpił nasz wpisywany projekt i czy w dotychczasowym zakresie klientów – klient.

Formułę tworzę tradycyjnie dla pierwszego wiersza tabeli (gdzieś w komórce obok, np. I4). Pierwszym wierszem jest więc wiersz 4. (dla ułatwienia formuły). Dla niego więc dotychczasowym zakresem jest B3:B3. Natomiast dla kolejnego wiersza – 5., dotychczasowym zakresem jest zakres B3:B4 itd. Zauważ, że ten dotychczasowy zakres będzie nam się powiększał sukcesywnie. Samo z siebie się to nie zrobi, więc musimy odpowiednio zablokować komórki. Dodatkowo musimy pamiętać, że formuła ta ma funkcjonować w formatowaniu warunkowym na więcej niż jedną kolumnę (konkretnie na 2). To również należy uwzględnić w adresowaniu.

Sama funkcja jest taka:

=LICZ.WARUNKI(B3:B3;B4;C3:C3;C4)

Natomiast adresowanie powinno być następujące:

=LICZ.WARUNKI($B$3:$B3;$B4;$C$3:$C3;$C4)

Zauważ, że dla każdej pary zakresów jest identyczne. Dlaczego takie? $B$3:$B3 dlatego, że zawsze zaczynamy dotychczasowy zakres od pierwszej komórki, B3, więc musi ona być całkowicie zablokowana. Natomiast :$B3 jest dlatego, żeby formatowanie warunkowe działało prawidłowo: niezależnie od tego, która komórka ma zostać sformatowana – projektu zawsze będziemy szukać w kolumnie B. Dlatego właśnie ją blokujemy. Nie blokujemy zaś wiersza 3., ponieważ on ma się zmieniać, aby dotychczasowy zakres był dynamiczny. Jak widać cała magia tkwi w adresowaniu 🙂 (adresowania komórek możesz nauczyć się tutaj).

Dokładnie taką samą logikę stosujemy dla klienta – zauważ, że adresowanie jest analogiczne, tylko dla kolumny C.

Ok. Teraz robimy magię, czyli połączymy tę formułę z formatowaniem warunkowym. Do dzieła!

Formatowanie warunkowe

Teraz już łatwiejsza część: wklejenie formuły i wybór kolorków. Zanim jednak do tego przejdziemy, należy zaznaczyć zakres, którego ma dotyczyć formatowanie warunkowe. W naszym przypadku jest to zakres dwóch pierwszych kolumn tabeli, czyli B4:C9. Ważne jest tutaj, aby zakres ten zaznaczyć od początku, czyli od komórki B4, ponieważ za chwilę napiszemy regułę formatowania warunkowego, która musi być spójna z zaznaczeniem!

Następnie wybieramy Narzędzia główne/Formatowanie warunkowe/Nowa reguła…/Użyj formuły do określenia komórek, które należy sformatować (pkt. 1) i do okienka, które się pokaże (obrazek poniżej) wklejamy napisaną wcześniej formułę (pkt. 2).

Okienko formatowania warunkowego

Okienko formatowania warunkowego

Koniecznie pamiętaj też o ustawieniu kolorków, czyli formatowania, jakie ma zostać zastosowane, gdy warunek będzie spełniony, czyli gdy na liście będą duplikaty (pkt. 3).

Po naciśnięciu OK, jeśli na liście nie ma duplikatów, a tak jest w moim przykładzie), nie zobaczymy jeszcze żadnej różnicy. Zobaczymy ją dopiero, gdy dopiszemy projekt i klienta do listy. Natomiast, żeby też to zadziałało (na razie zdefiniowaliśmy formatowanie warunkowe tylko dla istniejącego zakresu, a nie do powiększonego o nowe wpisy), musimy stworzyć na naszym zakresie danych tabelę (obiekt tabela). Obiekt ten ma bowiem tę właściwość, że gdy dopiszemy pod nim dane – powiększa swój rozmiar i kopiuje istniejące formatowanie. I o to właśnie nam chodzi.

Tabela

Stworzenie tabeli to też pikuś – zanzaczamy dowolną komórkę naszego zakresu i naciskamy skrót klawiszowy Ctrl + t. Zatwierdzamy OK w okienku Tworzenie tabeli (koniecznie sprawdź, czy Excel prawidłowo rozpoznał, że Twoja tabela ma nagłówki!).

Tworzenie tabeli

Tworzenie tabeli

Teraz możemy dopisać nowe wartości i przetestować, czy się udało. Magia, prawda?

Wynik

Wynik

Polecam Ci zajrzeć tutaj:

 

A na koniec, jak zwykle, mam dla Ciebie plik z gotowcem do pobrania oraz film, na którym rozwiązuję opisane wyżej zagadnienie:

I wersja wideo:

 


TOP 3 wyniki sprzedaży

$
0
0

Czyli paski danych w formatowaniu warunkowym

Paski danych to cudowna opcja formatowania warunkowego, dostępna już od dłuższego czasu w Excelu. Dodanie jej do danych jest bardzo proste: wystarczy zaznaczyć dane, które chcemy sformatować i wybrać styl pasków, jaki nam się najbardziej podoba. Prościzna. Problem jednak pojawia się wtedy, gdy chcemy wyróżnić w ten sposób tylko kilka danych, np. 3 najlepsze. To już nie jest takie oczywiste. I dlatego napisałam ten wpis :).

Oto efekt, który chcę osiągnąć:

Wynik

Wynik

A dalej napisałam jak to zrobić. Enjoy!

Dodanie pasków danych

To zacznijmy od tej prościzny prościzny, czyli od dodania pasków danych. Chcemy je widzieć obok danych, po to, aby nam nie przesłaniały wartości. Dodam więc kolumnę pomocniczą, na formatce do kolumna F, w której umieszczę prostą formułę, będącą odwołaniem do komórek w kolumnie obok, E. W komórce F4 wpiszę:

=E4

Po skopiowaniu formuły w dół, mam taki efekt:

Kolumna pomocnicza

Kolumna pomocnicza

Tak na dobrą sprawę, to właśnie tę kolumnę będziemy formatować. To do dzieła!

1. Zaznacz dane w tej kolumnie (F4:F14).

2. Z menu Narzędzia główne/Fomratowanie warunkowe wybierz opcję Paski danych i wybierz styl pasków, który Ci się najbardziej podoba, np:

Wybór stylu pasków danych

Wybór stylu pasków danych

Efekt jest taki:

Dodanie pasków danych

Dodanie pasków danych

Gdybyśmy chcieli dodać tylko paski – to już mamy zrobione (obyłoby się nawet bez kolumny pośredniczącej). Natomiast wartości pod paskiem miało nie być widać, więc będziemy edytować tę regułę formatowania warunkowego. Aby to zrobić, wejdź tutaj: Narzędzia główne/Fomratowanie warunkowe/Zarządzaj regułami. Pojawi się Menedżer reguł formatowania warunkowego (koniecznie zwróć uwagę, z jakiego obszaru reguły edytujesz!):

Menedżer reguł formatowania warunkowego

Menedżer reguł formatowania warunkowego

Zaznacz ją na liście reguł i naciśnij przycisk Edytuj. W poniższym okienku zaznacz opcję Pokaz tylko pasek:

Pokaż tylko pasek

Pokaż tylko pasek

Efekt już będzie taki, jak chcieliśmy:

Pasek bez wartości

Pasek bez wartości

Do edytowania tej reguły jeszcze wrócimy, ale teraz zajmijmy się wyświetleniem tylko trzech najlepszych wartości.

Wyświetlenie TOP 3 wartości

… czyli kolejna reguła formatowania warunkowego, która będzie określana przez formułę. Jakie zadanie ma ta reguła? Chodzi o to, aby paski danych wyświetliły się tylko przy 3 najwyższych wartościach. Reszta ma zostać ukryta.

I tak właśnie zrobimy – “przykryjemy” niechciane paski danych innym formatowaniem komórki. Takim, którego jedynym działaniem jest niewyświetlanie wartości w komórce. Aby to prawidłowo zadziałało, wykorzystamy 2 właściwości formatowania warunkowego, o czym za chwilę.

Najpierw zdefiniujmy regułę. Ma ona sprawdzać, czy wartość komórki jest mniejsza niż trzecia największa wartość naszego zakresu. Jeśli jest – ma stosować formatowanie, czyli przykryć pasek danych.

Wyzwaniem będzie określenie owych trzech największych wartości. Tutaj z pomocą przyjdzie nam funkcja MAX.K. Zwykła funkcja MAX wyświetla po prostu największą wartość. MAX.K z kolei potrafi podać którąś z kolei największą, czyli np. trzecią. U nas w formatce pierwszą największą, czyli po prostu największą, jest 182, drugą największą jest 180, a trzecią – 170,4. I tak na prawdę ta ostatnia nas interesuje. A raczej interesują nas wszystkie od niej mniejsze, ponieważ właśnie te będziemy formatować. Czyli formuła w formatowaniu warunkowym będzie taka:

=F4<MAX.K($F$4:$F$14;3)

Dodajmy ją więc. Tylko uwaga: podstawowa zasada w formatowaniu w Excelu brzmi: zaznacz dane, które chcesz formatować. I tak w zwykłym formatowaniu nie ma znaczenia, od której komórki zaczniemy zaznaczać dane do sformatowania, to w formatowaniu warunkowym, gdy piszemy formułę, ma to znaczenie. ZAWSZE zaznaczamy od pierwszej komórki, która ma zostać sformatowana. Dlaczego? Ponieważ to tak, jakbyśmy pisali formułę, która odwołuje się do innych komórek. Ważne jest gdzie napiszemy tę formułę, aby jej wynik zobaczyć w określonym miejscu. Dokładnie tak samo jest w formatowaniu warunkowym.

Więc: zaznaczamy zakres F4:F14 i dodajemy regułę: Narzędzia główne/Fomratowanie warunkowe/Nowa reguła/Użyj formuły…:

Dodawanie drugiej reguły

Dodawanie drugiej reguły

W polu z formułą wklej wspomnianą wcześniej formułę (pkt. 2 na obrazku), a następnie kliknij przycisk Formatuj, aby określić formatowanie komórek, które ma być zastosowane. Co do zasady nie będzie tutaj żadnego formatowania komórki jako takiej (czyli np. koloru wypełnienia), tylko będziemy tutaj formatować wartość komórki tak, aby żadna wartość nie została wyświetlona. W tym celu, w okinku formatowania należy wejść do zakładki Liczby i wybrać kategorię Niestandardowe. Następnie, w polu Typ, wpisać takie formatowanie: ;;; Prezentuje to rysunek:

Formatowanie niestandardowe - ukrywanie wartości komórki

Formatowanie niestandardowe – ukrywanie wartości komórki

Po dodaniu tej reguły, efekt jest… uwaga… taki:

Nie widać różnicy!

Nie widać różnicy!

No właśnie: nie widać różnicy! Dlaczego? Zerknijmy do menedżera reguł:

Kolejność reguł

Kolejność reguł

Pierwszą regułą, czyli ważniejszą, jest reguła, którą przed chwilą dodaliśmy – ta o braku formatowania. I ona ma pierwszeństwo w przypadku konfliktu reguł. A tutaj konflikt zdecydowanie mamy. Dotyczy on komórek z wartością mniejszą niż 172,4 (MAX.K). Zgodnie z kolejnością, wartości są formatowane najpierw tak, jak mówi pierwsza, ważniejsza, reguła. Dopiero potem, jeśli jeszcze jest taka możliwość – stosowane są kolejne reguły, przy czym brane są pod uwagę tylko te elementy formatowania, których nie określiła ważniejsza reguła. A ponieważ, w naszym przypadku, wcześniejsza reguła określiła tylko sposób wyświetlania wartości, to wszystkie inne elementy są do wykorzystania. Stąd paski danych się wyświetlają, ponieważ pierwsza reguła nic o nich nie mówiła.

Dlatego nie widzimy różnicy.

Żeby jednak ją zobaczyć, chcemy powiedzieć Excelowi, że dla komórek, w których działa pierwsza reguła ma już nie stosować innych reguł formatowania. Do tego służy checkbox Zatrzymaj, gdy warunek jest prawdziwy. Należy więc zaznaczyć tę opcję przy pierwszej regule:

Zatrzymaj, gdy warunek jest prawdziwy

Zatrzymaj, gdy warunek jest prawdziwy

I wtedy efekt jest taki:

Efekt zatrzymania pozostałych warunków

Efekt zatrzymania pozostałych warunków

Tak na prawdę można by to już zostawić, ponieważ efekt został osiągnięty. Mnie jednak razi to, że prawie nie widać różnicy w długości pasków. Pobawię się więc skalą pasków (coś niedopuszczalnego w prawdziwych wykresach, ale tutaj sobie na to pozwolę, ponieważ paski danych mają tylko zwrócić uwagę na hierarchię wartości, a nie ich wartości). Zacznę od wartości, która jest czwartą największą, czyli taką, którą wskaże mi funkcja:

=MAX.K($E$4:$E$14;4)

Wskaże ona wartość 160 dla naszych danych i to jest dla mnie OK. Żeby skrócić oś pasków danych, należy edytować warunek formatowania warunkowego, zgodnie z obrazkiem:

Skrócenie osi pasków danych

Skrócenie osi pasków danych

Jako minimum wybrać formułę i wkleić tę powyższą do okienka wskazanego przez pkt. 2. na obrazku. BTW: tylko ten zabieg wystarczyłby do pokazania 3 największych wartości ;). Ale jak zwykle wszystko zależy od kontekstu, bo nie zawsze chcielibyśmy skracać skalę… Efekt jest taki:

Wynik

Wynik

Voila! Wszystko!

Oczywiście zaprezentowana metoda jest jednym z wielu pomysłów na rozwiązanie tego problemu. Do głowy przychodzi mi jeszcze co najmniej dwa. Jednak ten opisany bardzo chciałam Wam pokazać, ponieważ wykorzystuje on tę mało znaną opcję Zatrzymaj, gdy warunek jest prawdziwy. Mam nadzieję, że się przyda 🙂

PS Rety, to chyba wpis z największą ilością obrazków ;).

A tutaj jest plik z gotowcem do pobrania:
MalinowyExcel TOP3 wyniki sprzedaży dw.xlsx

A tutaj wersja wideo wpisu:

Chcesz lepiej poznać formatowanie warunkowe?

Zobacz nagranie z webinaru Formatowanie warunkowe!

 

Progi przeterminowanych faktur

$
0
0

Czyli grupowanie liczby dni przeterminowania

Prowadzimy listę faktur, na której kontrolujemy oczywiście ich terminy płatności. O tym, jak sprawdzić, czy faktura jest przeterminowana i zaznaczyć ją pięknym kolorkiem, już wcześniej pisałam. Dzisiaj natomiast będzie o tym, jak pogrupować przeterminowane faktury według liczby dni o jaką są przeterminowane. Konkretnie zastanowimy się nad formułą, ktą przy każdej fakturze określi jej status czy grupę przeterminowania, do której taka faktura należy. Otrzymane dane będzie można potem filtrować, sortować i oczywiście analizować formułami czy tabelą przestawną. Chcę otrzymać coś takiego:

Formatka z wynikiem

Formatka z wynikiem

Najpierw określimy liczbę dni, o jakie faktury są przeterminowane, a następnie owe grupy. Celowo wprowadziłam tutaj 2 kolumny, gdyż uważam, że informacja o liczbie dni przeterminowania jest istotna i użytkownik może chcieć ją znać. Oczywiście, jeśli tego nie będziecie potrzebować- wszystko można skompresować do jednej formuły i wyświetlić od razu grupę przeterminowania.

Tabela grup

Grupy będę ustalała wg takiej tabelki:

Tabela z grupami

Tabela z grupami

Czyli, jeśli faktura nie jest przeterminowana, czyli liczba dni przeterminowania wynosi 0 – trafi do grupy OK. Jeśli natomiast będzie przeterminowana od 1 dnia do 30 – trafi do grupy P30. Kolejny przedział to od 31 do 90 –> P90 itd. Jak będziesz tworzyć swoją tabelkę na podstawie mojej – koniecznie zwróć uwagę na przedziały, jakie trafiły do Excela (obrazek). W komórce/tabelce określamy bowiem dolną granicę przedziału. Górna zaś jest określana przez dolną granicę kolejnego przedziału. Uwaga, bo to jest tricky i jest związane z działaniem funkcji WYSZUKAJ.PIONOWO, której użyję do przypisania liczb do przedziałów (więcej o tym mówiłam podczas webinaru o WYSZUKAJ.PIONOWO).

Liczba dni przeterminowania

To mój ulubiony, chociaż bardzo prościutki moment. Najpierw określimy sobie, czy faktura w ogóle jest przeterminowana, a jeśli tak, to o ile dni. Informacja ta może przydać nam się do bieżących analiz czy po prostu do rozmowy z klientem-dłużnikiem. Dlatego poświęcam temu oddzielną kolumnę – nie ma co ich oszczędzać, mamy 16 384 kolumn w arkuszu ;).

Zakładam, że jeśli faktura jest zapłacona, czyli ma datę zapłaty, to nie jest przeterminowana. Zakładam tak nawet, gdyby została zapłacona po terminie, czyli analizujemy faktury niezapłacone na tę chwilę. Pozostałe faktury są niezapłacone, czyli będę dla nich badała ilość dni przeterminowania.

Formuła, która to sprawdzi jest następująca (komórka G6):

=JEŻELI(F6>0;0;MAX(0;$D$3-E6))

W pierwszej jej części sprawdzam, czy jest data zapłaty. Jeśli jest, oznacza to, że faktura została zapłacona, więc nie jest przeterminowana.

W drugiej części badam różnicę między datą dzisiejszą a terminem płatności. Różnicę umieściłam w funkcji MAX, ponieważ na liscie moga wystąpić faktury, które nie są przeterminowane, ale jeszcze nie są zapłacone. W takiej sytuacji dostałabym ujemną różnicę, czego nie chcę. Aby zaś w takich przypadkach dostać zero – każę funkcji MAX wybrać większą wartość z zera i wyniku różnicy.

Komentarza wymaga jeszcze dzisiejsza data. Umieściłam ją w komórce D3, zamiast użyć w formule funkcji DZIŚ(). Otrzymałabym ten sam wynik oczywiście, także śmiało tak zrób, jeśli wolisz. Ja wolę widzieć czarno na białym z jakiej daty korzystają formuły, dlatego użyłam do tego zewnętrznej komórki, którą w dodatku mogę ręcznie kontrolować w szczególnych wypadkach.

Oto wynik obliczeń:

Liczba dni przeterminowania

Liczba dni przeterminowania

Grupa przeterminowania

To już będzie pikuś, ponieważ praktycznie całą pracę zrobiliśmy w kroku wcześniej. Teraz tylko pozostaje przypisanie grupy przeterminowania na podstawie liczby, którą określiliśmy krok wcześniej. I jeszcze kwestia faktur już zapłaconych: jeśli chcemy nadać im szczególny status, np” zapłacono”, musimy wrzucić wszystko w funkcję JEŻELI. Jeśli status “OK” dla takich faktur jest OK, to wystarczy samo WYSZUKAJ.PIONOWO.

A formuła jest taka (komórka H6):

=JEŻELI(F6>0;"Zapłacono";WYSZUKAJ.PIONOWO(G6;$K$9:$L$14;2))

Czyli znowu, w pierwszym argumencie JEŻELI sprawdzamy, czy faktura jest zapłacona – jeśli tak, nadajemy jej status “Zapłacono”. Jeśli nie jest – przyporządkowujemy grupę przeterminowania funkcją WYSZUKAJ.PIONOWO.

Po skopiowaniu formuły w dół, otrzymujemy następujący efekt:

Wynik

Wynik

I to jest tyle. Prościutkie a jakże przydatne. Mam nadzieję! :). Co ciekawe taki sam mechanizm można zastosować do grupowania terminów płatności: na 30-dniowe, 90-dniowe itp. Excelowa funkcjonalność będzie taka sama.

 

I wersja wideo:

 

Chcesz lepiej poznać WYSZUKAJ.PIONOWO?

Zobacz nagranie z webinaru o WYSZUKAJ.PIONOWO!

 

 

 

Życzenia świąteczne

Suma przeterminowanych należności

$
0
0

Czyli coś, czego nie wiesz o SUMIE.WARUNKÓW

Tę funkcję wszyscy znają. Należy ona do TOP10, no może TOP20 najczęściej używanych funkcji w Excelu. SUMA.WARUNKÓW, bo o niej mowa, jest bardzo prosta i niesamowicie użyteczna. Problem pojawia się jednak, gdy za jej pomocą chcemy podsumować wartości na podstawie komórek, które… nie mają wartości, są PUSTE.

Jakie wtedy zastosować kryterium?

Odpowiem na to pytanie w tym odcinku na przykładzie określania sumy przeterminowanych należności. Oto formatka:

Formatka

Formatka

Do dzieła!

Najpierw określmy sobie, jakie należności będziemy traktowali jako przeterminowane. Na przykładzie powyższej formatki, ja widzę 2 warunki:

  1. Termin płatności już minął
  2. Faktura nie została zapłacona

Przekładając to na język Excela mamy odpowiednio:

  1. Data w kolumnie Termin płatności jest mniejsza od daty dzisiejszej (jeśli jest równa – dajemy klientowi szansę ;))
  2. Nie wpisano wartości w kolumnie Data zapłaty

W obu “językach”, ludzkim i excelowym, mamy 2 warunki. Czyli będziemy chcieli sumować wartości z kolumny Należność, jeśli oba powyższe warunki będą spełnione. Jest to idealny case do użycia funkcji SUMA.WARUNKÓW (gdyby był tylko jeden warunek – wystarczyłaby SUMA.JEŻELI).

Argumenty tej funkcji będą następujące:

  1. Należność – jako sumowana kolumna
  2. Termin płatności – jako kolumna dla pierwszego kryterium
  3. kryterium mówiące o tym, że termin płatności ma być mniejszy od dzisiejszej daty
  4. Data zapłaty -jako kolumna dla drugiego kryterium
  5. kryterium mówiące o tym, że ma być wpisana data zapłaty (zakładamy, że tutaj będą wpisywane tylko daty)

A formuła, która to wszystko robi wygląda tak:

=SUMA.WARUNKÓW(D7:D17;B7:B17;"<"&C3;C7:C17;"=")

Zwróć uwagę na ostatni argument: “=”, ponieważ to o niego tutaj się rozchodzi!

Dokładnie tak: jeśli w argumencie Kryterium wpiszesz “=” w jednej z tych funkcji: SUMA.WARUNKÓW, SUMA.JEŻELI, LICZ.WARUNKI, LICZ.JEŻELI, funkcje te zinterpretują to jako szukaj pustych komórek. Przyznam, że dość nieintuicyjne, ale cóż – that’s the way it is 🙂

Po wpisaniu formuły, otrzymamy taki wynik:

Wynik

Wynik: suma przeterminowanych należności

Rozwiązania alternatywne

Tę sytuację można rozwiązać oczywiście również za pomocą kolumny pośredniczącej, w której można umieścić funkcje JEŻELI i ORAZ i wyświetlić albo tę należność albo zero. Wyniki wtedy podsumujemy po prostu funkcją SUMA. To rozwiązanie byłoby przydatne, gdybyśmy potrzebowali mieć dodatkową informację, która należność jest przeterminowana (i ile).

Alternatywa z JEŻELI i ORAZ

Alternatywa wykorzystująca JEŻELI i ORAZ

Użyta w tym rozwiązaniu funkcja to:

=JEŻELI(ORAZ(B7<$C$3;C7="");D7;0)

Można też oczywiście zrobić tak, jak w tym wpisie – będziemy mieli wtedy informację o tym, która FV jest przeterminowana i to jeszcze zaznaczymy ją kolorem. Tutaj wystarczy SUMA.JEŻELI według statusu Przeterminowana (lekko zmodyfikowałam formatkę, żeby pasowała do case’a):

Alternatywa z SUMA.JEŻELI

Alternatywa z SUMA.JEŻELI

Formuła użyta we wskazanej komórce to po prostu:

=SUMA.JEŻELI(D6:D16;"przeterminowana";E6:E16)

Co kto lubi i potrzebuje :). Enjoy!

A oto wersja z gotowcem do pobrania:

I wersja wideo:

 

 

 

 

 

Dynamiczne etykiety na mapie

$
0
0

Czyli mapa zależna od wyboru na liście rozwijanej

Chcemy analizować poziom hałasu w wybranych miastach, w wybranych miesiącach. Tabelę z danymi mamy przygotowaną w arkuszu, jednak wyniki chcemy zwizualizować na mapie w miły dla oka sposób. Naszym celem jest, aby użytkownik wybierał z listy rozwijanej miesiąc analizy, a odpowiednie wartości poziomu hałasu dla miast wyświetlą się na mapie. Dodatkowo, od razu chcemy również zobaczyć w których miejscach poziom hałasu został przekroczony – wartość ma zostać wtedy zaznaczona na czerwono. Chodzi o taki efekt:

Mapa zależna od wyboru na liście rozwijanej

Na pierwszy rzut oka wydaje się to niesamowicie skomplikowane, jednak w wersji minimalnej wystarczy do tego formatowanie warunkowe i WYSZUKAJ.PIONOWO. Zobaczcie 🙂

Co jest potrzebne?

Potrzebujemy 4 elementów:

  1. Tabeli z danymi
  2. Mapy (w tym wypadku Polski)
  3. Listy rozwijanej
  4. Tabeli dla etykiet widocznych na mapie

Wszystkie te elementy mogą się znajdować w arkuszu z danymi, jednak aby uzyskać bardziej szpanerski efekt – wszelki elementy robocze, czyli tabele (pkt. 1. i 4.) warto umieścić w roboczym arkuszu.

1. Tabela z danymi, którą polecam umieścić w arkuszu roboczym (u mnie ten arkusz nazywa się Źródło), wygląda tak:

Tabela z danymi

Tabela z danymi

W kolumnach mamy miejscowości, które chcemy analizować, a w wierszach miesiące. Dodatkowo, poza tą tabelą jest komórka (C7) informująca o wartości granicznej hałasu: 40. Jeśli hałas będzie większy niż 40 – wartość pomiaru ma być podświetlana na czerwono.

2. Mapa, to element graficzny, zwykły obrazek jpg, png czy inny, który można wstawić do Excela. Ja wstawiłam go do arkusza głównego (u mnie nazywa się on Dane).

3. Lista rozwijana z miejscowościami. Tutaj mamy 2 opcje: sprawdzanie poprawności danych lub formant formularza (pole kombi). Obie listy zadziałają, natomiast trzeba będzie napisać nieco inne formuły, aby je wykorzystać. W obu opcjach podajemy jako źródło listy zakres miesięcy, czyli z arkusza Źródło: J6:J9.

a) Sprawdzanie poprawności (Dane/ Poprawność danych) ja umieściłam w arkuszu głównym (tam, gdzie jest mapa, Dane) do komórki C3:

Lista rozwijana ze sprawdzania poprawności

Lista rozwijana ze sprawdzania poprawności

b) Formant formularza (pole kombi), najlepiej umieścić na mapie, aby user miał od razu tytuł mapy. Łącze komórki proponuję dać w jakiejś komórce w arkuszu roboczym (Źródło), np. C9:

Lista rozwijana jako formant formularza

Lista rozwijana jako formant formularza

To, jaką listę rozwijaną wybierzesz zależy w zupełności od Ciebie. Obie zdadzą egzamin.

4. Tabela do etykiet, widocznych na mapie. Temu poświęcę cały następny podrozdział tego artykułu, zatem czytaj dalej 🙂

Przygotowanie etykiet – formuła

Cały trik naszej interaktywnej mapy polega na tym, że przygotujemy ładne, dynamiczne etykiety w zwyczajnych komórkach arkusza, a następnie wkleimy je specjalnie jako obraz połączony na mapę. Tyle tylko, że aby te etykiety były dynamiczne – muszą być oparte na formułach zależnych od wybory miesiąca prze usera. A żeby ładnie wyglądały – komórki, w których się znajdują też muszą ładnie wyglądać. I tym teraz się zajmiemy – najpierw formułą, a w kolejnym rozdziale – formatowaniem.

Niezależnie od tego, którą metodę listy rozwijanej wybraliśmy – etykiety trzeba zrobić i ja umieszczę je w arkuszu roboczym (Źródło), w komórkach C4:H4:

Tabela etykiet

Tabela etykiet – formatka

Zauważ, że kolumny tabeli zostały ponumerowane w wierszu 2. – będzie to potrzebne funkcji, którą zaraz użyjemy.

BTW: poniżej tej tabeli widać komórkę, w której zdefiniowane jest przekroczenie normy hałasu (C7).

a) Formuła dla listy rozwijanej: sprawdzanie poprawności

Ponieważ jestem zwolenniczką prostoty – opiszę najprostszą formułę, która wyświetli pomiar hałasu w zależności od wybranego przez usera miesiąca. Użyję bowiem WYSZUKAJ.PIONOWO.

Ta funkcja będzie szukała w tabeli z danymi (na początku artykułu) miesiąca wybranego przez usera i wyświetlała wartość poziomu hałasu dla wybranej miejscowości. Ale której miejscowości? Przecież mamy ich 6. Tak, i po to właśnie nam jest 6 komórek dla sześciu etykiet. Pierwsza komórka wyświetli wartość dla Warszawy, kolejna dla Łodzi itd. Stąd potrzebne nam będą numery kolumn tabeli z danymi, w której znajdują się miejscowości. Numery te mamy wpisane w wierszu drugim, nad naszymi etykietami, i do tego wiersza odwołamy się w WYSZUKAJ.PIONOWO. Wartości te wpisałam ręcznie – najprostsze rozwiązanie. I tak wiem: sztywne, natomiast ja nie planuję tutaj nić zmieniać i jednocześnie oszczędzę Excelowi pracę w postaci wyliczenia tego numerka ;).

Zatem do komórek C4:H7 wpiszemy następującą formułę:

=WYSZUKAJ.PIONOWO(Dane!$C$3;Źródło!$J$6:$P$9;C2;0)

Szukamy wartości wybranej przez usera (Dane!$C$3), w tabeli z danymi (Źródło!$J$6:$P$9), wyświetlamy wartość z kolumny o numerze, znajdującym się w komórce powyżej (C2) i szukamy dokładnie.

Oczywiście numer kolumny możesz znaleźć funkcją PODAJ.POZYCJĘ i wtedy formuła będzie wyglądała tak:

=WYSZUKAJ.PIONOWO(Dane!$C$3;Źródło!$J$6:$P$9;PODAJ.POZYCJĘ(C3;$J$5:$P$5;0);0)

Albo oczywiście wersja z funkcją INDEKS:

=INDEKS($K$6:$P$9;PODAJ.POZYCJĘ(Dane!$C$3;$J$6:$J$9;0);PODAJ.POZYCJĘ(C3;$K$5:$P$5;0))

Wszystkie wersje zwrócą te same wyniki.

b) Formuła dla listy rozwijanej: formant formularza (pole kombi)

Jeśli wolisz opcję z formantem formularza – formuła będzie miała jedną modyfikację: będziemy musieli odnaleźć słowną wersję miesiąca, wybraną przez usera z listy rozwijanej. W poprzedniej wersji mieliśmy ją podaną na tacy – teraz musimy sobie odszukać sami. Pomoże nam w tym funkcja INDEKS, którą zagnieździmy w WYSZUKAJ.PIONOWO. Formuła będzie taka:

=WYSZUKAJ.PIONOWO(INDEKS($J$6:$J$9;$C$9);Źródło!$J$6:$P$9;C2;0)

Niezależnie od tego, jaką opcję wybierzemy, uzyskamy następujący efekt:

Tabela etykiet - wynik formuły

Tabela etykiet – wynik formuły

Formatowanie warunkowe: przekroczenie

Jednak żeby spełnić wymaganie, że etykiety mają być kolorowane na czerwono w przypadku przekroczenia normy (40 – komórka C7), dodajmy do nich bardzo prościutkie formatowanie warunkowe. Niech wypełnienie komórki będzie czerwone, gdy jej wartość jest większa niż 40.

Narzędzia główne/ Formatowanie warunkowe/ Reguły wyróżniania komórek/ Większe niż…:

Tworzenie formatowania warunkowego

Tworzenie formatowania warunkowego

Zwróć uwagę, że odwołałam się do komórki C7, gdyż zawiera ona wartość graniczną: 40. Jeśli masz pewność, że ta wartość się nie zmieni – możesz ją wpisać z palca do tego okienka. Ja jednak lubię widzieć od razu wartości defninicyjne :).

Po zatwierdzeniu uzyskamy taki efekt:

Tabela etykiet z formatowaniem warunkowym

Tabela etykiet z formatowaniem warunkowym

Naniesienie etykiet na mapę

Teraz pozostaje nam już tylko nanieść nasze piękne i kolorowe etykiety na mapę. To zrobimy ręcznie. Opiszę to na przykładzie Warszawy.

  1. Zaznaczam komórkę C4, gdyż to jest moja etykieta dla Warszawy.
  2. Kopiuję ją, Ctrl + C.
  3. Przechodzę do arkusza z mapą i wklejam skopiowaną komórkę specjalnie, czyli: klikam prawym przyciskiem myszy na dowolną komórkę i z menu kontekstowego wybieram opcję Wklej jako obraz połączony:
Wklejanie etykiety jako obraz połączony

Wklejanie etykiety jako obraz połączony

4. Umieszczam etykietę na mapie w tym miejscu, gdzie powinna być.

Te czynności powtarzamy dla wszystkich etykiet.

Na koniec tylko polecam wszystkie elementy: etykiety i mapę zgrupować, aby stanowiły jeden obiekt. Aby to zrobić należy je zaznaczyć (przytrzymując klawisz Ctrl). Następnie klikamy na to zaznaczenie prawym przyciskiem myszy i wybieramy opcję Grupuj.

Jeśli zaś chcesz mieć jeszcze inteaktywny tytuł mapy, wyświetlający np. nazwę wybranego miesiąca – wstaw na mapie kształt, np. prostokąt i postępuj tak, jakbyś tworzył dynamiczny tytuł wykresu (czynności te opisałam tutaj).

Tyle – mówiłam, że będzie łatwe? :). Pozostaje nam teraz cieszyć się cudowną interaktywną mapą :).

Na koniec mam do Ciebie prośbę: pomożesz mi dotrzeć z tym artykułem do szerszego grona? Jeśli zechcesz udostępnić ten artykuł na Facebooku – będę Ci bardzo wdzięczna! Bardzo się starałam, aby ten artykuł był dla Ciebie na tyle wartościowy, by wart był wzmianki ;). Oczywiście śmiało podeślij go innym osobom mailem lub Messengerem. Będzie mi bardzo miło:)

 

Jeszcze plik z gotowcem do pobrania:MalinowyExcel Dynamiczne etykiety na mapie dw.xlsx

I wersja wideo wpisu:

 

 

Zapisz plik jako PDF z dzisiejszą datą w nazwie (VBA)

$
0
0

Czyli trochę o tekstach i datach w VBA

Jakiś czas temu, w tym wpisie, opisywałam makro, które zapisywało plik Excela jako PDF w tym samym katalogu, co ten plik Excela. Samo zapisywanie jako PDF sztuką nie było – można to sobie nawet nagrać 😉 – jednak już określenie miejsca zapisu pliku stanowiło większe wyzwanie.

Dziś z kolei rozbuduję to makro tak, aby jeszcze zapisywało ów PDF z nazwą zawierającą dzisiejszą datę. Albo tylko miesiąc, jak kto woli – metoda będzie taka sama.

Wynik

Wynik

Poprzednie rozwiązanie (dokładnie opisałam je tutaj, łącznie z tworzeniem nowego modułu), które zapisywało plik w tym samym folderze, pod nazwą zawierającą nazwę klienta, wyglądało tak:

Sub MojPDF()
    Dim Sciezka As String, Klient As String
    
    Sciezka = ThisWorkbook.Path & "\"
    Klient = ActiveSheet.Range("Klient").Value

    If Klient = "" Then Klient = "Klient"
    
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        Sciezka & Klient & ".pdf", _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=True
End Sub

Teraz tylko trochę je zmodyfikujemy. Modyfikacja będzie polegała na dodaniu zmiennej NazwaPliku, która będzie przechowywała ciąg tekstowy oznaczający nazwę pliku oczywiście. Użyję tej zmiennej po to, aby kod był bardziej czytelny. Linijka z deklaracjami zmiennych wygląda więc teraz tak:

Dim Sciezka As String, Klient As String, NazwaPliku As String

Następnie trzeba określić wartość nowej zmiennej, czyli ustalić, jak ma się nazywać plik. To, że nazywa się jak klient jest OK, więc zostawiam. Dodam natomiast dzisiejszą datę. Posłuży mi do tego funkcja Date. Jest to visualbasicowy odpowiednik excelowej funkcji DZIŚ.

Dodatkowo, żeby data została odpowiednio sformatowana (chcę, aby wyświetlony był najpierw rok, potem miesiąc a na końcu dzień, bez żadnych separatorów) – wrzucę ją do funkcji Format. I znów – jest to visualbasicowy odpowiednim excelowego TEKSTu. Ten fragment kodu wygląda tak:

NazwaPliku = Sciezka & Klient & Format(Date, "yyyymmdd") & ".pdf"

Drugim argumentem funkcji Format jest format naszej daty. Jeśli chcesz ją wyświetlić w jakiś inny sposób – tutaj jest miejsce na modyfikację. MOżesz np. wyświetlić tylko miesiąc i wtedy wpiszesz: “mm” itd.

Na koniec to już tylko podstawienie naszej nazwy do fragmentu generującego PDF. Całość kodu wygląda tak:

Sub MojPDF()
     Dim Sciezka As String, Klient As String, NazwaPliku As String
     
     Sciezka = ThisWorkbook.Path & "\"
     Klient = ActiveSheet.Range("Klient").Value
    
     If Klient = "" Then Klient = "Klient"
     
     NazwaPliku = Sciezka & Klient & Format(Date, "yyyymmdd") & ".pdf"
     
     ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
     NazwaPliku, _
     Quality:=xlQualityStandard, _
     IncludeDocProperties:=True, _
     IgnorePrintAreas:=False, _
     OpenAfterPublish:=True
End Sub

Pamiętaj koniecznie, aby plik z tym makrem zapisać jako plik z obsługa makr, czyli xlsm lub xlsb.

I to tyle! Mam nadzieję, że przyda Ci się zaprezentowana rozwiązanie. Jeśli znasz kogoś, komu też może się przydać – mam do Ciebie gorącą prośbę: udostępnij proszę mu/jej ten wpis mailem, na Facebooku czy w Messengerze. Razem będziemy szerzyć excelową wiedzę i pokażemy, że nie taki Excel straszny ;).

 

I plik xlsm  do pobrania (pamiętaj o włączeniu makr!):

MalinowyExcel VBA Zapisz plik jako PDF z dzisiejszą datą w nazwie dw.zip

Przycisk opcji nie działa w chronionym arkuszu!

$
0
0

Czyli nie zawsze jest tak, jak nam się wydaje, a Excel prawdę Ci powie

Tworząc formularze w Excelu zazwyczaj chcemy je później ochronić, aby użytkownicy nic w nich nie napsuli. W tym celu korzystamy oczywiście z ochrony arkusza. Wszystko ładnie pięknie, natomiast gdy tę ochronę zakładamy, to… formularz nagle przestaje nam działać i pojawia się komunikat o chronionej komórce! Pokazuje to poniższy obrazek:

Ale czy to na pewno jest tak, że to formularz, a konkretnie formanty formularza, przestają działać? Dlaczego w takim razie Excel krzyczy, że komórka jest chroniona? Jest na to bardzo prosta odpowiedź, jednocześnie pokazująca, że często problem tkwi zupełnie gdzieś indziej, niż nam się wydaje.

Taki komunikat: Komórka lub wykres, które próbujesz zmienić, są w arkuszu chronionym. Aby wprowadzić zmianę, wyłącz ochronę arkusza. Może zostać wyświetlona prośba o wprowadzenie hasła pojawia się zawsze wtedy, gdy chcemy zmienić wartość zablokowanej komórki. Może tego na pierwszy rzut oka nie widać (i to nas myli!), ale faktycznie chcemy to tutaj zrobić.

Komunikat

Komunikat

Działa to tak: każdy formant formularza podpięty jest do komórki, która wyświetla wartość, oznaczającą wybór użytkownika (tzw. łącze komórki). W zależności od formantu – może to być inna wartość: liczba, PRAWDA/FAŁSZ. Na formatce komórki te ukryłam, ponieważ nie chciałam pokazywać userowi kuchni mojego formularza. Jednak po odkryciu wszystko wygląda tak:

Kuchnia

Kuchnia

Czyli user widzi tylko kolumny A:G, a cała kuchnia, łącznie z komórkami-łączami dla formantów, jest w pozostałych kolumnach. Są one ukryte, żeby user widział tylko to, co go interesuje. Natomiast formularz działa tak, że jeśli user zaznaczy, że jest np. kobietą – do żółtej komórki I4 zostanie wpisana jedynka (1). Jeśli wybierze mężczyznę – do tej samej komórki zostanie wpisana dwójka (2).

Identycznie działa wiek – tylko w komórce I12. User zaznacza opcję i, nawet o tym nie wiedząc, modyfikuje żółte komórki. I wszystko to działa, jeśli arkusz nie jest chroniony. Jeśli jednak założymy ochronę – żółte komórki, domyślnie zablokowane, stają się niemodyfikowalne. I to one powodują wygenerowanie wspomnianego wcześniej komunikatu. Gdyby komórki nie były podpięte do formantów – taki komunikat nie wyświetlałby się. Należy więc odblokować te komórki. Robimy to tak:

  1. Zdejmij ochronę arkusza, jeśli jest założona
  2. Zaznacz komórki, które mają być odblokowane (żółte)
  3. Wejdź do okienka Formatowanie komórki, które można wywołać skrótem klawiszowym Ctrl +1.
  4. Na karcie Ochrona, należy dla obu żółtych komórek, odznaczyć opcję Zablokuj:
Odblokowywanie komórki

Odblokowywanie komórki

Potem należy tylko jeszcze założyć ochronę na arkusz, czyli np. Recenzja/Chroń arkusz. Dopiero teraz wszystko będzie śmigać.

Mam nadzieję, że pomogłam Ci tą poradą. Jeśli tak, albo jeśli znasz kogoś, komu informacje zawarte w tym artykule mogą się przydać – udostępnij proszę ten wpis. Na Facebooku, Messengerze czy po prostu mailem :). Będę Ci bardzo wdzięczna i ta osoba z pewnością też. W szkole na pewno tego nie uczyli, a w życiu się przydaje!

 

Prezentowany w tym wpisie, gotowy formularz możesz pobrać tutaj:

Malinowy Excel Pole opcji nie działa w chronionym arkuszu n dw.xlsx

A tutaj jest wersja wideo:

 

 


Jak nie wyświetlać napisu (puste) w tabeli przestawnej?

$
0
0

Czyli czasem trzeba trochę oszukać 🙂

Mamy dane źródłowe, z których chcemy stworzyć tabelę przestawną. Są to dane sprzedażowe: produkty, ilości, wartości, kategorie tych produktów… Nie wszystkie jednak kategorie są uzupełnione w źródle (żółte pola po lewej), co tabela przestawna wyświetla tak, jak na obrazku poniżej (żółte pole po prawej):

Formatka

Formatka

Wszystko ok, kategorie dla czekolad faktycznie są puste, ale na raporcie nie chcemy, aby ten zapis (puste) się wyświetlał. Chcemy, aby kategoria faktycznie była pusta, czyli żeby nic w komórce nie było napisane. Jak to zrobić? Czytaj dalej 🙂

Opcja tabeli przestawnej?

Pierwsze, co przychodzi nam do głowy, to: na pewno jest jakaś opcja tabeli przestawnej. Szukamy i szukamy i znajdujemy to:

Opcje tabeli przestawnej

Opcje tabeli przestawnej

Problem jest jednak, że to nic nie daje ;(.

(BTW: ta opcja umożliwia pokazanie określonej przez użytkownika wartości w komórkach w polu wartości tabeli przestawnej, gdy nie ma w niej wartości, np. czekolady nie sprzedawały się w styczniu, tabela domyślnie nic nie wyświetla na przecięciu pól: Czekolada i Styczeń, ta opcja jednak umożliwia, aby wyświetlić tam np. 0).

To więc nie działa, więc co? Jeśli nie ma do czegoś opcji, tak, jak w tym przypadku, pozostaje nam już tylko… oszukiwanie :). Czyli Excel wpisze do komórki wartość (puste), ale my zrobimy tak, aby jej nie było widać. “We cheated“, jak to powiedział szef animatorów trzeciej części Harry’ego Pottera, kiedy okazało się, że aby hipogryf mógł faktycznie latać, animatorzy muszą mu zrobić tak duże skrzydła, że po ich złożeniu szurałby nimi o ziemię. Zrobili więc tak, że jak hipogryf latał – miał skrzydła odpowiedniej wielkości, rzeczywiste. A jak był na ziemi – zmniejszyli mu je. My zrobimy podobny manewr w Excelu.

 

Formatowanie warunkowe

Moje ukochane i niezastąpione! Przychodzą mi 2 rozwiązania tego problemu za pomocą formatowania warunkowego. Do wyboru do koloru. To, które z nich wybierzemy jak zwykle zależy od sytuacji.

Czyli mamy taką tabelę przestawną:

Widać (puste)

Widać (puste)

1. Zaznaczamy pole kategorii, czyli zakres I4:I13 (możemy to zrobić najeżdżając myszką od góry na słowo Kategoria, i kliknąć lewym przyciskiem myszki).

2. Wchodzimy do formatowania warunkowego, czyli Narzędzia główne/ Formatowanie warunkowe/ Nowa reguła

3. I wybieramy, jak na obrazku: Formatuj tylko komórki zawierające/ Wartość komórki jest równa (puste) 

3. Następnie klikamy przycisk Formatu, aby określić formatowanie, jakie ma zostać zastosowane do tych komórek, gdy warunek jest prawdziwy. Ja proponuję następujące: formatowanie niestandardowe

# ##0;-# ##0;0;

albo

Standardowy;Standardowy;0;
Formatowanie niestandardowe

Formatowanie niestandardowe

Czyli korzystamy z formatowania niestandardowego, aby ukryć tekst – zobacz, że po ostatnim średniku (w obu wariantach) nic nie jest napisane.

Możemy też zastosować inne formatowania – jeśli wiemy, że kolor komórek to przezroczysty (domyślnie nie mają koloru) lub biały, możemy po prostu czcionkę pokolorować na biało:

Biała czcionka

Biała czcionka

I to cały trik. Efekt, w obu przypadkach, dostajemy taki:

Wynik

Wynik

Tylko i aż tyle! Mam nadzieję, że to rozwiązanie pomoże Ci w pracy z tabelami przestawnymi. Jeśli tak, albo jeśli znasz kogoś, komu może pomóc – proszę udostępnij jej/mu ten wpis. Dzięki temu wiedza ta, wcale nieoczywista, dotrze do szerszego grona osób, które chcą usprawniać swoją pracę :). Dziękuję!

A tutaj plik z rozwiązaniem do pobrania: MalinowyExcel TP niewyświetlanie (puste) dw.xlsx

 

I film na YB (pojawi się wkrótce).

Zapisz plik pod nazwą wskazaną w komórce (VBA)

$
0
0

Czyli trochę o “zabijaniu” plików

Naszym celem jest to, aby za każdym razem, gdy będziemy zamykać plik – zapisywał się on pod nazwą wskazaną w jednej z komórek arkusza. Formatka zawiera więc tylko tę komórkę, która zawiera przyszłą nazwę pliku:

Formatka

Formatka

Komórkę tę warto nazwać, aby ułatwić namierzanie jej w kodzie VBA, bo taki właśnie będziemy pisać, aby rozwiązać to zadanie. Komórkę nazwałam jako “Komorka” i takiego odwołania do niej będę używała dalej (tutaj, w sekcji Nazywanie komórek, dowiesz się jak nazywać komórki).

Rozwiązanie będzie bazowało na zdarzeniu skoroszytu BeforeClose. Tworzenie zdarzenia skoroszytu (Workbook) opisałam tutaj. W naszym przypadku trzeba będzie tylko wybrać zdarzenie BeforeClose.

Teraz już czas na kod.

Potrzebujemy 3 zmiennych:

  1. NowaNazwa
  2. Sciezka
  3. StaraNazwa

Wszystkie tekstowe, czyli typu String.

Czemu akurat takie? Ponieważ nasze makro będzie działało tak, że przed zamknięciem pliku zapisze go pod nową nazwą (opcja: zapisz jako), a następnie stary plik usunie. Usuwanie oczywiście można pominąć, jeśli chcemy tworzyć backup poprzednich plików – ja osobiście bym tak wolała. Będzie to kwestia jednej linijki kodu i to, czy ją pisać czy nie, zostawię Tobie, drogi Czytelniku :).

Żeby to zapisywanie (w odpowiednim miejscu!) i usuwanie działało, należy znać starą nazwę (aby wiedzieć, co usuwać), nową nazwę – żeby wiedzieć jak nazwać nowy plik, i ścieżkę, aby wiedzieć gdzie to wszystko ma się dziać (oczywiście w bieżącym folderze).

Mamy więc deklarację zmiennych i przypisywanie do nich wartości:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim NowaNazwa As String, Sciezka As String, StaraNazwa As String
       
    StaraNazwa = ThisWorkbook.Name
    NowaNazwa = Dane.Range("Komorka") & ".xlsm"
    Sciezka = ThisWorkbook.Path & "\"
    
End Sub

W sytuacji, gdy nowy i stary plik mają tę samą nazwę (zakładam, że może się zdarzyć taka sytuacja) – nie będziemy wykonywać żadnej operacji, ponieważ nazwa pliku jest poprawna. Przerwiemy wtedy działanie makra. Robi to poniższa linijka:

    If NowaNazwa = StaraNazwa Then Exit Sub

Jeśli jednak nazwy się różnią (o to w sumie chodzi), zostaje teraz już zapisanie pliku pod nową nazwą (Zapisz jako):

    ThisWorkbook.SaveAs Sciezka & NowaNazwa

… i skasowanie poprzedniego pliku (jeśli nie chcesz kasować – tej linijki nie pisz):

    Kill Sciezka & StaraNazwa

Śmieszna instrukcja, prawda? 🙂 Tylko uwaga! Bardzo niebezpieczna, ponieważ ona po prostu usuwa plik z dysku! BTW: dlatego też w pliku do pobrania, który znajdziesz pod koniec artykuły, w kodzie nie ma tej linijki, aby Twój antywirus nie zablokował pobierania ;). Bezpieczeństwo przede wszystkim!

Jeszcze do tego kodu warto dodać wyłączanie komunikatów np. o nadpisaniu pliku (gdy nowy i stary mają tę samą nazwę). Wszystko razem wygląda tak:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim NowaNazwa As String, Sciezka As String, StaraNazwa As String
    
    StaraNazwa = ThisWorkbook.Name
    NowaNazwa = Dane.Range("Komorka") & ".xlsm"
    Sciezka = ThisWorkbook.Path & "\"
    
    If NowaNazwa = StaraNazwa Then Exit Sub
    
    Application.DisplayAlerts = False
    
    ThisWorkbook.SaveAs Sciezka & NowaNazwa
    Kill Sciezka & StaraNazwa
    
    Application.DisplayAlerts = True
End Sub

PS W każdym miejscu tego kodu, gdzie występuje ThisWorkbook, można użyć słówka kluczowego me. W tym przypadku będzie ono oznaczało to samo.

Wrzucam jeszcze screen edytora – zwróć szczególną uwagę na zaznaczone fragmenty:

Kod w edytorze

Kod w edytorze

Mam nadzieję, że opisane powyżej makro ułatwi Ci pracę. Jeśli znajdziesz w nim wartość – miło mi będzie, jak udostępnisz ten wpis innym. Może im też się przyda? Może spędzili dużo czas i przeszukali pół Internetu, żeby znaleźć takie rozwiązanie? A może tak było w Twoim przypadku, to wiesz o co chodzi 😉 Tym bardziej więc udostępnij proszę ten wpis! Razem możemy im ułatwić innym życie 🙂
A oto plik do pobrania (nie zawiera instrukcji kasującej plik!):
MalinowyExcel Zapisz plik pod nazwą wskazaną w komórce VBA dw.zip

I wideo:

(pojawi się wkrótce)

 

 

 

WEBINAR: Formatowanie niestandardowe

Wstaw do Excela nietypowe symbole ▲ ▼

$
0
0

Czyli wszystko masz na klawiaturze…

Czasem chcemy wstawić do Excela niestandardowe znaki, aby urozmaicić nasze arkusze. Często są to choćby strzałki w górę czy w dół, oznaczające wzrosty i spadki sprzedaży. Możemy do tego użyć formatowania warunkowego – tam mamy już gotowe zestawy ikon. Nie zawsze jednak chcemy to robić, gdyż np. chcemy użyć innej funkcjonalności (tu: formatowanie niestandardowe) czy po prostu chcemy użyć innych symboli niż te ikony.

Jak więc zrobić coś takiego?:

Formatka

Formatka

Można te symbole odszukać w sieci, wstawić z dokumentu Worda, w którym one już są, albo… odpowiednio skorzystać z własnej klawiatury! O tym ostatnim będzie ten wpis 🙂

Generalnie chodzi o to, że każdy znak ma swój kod w systemie znaków Unicode. I tak np. mała litera u ma kod 117, a wielka U – 85. Oczywiście, w przypadku takich liter nikt normalny nie korzysta z tych kodów, wręcz nie wiemy, że one w ogóle istnieją! Dlaczego? Bo łatwiej nacisnąć odpowiedni znak na klawiaturze, żeby takie litery wstawić.

No ale właśnie! Jak naciśniemy po prostu literę u – wstawimy małe u. A do wielkiego trzeba już kombinacji klawiszy Shift + u. Czyli schody, ale jeszcze do ogarnięcia (podobnie jest choćby z polskimi literami).

Gorzej się robi, gdy chcemy wstawić znak paragrafu: §, bo takiego na klawiaturze nie ma. Nie ma, bo klawiatura musiałaby być mega-wielka, gdyby miała pomieścić wszystkie znaki ze wszystkich języków (a w dzisiejszych czasach jeszcze wszechobecne buźki :)! Są na niej więc te najpotrzebniejsze. Ale pozostałe też da się wywołać i zaraz pokażę jak. W tym miejscu skończę już opowiadanie o znakach na klawiaturze – jeśli jednak chcesz dowiedzieć się czegoś więcej o całej logice kodowania znaków – polecam Ci stronę Piotrka, a konkretnie ten wpis: ISO, ASCII, UNICODE – kodowanie znaków. Wyjaśnia on tam, w bardzo prostych słowach, o co chodzi w całym temacie.

A my tymczasem przechodzimy do zadania w Excelu – sposób wstawiania znaków wplotę bowiem w realny case, który zresztą poruszałam na webinarze o formatowaniu warunkowym, który prowadziłam w lutym 2019.

Treść zadania

Chodzi o to, aby zaznaczyć graficznie – zieloną lub czerwoną strzałką góra/dół – odchylenia sprzedaży większe niż 5% (czyli >5% i <-5%). Efekt ma być taki:

Formatka

Formatka

Formatowanie niestandardowe

Całe rozwiązanie to będzie napisanie odpowiedniego formatowania niestandardowego, które wykorzystuje przedziały liczbowe. Zanim jednak zrobimy format – najpierw trzeba mieć co formatować. Będą to odchyulenia sprzedaży, natomiast nie te, które są w zestawieniu w kolumnie E, tylko dopiszemy identyczne obok – do kolumny F (jak na rysunku formatki). Załatwi nam to formuła w zakresie F4:F15:

=E4

I ją właśnie będziemy formatować.

Zaznaczamy więc wszystko to, co chcemy sformatować (F4:F15) i wchodzimy do formatu komórki, czyli Ctrl + 1. Zastosujemy tutaj formatowanie niestandardowe z warunkami. Składnia tego formatowania będzie następująca (więcej o formatowaniu niestandardowym opowiadałam podczas webinaru – zresztą w odpowiedzi na pytanie jednego z jego uczestników powstał ten artykuł):

Składnia formatowania niestandardowego

W okienku formatowania idziemy do kategorii Niestandardowe i w pole Typ wpisujemy następujący format:

Typ formatowania

Typ formatowania

Kody Alt z klawiatury

Ale, ale! Jak wpisać te trójkąciki? I tutaj dochodzimy do sedna :). Otóż! Trójkącik czy też strzałka w górę ma kod 30, a strzałka w dół – 31. I te kody wpisujemy z klawiatury numerycznej jednocześnie przytrzymując lewy alt. Czyli:

▲: Alt + 30

▼: Alt + 31

I voila! Po sprawie :). Takie to proste! Ja jeszcze lubię i używam ►, czyli Alt + 16, a dla kompletu strzałek została nam jeszcze ◄, czyli Alt + 17.

BTW §, czyli paragraf czy też znak sekcji to Alt + 0167.

Uwaga: opisana zaraz metoda działa pod Windowsem.

Ale skąd mam wiedzieć jaki kod ma mój symbol?

Oczywiście z Internetu :). Ja ze swojej strony polecam Ci https://www.alt-codes.net/. Tam wszystko jest bardzo pięknie pokazane, pogrupowane w kategorie. Cud miód!

Na koniec tradycyjnie plik z gotowcem do pobrania:

MalinowyExcel Wstaw niestandardowy symbol do Excela dw.xlsx

I wideo (ukaże się wkrótce):

 

Wpis ten powstał w nawiązaniu do webinaru o formatowaniu warunkowym, który prowadziłam na żywo 27 lutego 2019 roku. Webinar znajdziesz tutaj.

 

 

Archiwizuj wybrane rekordy tabeli (VBA)

$
0
0

Czyli jak makra mogą ułatwić nam życie

Często (jak nie zawsze!), gdy wykonujemy powtarzającą się czynność, zaczyna nam się ona nużyć i denerwuje nas, że ją po raz kolejny wykonujemy. I to niezależnie od tego, czy jest to bardzo prosta czynność, czy skomplikowana. Powiem wręcz tak: im łatwiejsza ta czynność, tym bardziej zaczyna nas denerwować i chcemy, żeby działa się sama. I tak np., gdy chcemy piszemy formułę, którą potem chcemy skopiować, po zatwierdzeniu jej Enterem – zaznaczenie schodzi do komórki niżej. Aby więc skopiować tę formułę – musimy kliknąć na komórkę wyżej, a dopiero potem kopiować. I to ponowne zaznaczanie, ten jeden dodatkowy klik, maksymalnie działa nam na nerwy! BTW, wystarczy zatwierdzić wpis Ctrl + Enter, to zostaniemy w tej samej komórce ;).

Podobnie jest z nieco bardziej skomplikowanymi tematami. Załóżmy, że prowadzimy rejestr obsługiwanych zamówień i chcemy archiwizować te zrealizowane. W danych mamy ostatnią kolumnę Wykonane (x) (H), w której wpisujemy znak “x”, co ma oznaczać, ze dane zamówienie jest już zrealizowane. Następnie rekord tego zamówienia kopiujemy do archiwum, czyli arkusza Hist w tym samym pliku (można byłoby się pokusić od razu o usuwanie takiego rekordu ;)). Dane kopiowane są do pierwszego wolnego wiersza.

Prosta czynność, która może zostać z łatwością zautomatyzowana. I tym właśnie zajmę się w tym artykule. Napiszę makro mające na celu archiwizowanie danych, czyli z tabeli w arkuszu Dane będzie kopiowało rekordy do pierwszego wolnego wiersza arkusza Hist. Efekt będzie taki:

Do dzieła!

Formatka wygląda tak:

Formatka

Formatka

Ponieważ lubię prostotę, to na początek jednak założenia:

  1. Znak “x” wstawiamy w kolumnie H (Wykonane (x))
  2. Kopiujemy dane do arkusza Hist, w którym jest już nagłówek tabeli, zaczynający się w A1
  3. Kopiujemy cały wiersz danych, bez kolumny Wykonane (x)

Makro ma się uruchamiać “samo”, gdy użytkownik wpisze do kolumny H wartość “x”. Musi więc to być zdarzenie arkusza OnChange. O tym, jak je wywołać pisałam tutaj.

Na początku deklarujemy zmienne, obsługujemy błędy i wyłączamy odświeżanie ekranu (unikniemy jego “mrugania”) i określamy wiersz i kolumnę zmienionej przed chwilą komórki (Target):

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ZakresHist As Range, Wiersz As Long, Kolumna As Long, KomPusta As Range
    Dim ArkHist As Worksheet
    
    On Error GoTo Koniec

    Wiersz = Target.Row
    Kolumna = Target.Column
    
    Application.ScreenUpdating = False
    
Koniec:
    Application.ScreenUpdating = True
End Sub

Ponieważ makro uruchomi się na zmianę jakiejkolwiek komórki arkusza, musimy sprawdzać czy user zmienił komórkę w kolumnie H i czy wpisał tam “x”. Dopiero wtedy skopiujemy zatwierdzony  rekord i wkleimy do arkusza historycznego. If wygląda tak:

    If Kolumna = 8 And Target.Value = "x" Then
        
    End If

A w środku tego ifa będzie cała praca:

  1. określenie arkusza historycznego
  2. określenie zakresu dotychczasowych danych historycznych, a tym samym:
  3. określenie pierwszej komórki w wierszu pod nim

Oto kod, który to robi:

    If Kolumna = 8 And Target.Value = "x" Then
        'określanie pierwszego wolnego wiersza historii. Zał: od A1
        Set ArkHist = Sheets("Hist")
        Set ZakresHist = ArkHist.Range("A1").CurrentRegion
        Set KomPusta = ArkHist.Range("A" & ZakresHist.Rows.Count + 1)
    
        Range("A" & Wiersz, "G" & Wiersz).Copy KomPusta
    End If

Całość wygląda tak:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ZakresHist As Range, Wiersz As Long, Kolumna As Long, KomPusta As Range
    Dim ArkHist As Worksheet
    
    On Error GoTo Koniec
    
    Application.ScreenUpdating = False
    
    Wiersz = Target.Row
    Kolumna = Target.Column
        
    If Kolumna = 8 And Target.Value = "x" Then
        'określanie pierwszego wolnego wiersza historii. Zał: od A1
        Set ArkHist = Sheets("Hist")
        Set ZakresHist = ArkHist.Range("A1").CurrentRegion
        Set KomPusta = ArkHist.Range("A" & ZakresHist.Rows.Count + 1)
    
        Range("A" & Wiersz, "G" & Wiersz).Copy KomPusta
    End If
    
Koniec:
    Application.ScreenUpdating = True
End Sub

Makro będzie kopiowało dane niezależnie od tego, jakie będą w nim dane. Aby tak się nie działo i aby kopiowane były dane tylko wtedy, gdy dane są z “tabeli” – należałoby wprowadzić pewne modyfikacje w kodzie. Myślę jednak, że jest to nie potrzebne, i że użytkownicy będą korzystali z makra świadomie. A jak nie, to najwyżej oczyści się historię :). Uważam, że lepiej napisać prostszy kod, niż bawić się w naprawianie świata i przewidywanie wszelkich możliwych problemów.

Ważna rzecz: zapisz plik jako plik z obsługą makr, czyli z rozszerzeniem .xlsm lub .xlsb. Wszystko powinno śmigać :).

 

Tutaj możesz pobrać plik z gotowym rozwiązaniem:

MalinowyExcel Archiwizuj wybrane rekordy dw.zip

 

A tutaj wersja wideo (pojawi się wkrótce):

 

Bezpłatny WEBINAR: Walidacja danych – Triki

$
0
0

Zapraszam Cię na bezpłatny webinar o trikach w walidacji danych, czy inaczej: sprawdzaniu poprawności. Na webinarze skoncentrujemy się głównie na  pisaniu formuł, określających dane, które można wpisać do komórki.

Wpadaj koniecznie, tylko najpierw się zapisz TUTAJ, ponieważ tylko zapisana osoby dostaną komplet plików excelowych i notatkę PDF. Na webinarze będzie też praca domowa do samodzielnego pokombinowania. Przykładowe rozwiązanie zaprezentuję na grupie Malinowy Excel na Facebooku, także zachęcam do dołączenia tutaj.

Do zobaczenia na webinarze!

 

Jak przenieść formatowanie do korespondencji seryjnej w Wordzie?

$
0
0

Czyli excelowy sposób na Worda

Kiedy chcemy napisać pismo do wielu osób, różniące się tylko pojedynczymi wartościami – sięgamy po korespondencję seryjną w Wordzie.
I bardzo dobrze, do tego służy to narzędzie :). Te pojedyncze wartości z kolei przechowujemy w Excelu. Potem łączymy jedno z drugim w bardzo prosty sposób – nawet średnio-ogarnięty użytkownik Worda umie to zrobić – i mamy gotowy wynik.

Schody jednak zaczynają się, gdy do Worda mając trafić wartości takie jak procenty, daty czy duże liczby. Czyli takie, które powinny być sformatowane. Wtedy Word już tak pięknie nie współpracuje… Tak to może wyglądać:

Błędny format daty i liczby w korespondencji seryjnej

Błędny format daty i liczby w korespondencji seryjnej

 

Formatowanie oczywiście da się ustawić w Wordzie, ale tego już średnio-ogarnięty użytkownik Worda nie zrobi (jest to mega-dziwne). W Excelu zaś wystarczy użyć jednej prostej funkcji…

Operacje w Excelu

Funkcją tą jest funkcja TESKT, która umie “przerobić: format komórki na jej wartość.

Excelowa formatka z danymi, które są potem pobierane do Worda, wygląda tak:

Formatka

Formatka

Ważne jest to, że znajduje się w arkuszu Dane. Będzie to istotne później w Wordzie.

I, już wiemy, dwie ostatnie kolumny – z datą i kwotą podwyżki – zostaną błędnie wyświetlone w Wordzie. Dostawimy więc do tej formatki 2 dodatkowe kolumny.

  1. Kwota WD (kolumna G)
    Tutaj wpiszemy następującą formułę (G2):
    =TEKST(E2;"# ##0 zł")

    Czyli wyświetlimy kwotę z separatorem tysięcy i symbolem  (więcej o formatowaniu niestandardowym komórek znajdziesz tutaj).

  2. Data WD (kolumna H)
    I tutaj podobnie, tylko chcemy formatować datę tak, jak lubimy w Polsce, czyli zaczynając od dnia i oddzielając kropkami. Do komórki H2 wpisujemy więc taką formułę:
    =TEKST(F2;"dd.mm.e")

Po skopiowaniu obu formuł do końca danych mamy już wszystko co potrzeba. Wszystko wygląda teraz tak:

Po dodaniu kolumn

Po dodaniu kolumn

Koniecznie zapisujemy plik, a następnie zamykamy go.

Operacje w Wordzie

Tutaj przede wszystkim musimy mieć już gotową formatkę pisma, które chcemy wystosować. U mnie jest to informacja o podwyżce :). Do Worda przekażę więc pola: Zwrot, Osoba, Kwota WD i Data WD.

Jak to już jest – powiedzieć Wordowi skąd ma zaciągać dane odbiorców pisma. Jest to oczywiście nasz plik Excela. W tym celu, w Wordzie idziemy do menu Korespondencja/ Wybierz adresatów/ Wybierz istniejącej listy. I w okienku wybierania źródła danych wskazujemy nas excelowy plik.

Następnie Word zapyta nas, z jakiego arkusza chcemy pobierać dane. Wskazujemy arkusz Dane:

Wskazywanie arkusza z danymi

Wskazywanie arkusza z danymi

Dalej, w dokumencie Worda ustawiamy się w miejscu, gdzie chcemy wstawić już poszczególne pola, czyli np. naszą datę i wybieramy z menu Korespondencja/ Wstaw pola koresp. ser.  i wybieramy z listy interesujące nas pole:

Wstawianie pól

Wstawianie pól

Word wstawi kod tego pola na charakterystycznym szarym tle:

Pole w dokumencie na szarym tle

Pole w dokumencie na szarym tle

Tak trzeba zrobić ze wszystkimi polami, które chcemy wstawić, czyli u nas to będzie jeszcze kwota podwyżki, zwrot grzecznościowy i osoba (te dwa ostatnie to były zwykłe teksty – nic dodatkowego nie trzeba było z nimi robić).

Na koniec wystarczy już tylko zakończyć korespondencję, czyli Korespondencja/ Zakończ i scal/ Edytuj poszczególne dokumenty. Ja zawsze wybieram tę opcję i następnie zapisuję oddzielny plik wynikowy.

Efekt przykładowego dokumentu jest taki:

Wynik

Wynik

Oczywiście ta metoda jest dobra do prostych zastosowań, zdecydowanie też wtedy, kiedy lepiej znamy Excela niż Worda ;). Na pewno Wordowcy by tutaj protestowali, natomiast ja jestem za prostymi rozwiązaniami, a funkcja TEKST zdecydowanie tutaj takim jest, więc korzystam i Wam też polecam!

Na koniec jeszcze plik Excela do pobrania:

MalinowyExcel Jak przenieść formatowanie do korespondencji seryjnej w Wordzie dw.xlsx

I opis całej procedury krok po kroku w formie wideo:

Enjoy!

 


Dynamiczne źródło tabeli przestawnej

$
0
0

Czyli o tabelach słów kilka…

Często potrzebujemy dopisać dane do źródła tabeli przestawnej, które mamy w Excelu. Chcielibyśmy, aby po odświeżeniu tej tabeli – dopisane dane pojawiły się w tabeli przestawnej. Problem jednak polega na tym, że to samo z siebie się nie dzieje i zazwyczaj nieźle kombinujemy, aby nowe dane tam umieścić: 1) ręcznie zwiększamy zakres tabeli przestawnej, 2) wstawiamy dane w środek zakresu źródłowego czy 3) opieramy tabelę przestawną na całych kolumnach arkusza.

Każde z tych rozwiązań ma jednak swoje wady: ręczne zwiększanie zakresu jest niewygodne i nie radzi sobie z kilkoma tabelami opartymi na danych, wstawianie danych w środek jest niewygodne, a korzystanie z całych kolumn arkusza przykładowo generuje mnóstwo pustych rekordów.

Jak więc żyć? 😉 Jest na to jeden bardzo prosty sposób – obiekt TABELA! Dzięki niemu wystarczy, że odświeżymy tabelę przestawną, a nowo dopisane dane same do niej wskoczą.

Określanie źródła TP

Let’s begin!

Tworzenie tabeli

Cały trik polega na tym, aby źródłem dla tabeli przestawnej był obiekt tabela. Czyli ze zwykłego zakresu danych musimy stworzyć tabelę. Jeśli mamy więc prawidłowy zakres danych (o którym do znudzenia powtarzam na szkoleniach, np. na tym), ustawiamy się w nim gdziekolwiek i na stworzenie tabeli mamy kilka opcji, np. Wstawianie/ Tabela czy skrót klawiszowy Ctrl + t.

Zaraz później przyjdzie nam skontrolować, zakres i to, czy nasze dane mają już nagłówki. Zazwyczaj Excel prawidłowo się domyśla, jednak nie zawsze jest taki mądry i warto go sprawdzić (gubi się, gdy dane to tabeli są tekstowe):

Czy są już nagłówki

Czy są już nagłówki?

Zazwyczaj powyższe okienko zatwierdzamy OK. Powstaje nam wtedy śliczna (lu mniej śliczna ;)) TABELA. To czy czy jest śliczna czy nie, zależy od ustawionego w Excelu schematu kolorów – więcej o tym dowiesz się na moim webinarze o motywach i stylach w Excelu. Zobacz wizualną różnicę między zwykłym zakresem, a obiektem tabela, stworzoną na tymże zakresie:

Zakres vs Tabela

Tabela to obiekt, który posiada swoją własną wstążkę Narzędzia tabel/Projektowanie. Wstążka ta pokazuje się tylko wtedy, gdy stoimy w tabeli.

Na tej właśnie wstążce, zaraz na początku, znajduje się pole Nazwa tabeli. Domyślnie Excel proponuje nazwę w stylu Tabela1, co nie jest przyjazną nazwą, zwłaszcza wtedy, gdy takich tabel mamy kilka! Dobrą praktyką jest więc zmienić tę nazwę na jakąś przyjazną, po której będziemy mogli się domyślić co ta tabela przechowuje, np. tbTransakcje. Ja lubię dodawać do nazw tabel przedrostek tb, abym potem, wśród innych nazw czy w VBA, mogła się szybko zorientować, że jest to tabela. Nie jest to jednak konieczne.

Zmiana nazwy tabeli

I to tyle jeśli chodzi o obiekt tabela w tym kontekście. Jedziemy do przestawnych.

Tworzenie tabeli przestawnej

… to już chwila. Ustawiamy się w dowolnym miejscu tabeli i Wstawianie/ Tabela przestawna. Excel zapyta się o kilka rzeczy, z czego najbardziej będzie nas interesowało źródło tabeli przestawnej. Zwróć uwagę, że prosi o zaznaczenie tabeli lub zakresu. BTW: mam nadzieję, że teraz widzisz różnicę między nimi i od tej pory już nie będzie robienia “tabelek” w Excelu ;).

No właśnie: Tabeli. Trzeba tutaj podać nazwę naszej, czyli tbTransakcje:

Tworzenie tabeli przestawnej

Tworzenie tabeli przestawnej

 

Potem tylko kwestia decyzji gdzie nasza tabela przestawna ma zostać stworzona i to wszystko (OK)!

Po dopisywaniu nowych danych do tabeli (tbTransakcje) jej rozmiar automatycznie się powiększy, a tabelę przestawną wystarczy tylko odświeżyć (Alt + F5 lub patrz: rysunek), aby zobaczyć w niej nowe dane:

Odświeżanie tabeli przestawnej

Odświeżanie tabeli przestawnej

I to tyle! Ciesz się więc prostym mechanizmem, który ułatwi Ci życie! A jeśli znasz kogoś, komu ten trik może ułatwić życie – przekaż mu proszę link do tego artykułu. Dziękuję s swoim i ich imieniu ;)!

PS. Tabele przydają się również przy listach rozwijanych – zobacz jak: dynamicznego źródła listy rozwijanej.

A na koniec jeszcze plik z rozwiązaniem do pobrania:

MalinowyExcel Dynamiczne źródło TP dw.xlsx

 

I wersja wideo (pojawi się wkrótce):

 

 

Liczba godzin pracy na podstawie symboli (formuła tablicowa)

$
0
0

Czyli coś trudnego prostymi funkcjami…

Ogólnie sytuacja wydaje się prosta – mamy dany czas pracy pracownika w poszczególnych dniach i chcemy poznać jego łączny czas pracy w danym okresie. Problem jest jednak w tym, że ten czas pracy podany jest za pomocą symboli, a nie liczb. Np. UW to Urlop wychowawczy, który dla obliczeń bierze 8 godzin. Tych oznaczeń jest więcej i są one widoczne w tabelce po prawej stronie formatki:

Formatka

Formatka

Oczywiście w żółtych polach chcemy uzyskać sumę łączny czas pracy danego pracownika. Gdybyśmy chcieli/mogli mieć tabele pomocniczą – zadanie byłoby wręcz banalne! Natomiast nie mamy takiej tabeli, więc trzeba kombinować formułą tablicową. I o niej dalej.

Gdybyśmy mieli tylko jeden symbol do znalezienia, np. CD – formuła byłaby bardzo prosta. Można byłoby się posłużyć tutaj np. SUMĄ.JEŻELI, WYSZUKAJ.PIONOWO czy jeszcze kilkoma innymi funkcjami. Wtedy kazalibyśmy funkcji, np. SUMIE.JEŻELI, szukać symbolu CD w zakresie z symbolami (N4:N9) i na tej podstawie sumować liczbę godzin (O4:O9).

Formuła wyglądałaby tak:

=SUMA.JEŻELI($N$4:$N$9;C4;$O$4:$O$9)

I byłoby po sprawie.

Natomiast do poszukania mamy zdecydowanie więcej symboli. Jest więc to pole do popisu dla formuły tablicowej. Nadal będziemy używać w niej SUMY.JEŻELI (oczywiście jak chcesz – możesz użyć SUMY.WARUNKÓW), natomiast każemy jej znaleźć wszystkie symbole dla danego pracownika, czyli tak:

=SUMA.JEŻELI($N$4:$N$9;C4:K4;$O$4:$O$9)

Problem jest jednak taki, że jak taką formułę zatwierdzimy – otrzymamy w wyniku zero. SUMA.JEŻELI bowiem zwróci w wyniku tablicę wartości, która nie mieści się w jednej komórce (nie możemy przechowywać wielu komórek w jednej komórce – to potrafi Power Query ;)). Tak wygląda wynik powyższej funkcji (będąc w edycji formuły – wciśnij F9, aby się o tym przekonać):

={24\12\12\0\8\8\12\8\12}

Nawiasy klamrowe naokoło wyników oznaczają, że jest to tablica wartości. I co ciekawe – te wartości są prawidłowymi wynikami! SUMA.JEŻELI wywiązała się z zadania.

Tylko trzeba byłoby to teraz jeszcze podsumować… Potrzebna nam jest więc funkcja sumująca. No wow, wielkie odkrycie: SUMA oczywiście! I tak, SUMA oczywiście zda tutaj egzamin (umie w końcu sumować ;)). Natomiast jeśli jej użyjemy, koniecznie musimy zatwierdzić całą formułę kombinacją klawiszy Ctrl + Shift + Enter (w skrócie: CSE). Efekt będzie taki, że naokoło formuły pojawią się nawiasy klamrowe, wstawiane automatycznie przez Excela (nie kopiuj ich z formuły poniżej!):

{=SUMA(SUMA.JEŻELI($N$4:$N$9;C4:K4;$O$4:$O$9))}

CSE oczywiście zadziała, wynik wyjdzie prawidłowy. Problem jednak jest taki, że o CSE często się zapomina (patrz: ja ;)), no i nie da się wtedy skorzystać z mojego ukochanego Ctrl + Enter, tylko trzeba kopiować przeciąganiem, albo Ctrl + c i Ctrl + v.

Żeby jednak tego uniknąć, wystarczy zastosować inną funkcję sumującą. A jest nią SUMA.ILOCZYNÓW, o której już wielokrotnie wspominałam na blogu (np. tutaj) :). Ta funkcja sumuje (w tym wypadku identycznie jak SUMA) i umie radzić sobie z tablicami i to bez CSE! Dlatego, jak masz coś do dodania w formule tablicowej – zdecydowanie polecam Ci SUMĘ.ILOCZYNÓW:

=SUMA.ILOCZYNÓW(SUMA.JEŻELI($N$4:$N$9;C4:K4;$O$4:$O$9))

Wynik oczywiście dostaniemy ten sam, tylko bez CSE, no i możesz skopiować formułę Ctrl + Enter 😉

Wynik

Wynik

Proste? Mam nadzieję :).

 

Tutaj możesz pobrać plik z gotowym rozwiązaniem:

MalinowyExcel Suma czasu pracy formułą tablicową dw.xlsx

 

A tutaj wersja wideo (pojawi się wkrótce):

A jeśli temat formuł tablicowych Cię interesuje, to bardzo serdecznie Ci polecam serię filmów Mike’a Girvina na ten temat. Mike napisał też książkę o formułach tablicowych, dostępna jest w po angielsku.

 

Zapis nowej wersji pliku z kolejnym numerem w nazwie

$
0
0

Czyli krótko o prostym wersjonowaniu plików

W jednym z poprzednich artykułów pokazałam sposób na to, aby podczas zamykania pliku, zapisywał się on pod nazwą wskazaną w komórce. Chodziło o to, aby mieć cały czas jeden plik, tylko z inną nazwą. Dzisiaj natomiast skoncentruję się na tym, aby tworzyć kolejne wersje plików, każdy z kolejnym numerem. Użytkownik będzie decydował o tym, jak ma się nazywać plik (jakie słowo kluczowe ma zawierać), a makro będzie automatycznie nadawało kolejny numer.

Poprzednie pliki – wcześniejsze wersje – zostaną na dysku (nie będą kasowane).

Dodatkowo, to użytkownik będzie uruchamiał makro, czyli decydował o tym, kiedy nowa wersja ma zostać stworzona. Oczywiście, jeśli chcesz, aby takie wersjonowanie działo się za każdym razem, gdy zamkniemy plik – kod trzeba będzie umieścić wewnątrz zdarzenia BeforeClose, tak, jak w poprzednim artykule.

Nasze makro będzie potrzebowało do swojego działania 2 komórek, najlepiej umieszczonych w roboczym arkuszu. Np. tak:

Formatka

  • Słowo kluczowe, czyli takie, jakie ma wystąpić w nazwie pliku uzupełnia użytkownik. Na powyższej formatce jest ono w komórce C3, którą nazwałam Komorka.
  • Numer wersji, jest uzupełniane przez makro. U mnie jest to komórka C4, którą nazwałam Numer.

Zaczynamy!

Logika makra

Cała logika to po prostu zapisywanie pliku pod odpowiednią nazwą i w odpowiednim miejscu (tam, gdzie obecnie jest plik). Nazwę stworzymy pobierając wartość z komórki Komorka, i skleimy to z numerem, który będzie generowało makro, na podstawie numeru, który obecnie znajduje się w żółtej komórce Numer. Do znajdującej się tam liczby dodamy 1. Za pierwszym razem komórka ta jest pusta, czyli równa zero. Po dodaniu 1 otrzymamy więc pierwszy numer: 1.

Możemy jeszcze dorzucić informację o roku lub inną, np. rok-mc-dzień-godzina –  w zależności od potrzeb. Kolejność tych wpisów dla makra nie ma znaczenia – ma za to dla nas. Ja lubię datę umieszczać na początku lub na końcu tekstu, aby się dobrze po niej sortowało. W tym wpisie, aby uprościć, dopiszę na końcu nazwy pliku rok: 2019.

Ponieważ to user będzie decydował o tym kiedy stworzyć nową wersję (kliknie przycisk Zapisz wersję), umieścimy więc makro w oddzielnym module. Wstawmy go:

  • Alt + F11, aby przejść do edytora VBA
  • Menu Instert/ Module

Procedura – kod

Najpierw definiujemy zmienne:

Sub StworzWersje()
    Dim NowaNazwa As String, Sciezka As String, Slowo As String
    Dim Numer As Range, NowyNumer As Long

Slowo to będzie słowo kluczowe pobierane od usera. Numer, to komórka, w której będzie numer poprzedniej wersji.

OK, teraz pobieramy dane do zmiennych:

    Sciezka = ThisWorkbook.Path & "\"
    Slowo = Sheets("Dane").Range("Komorka").Value
    Set Numer = Sheets("Dane").Range("Numer")

Teraz kwestia określenia numeru, jaki ma zostać nadany naszemu plikowi. Będzie to liczba o 1 większa niż poprzednia:

        NowyNumer = Numer.Value + 1

A teraz wpiszemy tę wartość do komórki, aby kolejny plik został zapisany z odpowiednią liczbą:

        Numer.Value = NowyNumer

I dalej, tworzymy nazwę, którą nadamy plikowi – jest to połączenie słowa kluczowego z numerem, oraz dopiskiem roku (2019) i rozszerzenia pliku. Poszczególne części nazwy będę oddzielała podkreśleniem “_”. Dodatkowo, numer pliku podam zawsze w formie 3-cyfrowej, aby zapisane pliki dobrze się sortowały. W tym celu użyję funkcji Format, odpowiednika excelowej funkcji TEKST (umie ona wyświetlić liczbę w określonym “formacie” niestandardowym – więcej o nich możesz dowiedzieć się z tego webinaru). Sklejanie to ta linijka:

    NowaNazwa = Slowo & "_" & Format(NowyNumer, "000") & "_2019.xlsm"

I na koniec zostaje już tylko zapisanie pliku pod wyżej ustaloną nazwą:

    ThisWorkbook.SaveAs Sciezka & NowaNazwa
End Sub

Kod w całości wygląda tak:

 Sub StworzWersje()
    Dim NowaNazwa As String, Sciezka As String, Slowo As String
    Dim Numer As Range, NowyNumer As Long

    Sciezka = ThisWorkbook.Path & "\"
    Slowo = Sheets("Dane").Range("Komorka").Value
    Set Numer = Sheets("Dane").Range("Numer")
        NowyNumer = Numer.Value + 1
        Numer.Value = NowyNumer
    
    NowaNazwa = Slowo & "_" & Format(NowyNumer, "000") & "_2019.xlsm"
       
    ThisWorkbook.SaveAs Sciezka & NowaNazwa
End Sub

Teraz pozostaje nam już tylko wstawienie przycisku i podpięcie do niego makra. Czynności te opisywałam już na blogu – tutaj, przy okazji makra usuwającego rekordy. Gotowy przycisk można umieścić w dowolnym arkuszu pliku. Tak, by było Tobie wygodnie.

I tyle – makro będzie pięknie śmigać!

 Tutaj jest plik z gotowcem do pobrania:

MalinowyExcel Zapisz plik z kolejnym numerem w nazwie VBA dw.zip

 

A tutaj wersja wideo (pojawi się wkrótce):

 

 

 

 

WEBINAR Funkcje dat – excelowy niezbędnik

$
0
0

Zapraszam Cię na bezpłatny webinar Funkcje dat – excelowy niezbędnik. Na webinarze zaprezentuję funkcje dat, które w moim przekonaniu warto znać, gdyż prędzej czy później przydadzą się każdemu użytkownikowi Excela.

Wpadaj koniecznie, tylko najpierw się zapisz TUTAJ, ponieważ tylko zapisana osoby dostaną komplet plików excelowych i notatkę PDF. Na webinarze będzie też praca domowa do samodzielnego pokombinowania. Przykładowe rozwiązanie zaprezentuję na grupie Malinowy Excel na Facebooku, także zachęcam do dołączenia tutaj.

Do zobaczenia na webinarze!

Jak wykryć duplikaty powyżej ostatniego wystąpienia?

$
0
0

Czyli trochę o logice w formatowaniu niestandardowym

Pisałam już o tym, jak wykryć duplikaty na podstawie 2 kolumn – możesz o tym przeczytać tutaj. I własnie pod tym wpisem pojawiło się ciekawe pytanie:

Jak zaznaczyć tylko duplikaty powyżej, a ostatnie wystąpienie zostawić bez formatowania?

Przyszły mi do głowy 2 rozwiązania, jedno z nich idealnie odpowiadające na to pytanie, a drugie… w sumie na inne :). O pierwszym będzie dzisiaj, a o drugim kolejnym razem.

Czyli będziemy osiągać taki efekt:

Formatka

Polecam całe rozwiązanie umieścić w obiekcie Tabela, aby było ono dynamiczne. W końcu chcemy dopisywać nowe dane i na nich też ma działać. Umożliwi nam to właśnie obiekt tabela. Jego tworzenie omawiałam np. tutaj.

Logika rozwiązania

Do rozwiązania tego problemu zdecydowanie będziemy pisać formułę. Bardziej rozbudowaną niż ostatnim razem, ale wykorzystującą jej elementy. Tak, jak poprzednio – chcemy wychwycić wszystkie powtarzające się projekty dla tego samego klienta. Duplikatem będzie więc powtarzająca się kombinacja projektu i klienta (2 kolumn).

Należy więc ustalić:

  1. Ile w ogóle jest powtarzających się wpisów (duplikatów). Mają bowiem zostać zaznaczone wszystkie dotychczasowe, niezależnie od ich ilości.
  2. Z którym wystąpieniem danego wpisu mamy do czynienia w konkretnym wierszu?

Jeśli numer wystąpienia w wierszu jest mniejszy niż wszystkie wystąpienia tego duplikatu – powinniśmy ten wiersza zaznaczać. I to cała logika zadania :).

Formuła

Nasza formuła będzie się składać z 2 części – jedną z nich (które wystąpienie) opisywałam wcześniej, jednak wszystko tutaj przypomnę.

1. Zacznijmy od policzenia ile w ogóle rekordów się powtarza. Policzy to następująca funkcja, którą roboczo wpiszę do komórki I4 na mojej formatce::

=LICZ.WARUNKI($B$4:$B$10;$B4;$C$4:$C$10;$C4)

Sprawdza ona, ile razy w kolumnie z projektami ($B$4:$B$10) wystąpił dany projekt (wpis z B4) przy równoczesnym wystąpieniu takiego samego klienta (wpis z C4) w kolumnie z klientami ($C$4:$C$10). Funkcja ich po prostu policzy. Jeśli takich wpisów będzie więcej niż 1 – dla nas oznacza to duplikat.

2. Ok, teraz możemy policzyć, z którym wystąpieniem mamy do czynienia w konkretnym wierszu. Zrobi to  taka funkcja (omówiona szczegółowo tutaj), roboczo wpiszę ją do komórki J4:

=LICZ.WARUNKI($B$4:$B4;$B4;$C$4:$C4;$C4)

Będzie to możliwe dzięki sprytnie zablokowanym zakresom: bez dolara obok dolnego wiersza zakresu, co umożliwia powiększanie.

Formuły robocze

3. Teraz zostaje kwestia porównania i to zrobi dla nas funkcja JEŻELI. Chciałabym, aby najpierw sprawdziła ona czy w ogóle duplikat jest. Jeśli tak – nastąpi sprawdzenie, czy występuje on jako ostatni. Jeśli tak – zostanie zwrócona wartość PRAWDA, jeśli nie – FAŁSZ.

Trzeci argument JEŻELI zostawimy pusty – jeśli więc będzie konieczne jego użycie – funkcja zwróci wartość FAŁSZ, co dla formatowania warunkowego będzie sygnałem, aby nie formatować komórki.

Formuła robocza będzie więc następująca (roboczo w K4):

=JEŻELI(I4>1;J4<I4)

4. Jest bardzo krótka w tej postaci. Ponieważ jednak odwołuje się ona do kolumn pośredniczących, których nie chcemy w docelowym rozwiązaniu, podstawimy wcześniej napisane formuły do komórek, które biorą w niej udział (więcej o sposobach zagnieżdżania funkcji omawiałam podczas tego webinaru). Docelowa formuła wygląda tak (wpisałam ją roboczo do komórki L4):

=JEŻELI(LICZ.WARUNKI($B$4:$B$9;$B4;$C$4:$C$9;$C4)>1;LICZ.WARUNKI($B$4:$B4;$B4;$C$4:$C4;$C4)<LICZ.WARUNKI($B$4:$B$9;$B4;$C$4:$C$9;$C4))

Kolumny robocze wszystkie

Wszystkie kolumny robocze

5. Teraz pozostaje już tylko kwestia formatowania warunkowego.

Przed pracą z formatowaniem warunkowym warto sobie skopiować ostatnią formułę, którą napisaliśmy w komórce L4. W tym celu koniecznie trzeba wejść do edycji tej komórki (np. do paska formuły) i skopiować treść formuły.

  1. Chcemy, aby podświetlane były projekty i klienci. Zanim uruchomimy kreator formatowania warunkowego – zaznaczamy zakres, który należy sformatować, czyli B4:C9.
  2. Idziemy do Narzędzia główne/Formatowanie warunkowe/Nowa reguła…/Użyj formuły do określenia komórek, które należy sformatować
  3. I wklejamy tam skopiowaną wcześniej formułę:

    Tworzenie reguły formatowania warunkowego

    Tworzenie reguły formatowania warunkowego

  4. Koniecznie ustawiamy też format wyróżnianych komórek (u mnie to fioletowy kolor wypełnienia)
  5. I zatwierdzamy wszystko po kolei.

Aby zobaczyć działanie naszego cuda – wystarczy podmienić lub dopisać dane tak, aby stworzyć duplikaty:

I gotowe! Mam nadzieję, że to rozwiązanie Ci się przyda. Jeśli tak – miło mi będzie, jak podasz dalej ten wpis. Może być w formie maila, wpisu na Facebooku czy jakikolwiek inny sposób. Pomóż mi szerzyć przydatną excelową wiedzę! 🙂

Tutaj znajdziesz wersję wideo wpisu (dobrze widać pracę na kolumnach pośredniczących i kopiowanie formuły do formatowania warunkowego):

A tutaj plik do pobrania:

MalinowyExcel Duplikaty na podstawie 2 kolumn poprzedni dw.xlsx

 

Zobacz w sklepie powiązane produkty:

 

Viewing all 291 articles
Browse latest View live