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

Suwak zmienia 2 wartości jednocześnie

$
0
0

Czyli o formantach formularza…

Załóżmy, że chcemy wpisywać do arkusza 2 liczby, których suma zawsze wynosi 50. Obie te liczby chcemy wpisywać za pomocą takiego suwaka, jak na formatce:

Formatka

Formatka

Problem jest jednak taki, że suwak może zmienić tylko wartość jednaj komórki, a nie dwie. Na szczęście ze względu na to, że suma tych liczb zawsze ma dać w wyniku 50, wystarczy, że wpiszemy do arkusza jedną z nich, a druga zostanie wyliczona. Dzięki temu za pomocą suwaka wpiszemy wartość tylko do jednej komórki. Problem solved!

Teraz tylko pytanie, jak to zrobić technicznie?

Wstawianie suwaka

Zacznijmy od wstawienia suwaka, czy raczej paska przewijania, jak to się oficjalnie nazywa ;). Aby to zrobić, należy na karcie Deweloper (tutaj pokazuję jak go dodać), w sekcji formanty, nacisnąć przycisk Wstaw i wybrać z niego Pasek przewijania:

Wstawianie suwaka

Wstawianie suwaka

A potem prace plastyczno-techniczne, czyli ręczne rysowanie suwaka takiego, jaki chcemy.

Kolejna sprawa to ustawianie jego właściwości. Czyli klikamy prawym przyciskiem myszy na suwak i z menu kontekstowego wybieramy Formatuj formant.

Ustawianie właściwości suwaka

Ustawianie właściwości suwaka

Wejdziemy do okienka Formatownaie formantu i tam, w zakładce Kontrolka, wybieramy:

  • Wartość maksymalna: 50
  • Zmiana przyrostowa: 1 (czuli o ile ma się zwiększyć/zmniejszyć wartość, gdy user kliknie w strzałki suwaka)
  • Łącze komórki: $D$5 (wskazujemy tę komórkę, do której ma zostać wpisana wartość wybrana za pomocą suwaka)

Wygląda to tak:

Właściwości suwaka

Właściwości suwaka

Po zatwierdzeniu przyciskiem OK nasz suwak będzie pięknie śmigał.

Formuła, licząca drugą wartość

Teraz pozostaje już napisanie formuły, która liczy drugą wartość. Wpiszemy ją do komórki D6:

=50-D5

Czyli od stałej wartości 50 (mogę ją wpisać z palca lub odwołać się do komórki, która ją zawiera) odejmujemy tę wpisaną przez suwak. That’s it!

PS TO chyba najbardziej skomplikowana formuła, jaką zamieściłam na blogu 😉

Teoretycznie mogłabym na tym zakończyć, ale aż się prosi tutaj, aby ochronić ten arkusz, żeby user na np. nie popsuł formuł albo nie skasował suwaka (przydałoby się też ustawić sprawdzanie poprawności danych, jakby postanowił ręcznie wpisać wartość, ale już bez przesady :)).

Ochrona arkusza

Żeby umożliwić userowi, a konkretnie suwakowi, zmianę tylko komórki D5, należy założyć na arkusz ochronę (reszta komórek i suwak! mają być zablokowane do edycji). Zanim jednak to zrobimy, ustawmy tej komórce możliwość edycji. Domyślnie bowiem każda komórka w Excelu jest zablokowana do edycji, gdy arkusz jest chroniony. My akurat chcemy pozwolić na modyfikację komórki D5, więc w tym celu wchodzimy do formatowania tej komórki (Ctrl + 1). Tak formatowania.

I tam, w zakładce Ochrona wystarczy odznaczyć checkbox Zablokuj:

Odblokowywanie komórki

Odblokowywanie komórki

Warto również w komórce D7 ukryć formułę. Tak na wszelki wypadek, żeby user nie zauważył tego skomplikowanego obliczenia matematycznego :). Żeby to zrobić też należy wejść do formatowania komórki, natomiast zaznaczyć oba checkboxy: Zablokuj  Ukryj:

Ukrywanie formuły w komórce

Ukrywanie formuły w komórce

Ukrycie formuły spowoduje, że nawet jak user zaznaczy komórkę, to w pasku formuły nie zobaczy jaka tam jest formuła. Awesome!

Żeby zadziałało, trzeba teraz ochronić arkusz, czyli np. menu Recenzja/Chroń arkusz. BTW: hasło jest opcjonalne.

I to wszystko :). Pomogłam?

A tutaj film wideo z prezentacją powyższych zagadnień krok po kroku:

 

 

 


Funkcja SUMA źle liczy!

$
0
0

… i co zrobić, żeby ją naprawić?

Trochę dziwnie brzmi tytuł tego wpisu, ponieważ oczywiście funkcja SUMA dobrze liczy :). Natomiast nam użytkownikom czasem może się wydawać, że jednak SUMA liczy źle. Nic dziwnego, jak widzimy coś takiego:

Suma liczb w ramce jest zdecydowanie większa niż 61, mimo tego, co twierdzi funkcja SUMA. Co więc jest z nią nie tak? Rozwiązanie tej zagadki jest bardzo proste i ma związek z postawami Excela, a mianowicie z typem danych, jakie przechowujemy w komórce. Te podstawy warto znać 😉

 

Na początku warto zdać sobie sprawę z tego, że to nie z funkcją SUMA jest coś nie tak, tylko z danymi, które dostała.

Przyjrzyj się dokładnie danym: Twój niepokój powinien wzbudzić fakt, że wszystkie wartości w czarnej ramce (czyli sumowane wartości) są wyrównane do prawej strony (specjalnie tak zrobiłam przykład, żeby było to widać, choć zdaję sobie sprawę z tego, że nie zawsze jest to takie oczywiste). Mamy tam zarówno wartości liczbowe, tekstowe jak i logiczne (PRAWDA). Każdy z tych typów danych powinien być wyrównany inaczej, czyli:

  • teksty do lewej
  • liczby do prawej
  • logiczne do środka

A nie są. To znaczy, że user ręcznie zmienił wyrównanie komórek! Grzech!!! Przez to teraz mamy problem :). Co do zasady nie powinno się zmieniać domyślnego wyrównania komórek, właśnie dlatego, że może to wprowadzić w błąd. Wyjątkiem od tej zasady są nagłówki tabel, które możemy wyrównać zgodnie z wyrównaniem zawartości kolumny, której są nagłówkiem.

To są podstawy, ale niestety często o nich zapominamy, albo – co gorsza – nie znamy ich ;(

Przywracanie wyrównania ogólnego

Zmieńmy zatem wyrównanie tych komórek na ogólne. Możesz to zrobić w Narzędziach głównych klikając na ikonkę wyrównania do prawej strony (zobacz, że jest zaznaczona dla tych danych!) lub poprzez okienko formatowania komórek (skrót klawiszowy, Ctrl + 1).  W obu przypadkach najpierw zaznacz dane, które chcesz formatować (czyli w tym przykładzie czarną ramkę):

Przywracanie wyrównania ogólnego

Przywracanie wyrównania ogólnego

Widać na powyższym rysunku wynik przywróconego wyrównania. Liczby do prawej, teksty do lewej i wartości logiczne na środek.

Ale zaraz! Niektóre liczby: 34, 75 i 3 są do lewej! I tutaj jest pies pogrzebany. Te liczby to dla Excela teksty! A on nie umie sumować tekstów. Należy więc, specjalnie dla Excelka, dokonać konwersji tekstu na liczby, czyli przerobić teksty na liczby :).

Wklejanie specjalne z operacją

Aby dokonać takiej konwersji, należy wykonać na tych “liczbach” dowolną operację matematyczną, która nie zmieni ich wartości (tego akurat nie chcemy ;)). Takimi operacjami są dodanie lub odjęcie zera, pomnożenie lub podzielenie liczby przez 1 lub tzw. podwójna negacja, czyli dwukrotne pomnożenie liczby razy -1 (ostatni sposób jest najszybszy w formułach).

Moją ulubioną i jednocześnie najszybszą metodą na zrobienie tego jest wklejanie specjalne z operacją np. mnożenia. Żeby to zrobić:

  1. wpisz liczbę 1 w dowolną komórkę poza zakresem danych,
  2. skopiuj ją (Ctrl + c)
  3. zaznacz zakres danych, który chcesz przekonwertować (u nas: czarna ramka)
  4. kliknij na tym zakresie prawym przyciskiem myszy i z menu podręcznego wybierz opcję Wklej specjalnie…
  5. w okienku, które się pojawi, zaznacz: Wartości i Przemnóż (może być też Podziel – nie ma to znaczenia, ponieważ jeśli liczbę pomnożysz lub podzielisz przez jeden – otrzymasz dokładnie tę szamą liczbę)
Konwersja tekstu na liczby poprzez wklejanie specjalne

Konwersja tekstu na liczby poprzez wklejanie specjalne

Po naciśnięciu OK robota zrobiona!

Wynik jest taki:

Wynik

Wynik

I to tyle – takie proste i jednocześnie zbawienne :). Cała trudność w wykryciu takich baboli. Na szczęście wystarczy sięgnąć do podstaw 🙂

BTW Ten temat już poruszałam na blogu, natomiast kontekst był nieco inny, więc postanowiłam jeszcze raz o tym napisać, omawiając ten nowy kontekst. A raczej inny kontekst…

Poniżej plik z błędnymi danymi do pobrania:

Malinowy Excel Funkcja SUMA źle liczy dw.xlsx

I wersja wideo przedstawionego rozwiązania:

 

 

Odzyskiwanie różnych formuł po nadpisaniu ich wartością

$
0
0

Czyli trudna rzecz rozwiązana prostą metodą

Niedawno opisywałam już podobny przypadek, natomiast dotyczył on trochę łatwiejszej sytuacji. Chodziło bowiem o to, żeby dać użytkownikowi możliwość wpisania do jednej komórki wartości z palca, lub skorzystania z wpisanej tam formuły. Taki switch: chcę wartość, to ją wpiszę, a jak ją skasuję, to na jej miejscu pojawi się formuła. Cudo!

Wtedy jednak opisywałam sytuację, gdy w komórce ma się pojawić tylko jedna, określona formuła. Teraz natomiast chodzi o to, żeby mogły się tam pojawiać różne formuły, w zależności od komórki, którą będę edytowała. Brzmi strasznie, ale jest bardzo proste. Wymaga tylko kolumny pomocniczej i leciutkiej edycji kodu VBA, który napisałam dla poprzedniej sytuacji.

Formatkę i całą magię pokazuje ten rysunek:

Formatka

Formatka

Let’s go!

W rozwiązaniu, które wymyśliłam idę na łatwiznę (jak zwykle ;)). Pomyślałam sobie, że stworzę w arkuszu kolumnę (szara kolumna I), w której będą napisane formuły, które chcę odzyskać, gdy user skasuje wartość w komórce (z kolumny Jednostkowa cena netto). Tę kolumnę roboczą (I) ukryję i jedyne co makro będzie robiło innego niż poprzednio, to podbierało wartość z odpowiedniej komórki tej ukrytej kolumny. Nawet nie trudzę się, żeby wpisywało identyczną formułę. Dla użytkownika i tak to nie ma znaczenia – on chce widzieć określoną wartość :). O rety, ale sprytne 🙂

Całą modyfikacja w kodzie sprowadza się do tej jednej linijki:

Target.FormulaR1C1 = "=RC[4]"

Czyli cały kod, dla przypomnienia, wygląda tak:

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Zakres As Range
 
 On Error GoTo Obsluga
 
 Set Zakres = Me.Range("Ceny")
 
 If Not Intersect(Zakres, Target) Is Nothing And Target.Value = "" Then
 Target.FormulaR1C1 = "=RC[4]"
 End If
Obsluga:
 Set Zakres = Nothing
 
End Sub

I wszystko. Moim zdaniem efekt jest super, przy minimalnym nakładzie pracy. Czyli to, o co zazwyczaj chodzi 😉

Tutaj znajdziesz plik z rozwiązaniem do pobrania (oczywiście zawiera makra!):

A tutaj wersję wideo:

 

 

Wesołych (wiosennych) Świąt!

Wyróżnianie najmniejszej wartości w wierszu

$
0
0

Czyli sprytne użycie formatowania warunkowego…

Załóżmy, że chcemy dla w każdym wierszu tabeli wyróżnić najmniejszą wartość. Oczywiście chcemy to zrobić możliwie szybko, małym nakładem pracy i jeszcze tak, żeby rozwiązanie było dynamiczne, czyli jeśli zmienimy jakąś wartość – wyróżnienie się do tego dostosuje i na bieżąco sprawdzi, czy owa zmieniona nie jest najmniejsza. Mamy kilka magazynów (może być kilkanaście albo kilkaset dla większego dramatyzmu;)) i w każdym z nich, chcemy wyróżnić najmniejszą wartość w tygodniu:

Formatka 1

Formatka 1

Albo druga sytuacja, na tych samych danych: chcemy zaznaczyć cały wiersz, jeśli w tym wierszu znajdzie się najmniejsza wartość z wybranej kolumny (np. 4). Załóżmy, że w czwartek przychodzi kontrola do magazynu i chcemy wiedzieć, który magazyn tego dnia miał najmniejsze stany. I chcemy podświetlić cały wiersz dla tego magazynu, aby analizować stany jego magazynowe w całym tygodniu:

Formatka 2

Formatka 2

Oczywiście bez formatowania warunkowego tutaj się nie obejdzie. Formatowanie to będzie wymagało też napisania formuły, która zdefiniuje warunek. Czyli coś bardziej skomplikowanego, niż “wyklikanie” formatowania, jak to w wieeelu przypadkach wystarczy…

1. Wyróżnianie najmniejszej wartości w wierszu

W tym przypadku, w każdym wierszu naszego zakresu (C4:I9) chcemy zaznaczyć najmniejszą wartość w danym wierszu. Problem jest taki, że piszemy w tym celu jedną regułę formatowania warunkowego. Musi zatem być uniwersalna dla każdego wiersza zakresu.

W takich sytuacjach koniecznie będziemy musieli działać z adresowaniem komórek, czyli dolarami ($). To tak, jak pisanie jednej formuły dla dwuwymiarowego zakresu, czyli takiego, który składa się z kilku wierszy i kilku kolumn (klasyczny przykład takiego: tabliczka mnożenia).

Tutaj chcemy, aby dla każdej komórki w wierszu, w odpowiednich komórce wierszach, ale zawsze w obrębie kolumn od C do I (czyli np. w zakresie: C4:I4) Excel sprawdzał czy wartość konkretnej komórki jest najmniejszą w tym zakresie. I to mamy sprawdzić dla każdej komórki (stąd analogia do kopiowania formuły do dwuwymiarowego zakresu). W praktyce oznacza to, że każdą komórkę trzeba porównać do wartości minimalnej tego zakresu. Jeśli warunek ten będzie prawdziwy – formatowania warunkowe pokoloruje komórkę. Wartość najmniejszą zbadamy oczywiście funkcją MIN.

Czyli każdą komórkę w całym zakresie będziemy porównywać: niezależnie od tego, gdzie ona w tym zakresie się znajduje. Będziemy porównywać ją natomiast do wartości minimalnych konkretnych wierszy. Czyli warunek formatowania warunkowego będzie wyglądał tak:

=C4=MIN($C4:$I4)

Warto zauważyć, że funkcja MIN szuka najmniejszej wartości w zakresie z zablokowanymi kolumnami i odblokowanymi wierszami. Kolumny są zablokowane, ponieważ funkcja MIN ma szukać wartości minimalnej zawsze od C do I. Zakres tych kolumn jest stały i nie może się przesunąć w prawo (a tak własnie by się stało, gdybyśmy nie blokowali kolumn): czyli zarówno komórkę C4 jak i G4 mamy porównywać do najmniejszej wartości zakresu $C4:$I4. Natomiast dla komórki C5 i G5 ma to być już zakres $C5:$I5. Stąd z kolei zmieniają się wiersze.

To jak już formułę mamy omówioną, to kwestia nadania formatowania warunkowego:

1. Zaznacz zakres C4:I9, zaczynając zaznaczenie od komórki C4 – to bardzo ważne!

 

2. Wybierz z menu: Narzędzia główne/ Formatowanie warunkowe/ Użyj formuły do określenia komórek, które należy sformatować

3. W pole Edytuj opis reguły wpisz wcześniej ustaloną formułę. Jak na obrazku:

Reguła formatowania 1

Reguła formatowania 1

I tyle. Efekt mamy taki:

Najmniejsze wartości w wierszach - wynika

Najmniejsze wartości w wierszach – wynik

2. Wyróżnianie całego wiersza

Drugi case już pójdzie szybciej, po zrozumieniu tego wyżej. Tutaj mamy zaznaczyć cały wiersz, jeśli występuje w nim najmniejsza wartość wybranej kolumny. U nas będzie to kolumna F, czyli czwartek (trochę niefortunnie nazwałam ją cyfrą, ech).

Czyli będziemy teraz szukali wartości minimalnej w kolumnie F, konkretnie w zakresie $F$14:$F$19. Zawsze w nim, dlatego zablokowałam go bezwzględnie. Czyli będzie MIN($F$14:$F$19).

I do tego będziemy porównywać tylko jedną komórkę z wiersza: tę w kolumnie F. Ale, żeby podświetlić cały wiersz, musimy dla każdej komórki sprawdzić ten warunek. Ten, czyli porównujący komórkę w kolumnie F z tego wiersza do wartości minimalnej wspomnianego zakresu. Reguła formatowania warunkowego będzie więc taka:

=$F14=MIN($F$14:$F$19)

A wszystko należy wrzucić do nowej reguły formatowania warunkowego, czyli jeszcze raz:

1. Zaznacz zakres B14:I19 (lub jeśli chcesz wyróżniać też sumę to zakres: B14:J19), zaczynając zaznaczenie od komórki B14 – to bardzo ważne!

2. Wybierz z menu: Narzędzia główne/ Formatowanie warunkowe/ Użyj formuły do określenia komórek, które należy sformatować

3. W pole Edytuj opis reguły wpisz wcześniej ustaloną formułę. Jak na obrazku:

Reguła formatowania 2

Reguła formatowania 2

Po zatwierdzeniu wszystkich okienek otrzymamy taki wynik:

Wiersz z najmniejszą wartością w kolumnie - wynik

Wiersz z najmniejszą wartością w kolumnie – wynik

I wszystko :). Mam nadzieję, że Ci się przyda!

 

Poniżej plik do pobrania:
Tutaj plik z gotowcem do pobrania:Malinowy Excel Najmniejsza wartość w wierszu format war dw.xlsx

A tutaj wersja wideo:

 

 

Wyróżnianie aktywnej komórki kolorem

$
0
0

Czyli coś, o czym marzy każdy użytkownik…

… no, pewnie prawie każdy :). Ja bym się nie obraziła!

Chodzi o coś takiego:

Czyli gdziekolwiek w zakresie klikniemy – ta komórka ma się podświetlać na żółto (albo oczywiście jakikolwiek inny kolor). Tylko tyle i aż tyle, ponieważ, jak zobaczycie, to wcale nie będzie takie banalne… Do stworzenia tej magii użyję nazewnictwa komórek (choć da się bez), zdarzeń w VBA (makra) i oczywiście mojego kochanego formatowania warunkowego, do którego napiszę formułę…

Formatka do zadania wygląda tak:

Formatka

Formatka

1. Nazwanie komórki roboczej

Zacznijmy od nazwania komórki roboczej. Od razu powiem, że może być ona w innym, ukrytym arkuszu. Ja dałam ją w tym samym, aby czarno na białym widać było jej zmianę. Natomiast umiejscowienie jej nie ma znaczenia (tylko trzeba będzie odpowiednio się do niej odwołać w makrze).

Dla wygody nazwiemy tę komórkę np. KomorkaAdresu. Koniecznie to zrób zwłaszcza wtedy, gdy umieścisz ją w innym arkuszu – będzie to miało znaczenie dla formatowania warunkowego.

Aby nazwać komórkę – zaznacz ją, a następnie w polu nazwy (po lewej od paska formuły), wpisz nazwę: KomorkaAdresu. Zatwierdź Enterem i po sprawie.

Nazywanie komórki

Nazywanie komórki

2. Makro (VBA)

Kolejny etap to uzupełnianie przed chwilą nazwanej komórki.

Co powinno się w niej znajdować? Adres aktualnie zaznaczonej komórki. W jakiś sposób musimy określić, która komórka jest obecnie zaznaczona. Jakkolwiek śmiesznie to nie zabrzmi: Excel tego nie wie :). A konkretnie formuła w formatowaniu warunkowym tego nie wie. Ona umie odczytać wartość z komórki, ale nie adres aktywnej. To umie VBA. A żeby było dynamicznie zgodnie ze zmienionym zaznaczeniem, musimy użyć zdarzenia arkusza Selection Change, czyli zmiana zaznaczenia.

Aby je utworzyć, należy wejść do edytora VBA, najlepiej skrótem klawiszowym Alt + F11. Następnie w okienku Project Explorer, należy dwukrotnie kliknąć na nazwę interesującego nas Arkusza (u mnie Dane) i więc po wejściu do VBE (Visial Basic Editor), , dwa razy klikam w taki właśnie arkusz. Następnie z list rozwijanych w prawym oknie wybieramy:

(1) Worksheet, i

(2) SelectionChange (wybrane domyślnie)

Oba te kroki dokładnie opisałam tutaj.

Do procedury, która pojawiła się automatycznie wpisujemy następujący kod:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim Komorka As Range
 
 Set Komorka = Range("KomorkaAdresu")
 
 Komorka.Value = ActiveCell.Address
 
End Sub

Te kilka linijek robi tyle tyle, że do komórki, którą przed chwilą nazywaliśmy wpisujemy bezwzględny adres aktywnej komórki.

3. Formatowanie warunkowe

To teraz łączymy wszystko do kupy formatowaniem warunkowym.

Najpierw jednak zastanówmy się, kiedy w ogóle komórka zakresu ma się kolorować, czyli podświetlać. Odpowiedź nasuwa się oczywista: kiedy jest aktywna. I super, dokładnie tak jest. A jeszcze dokładniej: ma się podświetlać, kiedy jej adres jest równy wartości nazwanej komórki KomorkaAdresu.

Problem jednak w tym, że nie możemy porównać sobie tak: KomorkaAdresu = A1 (gdzie A1 ma reprezentować aktywną komórkę). To będzie oznaczało bowiem porównanie wartości tych komórek. A my chcemy adresy :).

I dlatego tutaj z pomocą przychodzi funkcja ADRES, która jako swój wynik zwraca właśnie adres komórki, określonej przez wiersz i kolumnę. Jeśli więc podamy jej te dwa argumenty – otrzymamy adres komórki. Dodatkowo podamy też trzeci argument, który określi sposób adresowania – u nas bezwzględne, czyli z dwoma dolarami ($). Pomocne będą jeszcze funkcje WIERSZ, która zwraca numer wiersza komórki, wskazanej w jej argumencie, i NR.KOLUMNY, działająca analogicznie, tylko na kolumny (zwraca numer, nie literę!).

Ale to w formatowaniu warunkowym. Najpierw należy je uruchomić:

1. Zaznacz zakres, który ma być formatowany (czyli ten, w którym aktywna komórka ma się kolorować), zaczynając od pierwszej komóki tego zakresu!!!

2. Wejdź 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 wpisz następującą regułę:

=ADRES(WIERSZ(B4);NR.KOLUMNY(B4);1)=KomorkaAdresu

4. Następnie kliknij przycisk Fortmatuj i wybierz formatowanie, jakie ma być zastosowane do wyróżniania aktywnej komórki, np. żółte wypełnienie.

5. Zatwierdź wszystko i gotowe!

Powyższe kroki ilustruje rysunek:

Reguła formatowania warunkowego

Reguła formatowania warunkowego

A efekt jest magiczny, nawet, gdy komórka miała już wcześniej kolor! Cudne, prawda? To zasługa formatowania warunkowego 🙂

Koniecznie jeszcze pamiętajcie, aby zapisać plik jako plik z obsługą makr, czyli z rozszerzeniem .xlsm (lub ewentualnie .xlsb – skoroszyt binarny).

I na koniec, jak zwykle, plik z gotowcem do pobrania:
MalinowyExcel Aktywna komórka podświetlona dw.xlsm

I film z rozwiązaniem tego case’a:

 

 

WARUNKI: nowa funkcja logiczna w Excelu

$
0
0

Czyli alternatywa dla zagnieżdżania funkcji JEŻELI

Do tej pory, jeśli mieliśmy do rozwiązania jakiś bardziej złożony problem logiczny, często trzeba było zagnieździć funkcję JEŻELI i to, o zgrozo!, kilka razy. Twórcy Excela postanowili się nad nami zlitować i stworzyli funkcję, która pozwala pominąć owo zagnieżdżanie. Funkcja WARUNKI, ponieważ ją mam na myśli, występuje na tę chwilę w najnowszej wersji Excela, w modelu subskrypcyjnym (artykuł z dnia 2018-05-03).

W tym wpisie pokazuję zastosowanie tej nowej funkcji, na prostym przykładzie badania wzrostów, spadków i braków zmian sprzedaży. Formatka, której użyję ma w sobie jedynie sprzedaż z 2 lat do porównania, i kolumnę, gdzie umieścimy komentarz z wynikiem: wzrost, spadek lub brak zmian:

Formatka

Formatka

Żeby zaprezentować Wam piękno tej funkcji, najpierw omówię sposób, w jaki można było to zrobić do tej pory, a potem pokażę Wam funkcję WARUNKI w akcji 🙂

Logika problemu i “stary” sposób

Zacznę oczywiście od logiki problemu, czyli powiem po co w ogóle kombinować?

Sytuacja bowiem ma się następująco: porównujemy sprzedaż z dwóch lat: 2016 i 2017. Chcemy się dowiedzieć, czy sprzedaż w 2017 wzrosła w stosunku do 2016, spadła, czy może była taka sama? Krótko mówiąc mamy 3 opcje, takie właśnie. Funkcja JEŻELI idealnie nadaje się do tego case’a, ponieważ umie ona ocenić, czy warunek jest prawdziwy, czy fałszywy. W naszej sytuacji warunkiem może być np.: czy sprzedaż 2017 jest większa niż 2016? Problem jednak jest taki, że funkcja JEŻELI rozpatruje tylko dwie sytuacje: spełnienie tego warunku lub niespełnienie. Jak spełnimy ten warunek, to wiadomo, że mamy wzrost. Natomiast jak nie spełnimy, to możemy mieć spadek, albo brak zmian.

Potrzebujemy więc trzech możliwości, a JEŻELI daje nam tylko 2. I dlatego musimy ją zagnieździć w sobie. Sytuację tę przedstawia poniższy obrazek:

Logika

Lewa gałąź “załatwia” nam wzrost, natomiast prawa, gdy warunek jest niespełniony, sprawdza kolejny warunek, tym razem o braku zmian. Jeśli ten warunek jest prawdziwy, to faktycznie mamy brak zmian. Jeśli fałszywy – nie pozostaje już nic innego jak spadek.

Formuła w Excelu wygląda więc następująco:

=JEŻELI(D4>C4;"wzrost";JEŻELI(C4=D4;"brak zmian";"spadek"))

Po skopiowaniu formuły do pozostałych komórek, otrzymujemy następujący wynik:

Wynik zagnieżdżonego JEŻELI

Działa i tak można robić w tych wersjach Excela, w których funkcji WARUNKI nie ma.

“Nowy” sposób

To po prostu użycie funkcji WARUNKI, zamiast tych zagnieżdżonych JEŻELI. Przyjrzyjmy się zatem samej funkcji WARUNKI. Oto jej składnia:

Składnia funkcji WARUNKI

Składnia funkcji WARUNKI

Z obrazka powyżej widać, że funkcja ta potrzebuje od nas par informacji: warunek – co ma się stać, gdy jest prawdziwy. Takich Par może od nas przyjąć aż 127, co wcale nie oznacza, że musimy. Korzystamy z tylu, ilu potrzebujemy.

Czyli w naszym przypadku, schematycznie może to wyglądać tak:

sprzedaż 2017 > sprzedaż 2016; “wzrost”; sprzedaż 2017 < sprzedaż 2016; “spadek”; sprzedaż 2017 = sprzedaż 2016; “brak zmian”

… i pięknie zadziała. Natomiast, jeśli zamiast ostatniego warunku, o równości, wpiszemy “PRAWDA”, funkcja zrozumie, że jeśli żaden wcześniejszy warunek nie będzie spełniony – ma wyświetlić “brak zmian”, czyli wartość dla tej PRAWDY. Czyli możemy napisać tak:

sprzedaż 2017 ; sprzedaż 2016; “wzrost”; sprzedaż 2017 < sprzedaż 2016; “spadek”; PRAWDA; “brak zmian”

A przekładając na formułę Excela:

=WARUNKI(D4>C4;"wzrost";D4<C4;"spadek";PRAWDA;"brak zmian")

Efekt tego będzie identyczny, jak formuły z zagnieżdżonym JEŻELI (dla porównania napisałam w kolumnie obok):

Wynik funkcji WARUNKI

Wynik funkcji WARUNKI

I wersja wideo tego wpisu:

 

Zmiany sprzedaży bez JEŻELI?

$
0
0

Czyli o funkcji WYBIERZ i ZNAK

W poprzednim wpisie pokazywałam nową funkcję w Excelu – WARUNKI. Świetna funkcja logiczna, która może być świetną alternatywą dla funkcji JEŻELI. Do wpisu nagrałam też film, który wrzuciłam na YouToube. Tamże właśnie Bill Szysz napisał coś, co było powodem powstania tego posta: pokazywany przeze mnie przypadek da się zrobić w ogóle bez funkcji JEŻELI. Przyznam, że nigdy nawet do głowy mi nie przyszło, żeby zrobić ten case inaczej niż JEŻELI, a tu proszę – podobno się da :).

No to wymyśliłam sposób i faktycznie – da się :). I o tym będzie dzisiaj.

Dane do zadania wyglądają identycznie, jak poprzednio: mamy dwie kolumny ze sprzedażą z 2 różnych lat i chcemy sprawdzić czy był między nimi wzrost sprzedaży, spadek czy może brak zmian. Oto formatka:

Formatka

Formatka

Zaczynamy…!

Żeby w pełni zrozumieć rozwiązanie tego case’a, najpierw przyjrzyjmy się 2 funkcjom, które posłużą do rozwiązania tego problemu: WYBIERZ i ZNAK.

Funkcja WYBIERZ

Ta funkcja wydaje się kompletnie bezużyteczna na pierwszy rzut oka, bo jedyne co robi, to wyświetla odpowiedni swój argument. Odpowiedni, czyli ten, który wskazał użytkownik. Jeśli mielibyśmy np. taką funkcję:

=WYBIERZ(2;"spadek";"brak zmian";"wzrost")

To funkcja dałaby w wyniku brak zmian. Zrobiłaby tak, ponieważ jej pierwszy argument ma wartość 2. Oznacza to dla niej, że ma wyświetlić wartość drugiego argumentu (pierwszy, czyli nasze 2, jest pomijane w tej wyliczance). Gdybyśmy chcieli wyświetlić “wzrost”, w pierwszym argumencie powyższej funkcji trzeba byłoby wyświetlić 3. I tak dalej…

Na razie wydaje się mało przydatna, ale moment 🙂

Funkcja ZNAK

Ta funkcja z kolei umie stwierdzić jaki jest znak wpisanej do jej argumentu liczby. Wynik zwraca w postaci:

  • -1 dla liczb ujemnych
  • 0 dla zera
  • 1 dla licz dodatnich

I to całe jej czary. W naszej sytuacji możemy za pomocą tej funkcji zbadać znak różnicy między sprzedażą 2017 i 2016, czyli schematycznie: ZNAK(sprz2017-sprz2016). Wyniki będą następujące: w przypadku…

  • spadku -> -1
  • braku zmian -> 0
  • wzrostu -> 1

A teraz sobie to wszystko połączymy…

Formuła docelowa

Pewnie już widzicie do czego zmierzam. Chcę użyć funkcji ZNAK, by ustaliła numer argumentu, który ma wyświetlić WYBIERZ. Problem jest jednak taki, że wybierz potrzebuje liczb naturalnych, określających jej argumenty, ale ZNAK takowych nie zwraca… Na szczęście jest prosty myk, żeby wybrnąć z tej sytuacji. Do wyniku funkcji ZNAK, w któej oczywiście zbadamy różnicę między sprzedażą 2017 i 2016, dodamy po prostu 2. Wtedy:

  • -1 –> 1
  • 0 –> 2
  • 1 –> 3

I bingo!

Jak to umieścimy w pierwszym argumencie funkcji WYBIERZ, to ta zwróci nam odpowiedni opis. Czyli mamy taką formułę:

=WYBIERZ(ZNAK.LICZBY(D4-C4)+2;"spadek";"brak zmian";"wzrost")

Efekt dostajemy identyczny, jak zagnieżdżonym JEŻELI, czy opisywaną przeze mnie ostatnio funkcją WARUNKI:

Wynik

Wynik

Fajne? Mi się bardzo podoba 🙂

A tutaj plik z gotową formułą do pobrania:

MalinowyExcel Zmiany sprzedaży bez JEŻELI dw.xlsx

I wersja wideo:

 

 


Zapisz plik jako PDF w tym samym folderze (VBA)

$
0
0

Czyli zapisywanie pliku do PDF przyciskiem

Chodzi o to, że mamy plik w Excelu, np. ofertę dla klienta, i chcemy ją zapisać na dysku jako plik PDF. Jest to bardzo prosta czynność, którą spokojnie możemy wykonać ręcznie kilkoma kliknięciami myszki. Natomiast, gdy takich ofert generujemy sporo – zaoszczędzenie nawet tych kilku kliknięć może się okazać zbawienne.

I my właśnie te kilka kliknięć zaoszczędzimy dzięki prostemu makru: po kliknięciu przycisku drukowania, Excel stworzy plik PDF, który zapisze w tym samym katalogu, co sam jest i nazwie go tak, jak nazwa klienta.

Formatka będzie prosta i tak na prawdę nie ma ona kompletnie żadnego znaczenia. I tak będziemy zapisywać do PDF arkusz, czyli ważniejsze będą tutaj Twoje ustawienia wydruku danego arkusza. Ja drukuję obszar wydruku, który mieści się na jednej stronie, jest logo, data wydruku i wyśrodkowanie w poziomie:

Formatka

Formatka

To, co jest istotne, to nazwanie komórki D3 jako Klient. Po tej nazwie bowiem będziemy przywoływali klienta w kodzie VBA.

A sam kod można w dużej mierze nagrać. Konkretnie zapisywanie pliku jako PDF. Po nagraniu otrzymamy taki fragment kodu:

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
 "C\Users\....\MojPDF.pdf", _
 Quality:=xlQualityStandard, _
 IncludeDocProperties:=True, _
 IgnorePrintAreas:=False, _
 OpenAfterPublish:=False

I ścieżka dostępu w nim zawarta będzie stała. My chcemy dynamiczną, w zależności od położenia naszego Excela na dysku. To będzie więc do zmiany.

Do zmiany będzie również nazwa samego PDF’a. Obecnie też jest stała (MojPDF.pdf), a my chcemy, by plik nazywał się tak, jak klient z komórki D3 (nazwana jako Klient).

Parametryzowanie kodu

Będziemy potrzebowali dwóch zmiennych: ścieżka i klient. Obie będą tekstowe i umieszczę je w procedurze MojPDF.

Sub MojPDF()
 Dim Sciezka As String, Klient As String
End Sub

Ścieżka to będzie ścieżka pliku Excela, w którym obecnie się znajdujemy, a klient to wartość komórki o nazwie Klient w aktywnym arkuszu (koniecznie musisz ją nazwać, ponieważ inaczej kod się wykrzaczy):

 Sciezka = ThisWorkbook.Path & "\"
 Klient = ActiveSheet.Range("Klient").Value 

Tak na prawdę pobranie tych danych to połowa sukcesu. Można jeszcze dorzucić sprawdzanie, czy user wpisał nazwę klienta. Jeśli tego nie zrobił, możemy  narzucić mu jakąś nazwę, np. ambitne: “Klient” ;). Oczywiście pomysłów na to zabezpieczenie może być wiele (np. wyskakująca tabliczka z informacją, że nie wpisał klienta i koniec makra). Ja ograniczę się tutaj do wersji najprostszej:

If Klient = "" Then Klient = "Klient"

Teraz wystarczy tylko odpowiednio połączyć zmienne z kodem nagranym przez rejestrator – zamiast sztywnej ścieżki dostępu podpinamy naszą i łączymy ją z nazwą klienta:

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

Całość wygląda 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

Ostatnia instrukcja: OpenAfterPublish:=True oznacza, że PDF zostanie otwarty zaraz po utworzeniu. Jeśli tego nie chcesz – zmień to na OpenAfterPublish:=False.

Przypisywanie makra do przycisku

Teraz kwestia podpięcia makra do przycisku. Ja lubię przyciski obrazkowe, dlatego na mojej formatce widzicie obrazek, natomiast można oczywiście podpiąć do standardowego formantu formularza (opisywałam to tutaj, tylko wybierałam suwak, a nie przycisk).

Aby przypisać makro do obrazka, czy przycisku:

1. umieść obrazek/przycisk w arkuszu

2. kliknij na niego prawym przyciskiem myszy i…

3. wybierz opcję Przypisz makro

Przypisywanie makra do przycisku cz.1.

Przypisywanie makra do przycisku cz.1.

4. następnie z listy w okienku Przypisywanie makra wybierz to makro, które chcesz uruchomić po kliknięciu na ten obrazek/przycisk.

Przypisywanie makra do przycisku cz.2.

Przypisywanie makra do przycisku cz.2.

I gotowe!

Teraz, jak naciśniesz ten obrazek/przycisk, zostanie uruchomione nasze makro i aktywny arkusz zapisany jako PDF .

Plik do pobrania (pamiętaj o włączeniu makr)

MalinowyExcel Zapisz PDF w tym samym katalogu co Excel dw.xlsm

I wersja wideo wpisu:

 

 

 

 

 

Część wspólna warunków formatowania warunkowego

$
0
0

Czyli jak zaznaczyć dane, jeśli jest spełnione kilka warunków jednocześnie?

Na ostatnim webinarze, o formatowaniu warunkowym, zapytaliście czy można zrobić część wspólną warunków. Czyli przykładowo, jak mamy dwa warunki i jeden koloruje na różowo, a drugi na szaro, to żeby ich część wspólna, czyli komórki spełniające oba te warunki, była przenikającym się kolorem różowo-szarym. Czyli chodzi o coś takiego:

Wynik

Wbudowanej funkcjonalności, która robi dokładnie coś takiego, nie znalazłam. Natomiast znalazłam sposób, żeby sobie z tym poradzić :). O tym dalej we wpisie!

Formatka wygląda tak, jak na obrazku wcześniej. Potrzebne nam są dane ID wysyłki, nazwa towaru i inne dane, nie ma znaczenia ile ich jest. W ID wysyłki zakodowany jest rok i miesiąc wysyłki oraz jakiś jej numer, który nas tutaj nie interesuje. Czekolady mają w swojej nazwie słowo “czekolada” i po tym je rozpoznamy (idealnie byłoby mieć kolumnę Rodzaj towaru, ale jej nie mamy, więc radzimy sobie inaczej).

Zadanie polega na tym, aby wszystkie id wysyłki z marca zaznaczyć na różowo, i wszystkie towary, będące czekoladą – na szaro. Natomiast jeśli towar jest czekoladą i był wysłany w marcu – chcemy mieć przenikające się oba kolory i to całego wiersza.

Wysyłki z marca

Najpierw nadajmy 2 pierwsze reguły. Te łatwiejsze ;). Aby zaznaczyć na różowo wszystkie wysyłki z marca w kolumnie ID wysyłki  należy:

1. Zaznaczyć tę kolumnę, żeby Excel wiedział, że właśnie ją ma formatować.

2. Następnie wybrać Narzędzia główne/ Formatowanie warunkowe/ Reguły wyróżniania komórek/ Tekst zawierający

3. W okienku, które się pojawi, wpisujemy, że tekst ma zawierać /03/, natomiast format wybieramy Format niestandardowy, ponieważ umożliwi nam to określenie swojego koloru:

Określanie reguły dla marca

Określanie reguły dla marca

A tutaj określamy ten kolor:

Wybieranie koloru

Wybieranie koloru

4. Po zatwierdzeniu wszystkich okienek efekt mamy taki:

Transakcje z marca - wynik

Transakcje z marca – wynik

Teraz podobnie dla czekolad….

Towary: czekolada

Tutaj logika będzie identyczna, czyli szukamy tym razem produktów, które będą zawierały słowo: czekolada. Czyli znowu:

1. Zaznaczamy kolumnę Towar,

2. Następnie  Narzędzia główne/ Formatowanie warunkowe/ Reguły wyróżniania komórek/ Tekst zawierający

3. W okienku, które się pojawi, wpisujemy, że tekst ma zawierać czekolada (wielkość liter nie ma znaczenia), i znów Format niestandardowy, żeby znaleźć nasz kolor. Ja wybrałam szary.

Po zatwierdzeniu wszystkiego mamy już 2 różne warunki:

2 różne warunki

2 różne warunki

To teraz najtrudniejsza część…

Część wspólna: czekolady z marca

Czyli deseń. Tak na prawdę ten deseń to oddzielna, trzecia, reguła formatowania warunkowego. Reguła, która sprawdza czy dwa wcześniejsze warunki na raz są spełnione. Natomiast nie da się już jej “wyklikać” tak, jak robiliśmy to wcześniej. Trzeba teraz napisać formułę, która będzie nie dość, że sprawdzała oba wcześniejsze warunki, to jeszcze formatowała cały wiersz.

Żeby formuła sprawdzała 2 warunki jednocześnie, musimy użyć funkcji ORAZ. Natomiast w niej po kolei sprawdzimy wcześniejsze warunki:

Pierwszy z nich sprawdzi, czy transakcja była w marcu. Można to bardzo prosto sprawdzić poprzez funkcję FRAGMENT.TEKSTU. Nasz miesiąc zawsze jest na 8 pozycji w Id wysyłki i zawsze ma 2 znaki. Tak więc sprawdzimy, czy ten wycinek ID to marzec:

=FRAGMENT.TEKSTU($B6;8;2)="03"

A teraz sprawdzimy, czy w nazwie towaru znajduje się czekolada. To już będzie ciut trudniejsze, ponieważ to słowo nie zawsze występuje na identycznej pozycji… Na szczęście istniej funkcja SZUKAJ.TEKST, która umie określić pozycję, na której występuje dany tekst. Jeśli występuje. Jeśli nie występuje – zwróci błąd, co dla nas jest równoznaczne z tym, że warunek jest fałszywy. Funkcja ta potrzebuje od nas jedynie tekstu, który szukamy i tekstu, w którym szukamy. Warunek sprawdzający czekoladę będzie więc taki:

=SZUKAJ.TEKST("czekolada";$C6)>0

Tak na prawdę można byłoby pominąć porównanie “>0”, ponieważ Excel potraktuje jakąkolwiek dodatnią liczbę jako wartość logiczną PRAWDA, a tylko to jest potrzebne funkcji ORAZ do działania (na co zwrócił mi uwagę Adam Kopeć, za co mu bardzo dziękuję!). Cyzli może też być tak:

=SZUKAJ.TEKST("czekolada";$C6)

Całość, wrzucone do funkcji ORAZ, czyli to, co powinno się znaleźć w formatowaniu warunkowym, wygląda tak:

=ORAZ(FRAGMENT.TEKSTU($B6;8;2)="03";SZUKAJ.TEKST("czekolada";$C6))

Teraz trzeba to tylko wpisać do okienka formatowania warunkowego, czyli: Narzędzia główne/ Formatowanie warunkowe/ Nowa reguła/ Użyj formuły do określenia komórek, które należy sformatować:

Określanie reguły dla części wspólnej warunków

Określanie reguły dla części wspólnej warunków

i oczywiście wybrać formatowanie:

 

Żeby osiągnąć deseń...

Żeby osiągnąć deseń…

Wybieranie deseniu:

Deseń

Deseń

Efekt wszystkiego otrzymujemy taki:

Wynik: 3 reguły

Wynik: 3 reguły

Warto jeszcze sprawdzić, czy kolejność warunków jest dobra. W tym celu należy wejść do menedżera reguł, czyli Narzędzia główne/ Formatowanie warunkowe/ |Zarządzaj regułami. Kolejność powinna być taka, że warunek sprawdzający część wspólną warunków powinien być pierwszy:

Prawidłowa kolejność reguł

Prawidłowa kolejność reguł

Jeśli robisz w takiej kolejności jak ja, to kolejność będzie dobra. Natomiast jeśli coś by nie zadziałało – najpierw sprawdź właśnie kolejność :).

Ta dam! I wszystko. Mam nadzieję, że było pomocne. Zachęcam Cię też do obejrzenia poniższego filmu, ponieważ tam krok po kroku pokazuję jak to wszystko zrobić. A trochę tego jest… 😉

 

 

 

Część wspólna warunków formatowania warunkowego – inne rozwiązanie

$
0
0

Po opublikowaniu poprzedniego wpisu i oczywista – filmu na YouToube’ie, pojawiły się pod filmem bardzo ciekawe komentarze. Jeden z nich napisał Bill Szysz (również prowadzi kanał na YB). który zaproponował całkowicie inną, genialną metodę na rozwiązanie przedstawionego w filmie problemu. Genialną, ponieważ użył w niej zaledwie jednej funkcji, podczas gdy ja, w swoim wcześniejszym rozwiązaniu, aż trzy!

Dzisiejszy wpis będzie właśnie o rozwiązaniu Billa. I, specjalnie na tę okazję, zmieniłam kolorystykę na bardziej a’la Ken niż Barbie ;):

Formatka z wynikiem

Formatka z wynikiem

Let’s go!

Pierwsze dwa warunki, są identyczne jak w poprzednim wpisie. Czyli wysyłki czekolad w marcu zostają takie same, jedynie co zmieniłam, to kolory ;). Z różowego na niebieski.

Teraz tylko kwestia warunku o części wspólnej. That’s where the fun bigins!

Formuła, którą zaproponował Bill jest następująca:

=LICZ.WARUNKI($B6;"*/03/*";$C6;"*czekolada*")

Wpisujemy ją dokładnie tak, jak poprzednio, do formatowania warunkowego, po wcześniejszym zaznaczeniu formatowanego zakresu, czyli B6:E20. Natomiast pytanie jest: co ta formuła oznacza i dlaczego jest taka krótka?

Funkcja LICZ.JEŻELI, którą ta formuła wykorzystuje, potrafi policzyć ile komórek w zakresie spełnia określone kryteria. I, w przeciwieństwie do LICZ.JEŻELI, potrafi sprawdzić więcej niż jeden warunek. W tym wypadku sprawdza 2:

  1. czy ID wysyłki zawiera wpis /03/,
  2. czy Towar zawiera słowo czekolada?

“Nietypowe” zastosowanie tej funkcji tutaj polega na tym, że jako przeszukiwany zakres podajemy tylko jedną komórkę, gdzie zazwyczaj podajemy cały zakres. To czyni tę funkcję świetną alternatywą dla funkcji ORAZ. Wow! Dla mnie to wielkie odkrycie, dziękuję Bill!!!

Dodatkowo jako kryteria zostały podane teksty wykorzystujące znak *. Znak ten oznacz dowolny ciąg znaków. Czyli w zapisie: */03/* mówimy, że chcemy znaleźć tekst, który gdzieś w środku ma wpis /03/. Gdzieś w środku, czyli cokolwiek (*) może być przed tym wpisem i cokolwiek może być za nim.

Identyczna sytuacja jest z czekoladą: *czekolada*. Oba te zapisy mogą być stosowane jako kryteria w funkcji LICZ.WARUNKI i jej podobnych (a nawet w WYSZUKAJ.PIONOWO;)).

Dalej, po wpisaniu formuły postępujemy już identycznie, czyli wybieramy format,jaki chcemy nadać komórkom, które spełniają warunek (dokłądnie opisałam to tutaj). Tak, jak wspomniałam podmieniam tylko kolory:

Formatowanie Kena

Formatowanie Kena 🙂

po zatwierdzeniu wszystkich “OK”, otrzymujemy taki wynik:

Wynik

Wynik

I tyle, cała filozofia. Prawda, że genialne?

 

Oraz wersja wideo:

 

 

Tajemnicze dwa minusy w formułach…

$
0
0

Dwa minusy to sposób na konwersję wartości na liczbę. Konkretnie, oznaczają one po prostu podwójne mnożenie przez -1. Jeśli liczbę pomnożymy przez -1, to otrzymamy liczbę przeciwną. Jeśli natomiast tę przeciwną liczbę pomnożymy przez -1, otrzymamy tę liczbę, co na początku. I o to właśnie tutaj chodzi. O konwersję wartości, która nie jest liczbą, np. teksty czy wartość logiczna, na liczbę. Omówię to na 2 przykładach:

  1. będę szukać daty urodzenia pracownika, na podstawie jego ID (WYSZUKAJ.PIONOWO)
  2. a potem policzę ile pracowników urodziło się w październiku (SUMA.ILOCZYNÓW)

Formatka wygląda następująco:

Formatka

Formatka

Jedziemy z formułami!

Wyszukiwanie daty urodzenia

To klasyczne użycie funkcji WYSZUKAJ.PIONOWO. Na podstawie ID pracownika chcemy przyporządkować jego datę urodzenia. Szukać będziemy po ID, ponieważ jest to unikalna wartość, na pewno się nie powtórzy. Natomiast, jeśli po prostu odwołamy się do ID, komórki B6, funkcja nam nie zadziała – zwróci błąd. Stanie się tak dlatego, że  ID w pierwszej tabeli jest tekstem, mimo że co do wartości jest identyczną liczbą, co w drugiej tabeli. Natomiast dla Excela są to dwie różne wartości (01 kontra 1). Dlatego właśnie konieczna jest konwersja tekstu (01) na liczbę (1), aby funkcja miała po czym szukać.

Konwersji tej możemy dokonać na kilka różnych sposobów, o czym już kiedyś pisałam, natomiast ja tutaj użyję właśnie naszych dwóch minusów, które tej konwersji dokonają w formule. Wygląda ona tak (D6):

=WYSZUKAJ.PIONOWO(--B6;$F$6:$H$15;3;0)

Zwróć uwagę, że przed komórką z ID, czyli B6 są dwa minusy. Konwertują one tekst 01 na liczbę 1, po której funkcja WYSZUKAJ.PIONOWO już będzie w stanie odszukać odpowiednią wartość.

Po skopiowaniu tej formuły w dół otrzymamy daty urodzenia pracowników:

Przyporządkowane daty urodzenia

Przyporządkowane daty urodzenia

Urodzeni w październiku

Teraz możemy policzyć tych, którzy urodzili się w październiku. Zrobię to za pomocą operacji tablicowej w funkcji SUMA.ILOCZYNÓW (już kiedyś też o tym pisałam). Formuła wygląda następująco:

=SUMA.ILOCZYNÓW(--(MIESIĄC(D6:D10)=10))

Dwa minusy w tej sytuacji konwertują wartości logiczne na liczby: PRAWDA i FAŁSZ na odpowiednio: 1 i 0. Gdyby tej konwersji nie było, funkcja SUMA.ILOCZYNÓW otrzymałaby do zsumowania wyniki porównania: czy miesiąc od wartości jest równy 10, czyli PRAWDY i FAŁSZE.

=SUMA.ILOCZYNÓW({PRAWDA;PRAWDA;FAŁSZ;FAŁSZ;PRAWDA})

Tego ta funkcja nie umie zsumować i w wyniku otrzymalibyśmy zero.

Umie natomiast zsumować liczby, czyli jedynki i zera. Jeśli przekonwertujemy PRAWDĘ na liczbę, to otrzymamy 1, a FAŁSZ – zero. Tej konwersji dokonają właśnie dwa minusy. Efekt tego w formule jest taki:

=SUMA.ILOCZYNÓW({1;1;0;0;1})

Po zatwierdzeniu zaś otrzymamy prawidłowy wynik, czyli dla danych z formatki: 3.

Wynik formuły tablicowej

Wynik formuły tablicowej

I wszystko. Jak widać, konwersji można użyć w różnych sytuacjach, w tym artykule podałam 2 przykładowe. Z pewnością spotkasz ich więcej w swojej pracy 🙂

A póki co wersja wideo tego case’a:

Enjoy!

Odzyskiwanie różnych formuł po nadpisaniu ich wartością

$
0
0

Czyli trudna rzecz rozwiązana prostą metodą

Niedawno opisywałam już podobny przypadek, natomiast dotyczył on trochę łatwiejszej sytuacji. Chodziło bowiem o to, żeby dać użytkownikowi możliwość wpisania do jednej komórki wartości z palca, lub skorzystania z wpisanej tam formuły. Taki switch: chcę wartość, to ją wpiszę, a jak ją skasuję, to na jej miejscu pojawi się formuła. Cudo!

Wtedy jednak opisywałam sytuację, gdy w komórce ma się pojawić tylko jedna, określona formuła. Teraz natomiast chodzi o to, żeby mogły się tam pojawiać różne formuły, w zależności od komórki, którą będę edytowała. Brzmi strasznie, ale jest bardzo proste. Wymaga tylko kolumny pomocniczej i leciutkiej edycji kodu VBA, który napisałam dla poprzedniej sytuacji.

Formatkę i całą magię pokazuje ten rysunek:

Formatka

Formatka

Let’s go!

W rozwiązaniu, które wymyśliłam idę na łatwiznę (jak zwykle ;)). Pomyślałam sobie, że stworzę w arkuszu kolumnę (szara kolumna I), w której będą napisane formuły, które chcę odzyskać, gdy user skasuje wartość w komórce (z kolumny Jednostkowa cena netto). Tę kolumnę roboczą (I) ukryję i jedyne co makro będzie robiło innego niż poprzednio, to podbierało wartość z odpowiedniej komórki tej ukrytej kolumny. Nawet nie trudzę się, żeby wpisywało identyczną formułę. Dla użytkownika i tak to nie ma znaczenia – on chce widzieć określoną wartość :). O rety, ale sprytne 🙂

Całą modyfikacja w kodzie sprowadza się do tej jednej linijki:

Target.FormulaR1C1 = "=RC[4]"

Czyli cały kod, dla przypomnienia, wygląda tak:

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Zakres As Range
 
 On Error GoTo Obsluga
 
 Set Zakres = Me.Range("Ceny")
 
 If Not Intersect(Zakres, Target) Is Nothing And Target.Value = "" Then
 Target.FormulaR1C1 = "=RC[4]"
 End If
Obsluga:
 Set Zakres = Nothing
 
End Sub

I wszystko. Moim zdaniem efekt jest super, przy minimalnym nakładzie pracy. Czyli to, o co zazwyczaj chodzi 😉

Tutaj znajdziesz plik z rozwiązaniem do pobrania (oczywiście zawiera makra!):

A tutaj wersję wideo:

 

 

Wesołych (wiosennych) Świąt!

Wyróżnianie najmniejszej wartości w wierszu

$
0
0

Czyli sprytne użycie formatowania warunkowego…

Załóżmy, że chcemy dla w każdym wierszu tabeli wyróżnić najmniejszą wartość. Oczywiście chcemy to zrobić możliwie szybko, małym nakładem pracy i jeszcze tak, żeby rozwiązanie było dynamiczne, czyli jeśli zmienimy jakąś wartość – wyróżnienie się do tego dostosuje i na bieżąco sprawdzi, czy owa zmieniona nie jest najmniejsza. Mamy kilka magazynów (może być kilkanaście albo kilkaset dla większego dramatyzmu;)) i w każdym z nich, chcemy wyróżnić najmniejszą wartość w tygodniu:

Formatka 1

Formatka 1

Albo druga sytuacja, na tych samych danych: chcemy zaznaczyć cały wiersz, jeśli w tym wierszu znajdzie się najmniejsza wartość z wybranej kolumny (np. 4). Załóżmy, że w czwartek przychodzi kontrola do magazynu i chcemy wiedzieć, który magazyn tego dnia miał najmniejsze stany. I chcemy podświetlić cały wiersz dla tego magazynu, aby analizować stany jego magazynowe w całym tygodniu:

Formatka 2

Formatka 2

Oczywiście bez formatowania warunkowego tutaj się nie obejdzie. Formatowanie to będzie wymagało też napisania formuły, która zdefiniuje warunek. Czyli coś bardziej skomplikowanego, niż “wyklikanie” formatowania, jak to w wieeelu przypadkach wystarczy…

1. Wyróżnianie najmniejszej wartości w wierszu

W tym przypadku, w każdym wierszu naszego zakresu (C4:I9) chcemy zaznaczyć najmniejszą wartość w danym wierszu. Problem jest taki, że piszemy w tym celu jedną regułę formatowania warunkowego. Musi zatem być uniwersalna dla każdego wiersza zakresu.

W takich sytuacjach koniecznie będziemy musieli działać z adresowaniem komórek, czyli dolarami ($). To tak, jak pisanie jednej formuły dla dwuwymiarowego zakresu, czyli takiego, który składa się z kilku wierszy i kilku kolumn (klasyczny przykład takiego: tabliczka mnożenia).

Tutaj chcemy, aby dla każdej komórki w wierszu, w odpowiednich komórce wierszach, ale zawsze w obrębie kolumn od C do I (czyli np. w zakresie: C4:I4) Excel sprawdzał czy wartość konkretnej komórki jest najmniejszą w tym zakresie. I to mamy sprawdzić dla każdej komórki (stąd analogia do kopiowania formuły do dwuwymiarowego zakresu). W praktyce oznacza to, że każdą komórkę trzeba porównać do wartości minimalnej tego zakresu. Jeśli warunek ten będzie prawdziwy – formatowania warunkowe pokoloruje komórkę. Wartość najmniejszą zbadamy oczywiście funkcją MIN.

Czyli każdą komórkę w całym zakresie będziemy porównywać: niezależnie od tego, gdzie ona w tym zakresie się znajduje. Będziemy porównywać ją natomiast do wartości minimalnych konkretnych wierszy. Czyli warunek formatowania warunkowego będzie wyglądał tak:

=C4=MIN($C4:$I4)

Warto zauważyć, że funkcja MIN szuka najmniejszej wartości w zakresie z zablokowanymi kolumnami i odblokowanymi wierszami. Kolumny są zablokowane, ponieważ funkcja MIN ma szukać wartości minimalnej zawsze od C do I. Zakres tych kolumn jest stały i nie może się przesunąć w prawo (a tak własnie by się stało, gdybyśmy nie blokowali kolumn): czyli zarówno komórkę C4 jak i G4 mamy porównywać do najmniejszej wartości zakresu $C4:$I4. Natomiast dla komórki C5 i G5 ma to być już zakres $C5:$I5. Stąd z kolei zmieniają się wiersze.

To jak już formułę mamy omówioną, to kwestia nadania formatowania warunkowego:

1. Zaznacz zakres C4:I9, zaczynając zaznaczenie od komórki C4 – to bardzo ważne!

 

2. Wybierz z menu: Narzędzia główne/ Formatowanie warunkowe/ Użyj formuły do określenia komórek, które należy sformatować

3. W pole Edytuj opis reguły wpisz wcześniej ustaloną formułę. Jak na obrazku:

Reguła formatowania 1

Reguła formatowania 1

I tyle. Efekt mamy taki:

Najmniejsze wartości w wierszach - wynika

Najmniejsze wartości w wierszach – wynik

2. Wyróżnianie całego wiersza

Drugi case już pójdzie szybciej, po zrozumieniu tego wyżej. Tutaj mamy zaznaczyć cały wiersz, jeśli występuje w nim najmniejsza wartość wybranej kolumny. U nas będzie to kolumna F, czyli czwartek (trochę niefortunnie nazwałam ją cyfrą, ech).

Czyli będziemy teraz szukali wartości minimalnej w kolumnie F, konkretnie w zakresie $F$14:$F$19. Zawsze w nim, dlatego zablokowałam go bezwzględnie. Czyli będzie MIN($F$14:$F$19).

I do tego będziemy porównywać tylko jedną komórkę z wiersza: tę w kolumnie F. Ale, żeby podświetlić cały wiersz, musimy dla każdej komórki sprawdzić ten warunek. Ten, czyli porównujący komórkę w kolumnie F z tego wiersza do wartości minimalnej wspomnianego zakresu. Reguła formatowania warunkowego będzie więc taka:

=$F14=MIN($F$14:$F$19)

A wszystko należy wrzucić do nowej reguły formatowania warunkowego, czyli jeszcze raz:

1. Zaznacz zakres B14:I19 (lub jeśli chcesz wyróżniać też sumę to zakres: B14:J19), zaczynając zaznaczenie od komórki B14 – to bardzo ważne!

2. Wybierz z menu: Narzędzia główne/ Formatowanie warunkowe/ Użyj formuły do określenia komórek, które należy sformatować

3. W pole Edytuj opis reguły wpisz wcześniej ustaloną formułę. Jak na obrazku:

Reguła formatowania 2

Reguła formatowania 2

Po zatwierdzeniu wszystkich okienek otrzymamy taki wynik:

Wiersz z najmniejszą wartością w kolumnie - wynik

Wiersz z najmniejszą wartością w kolumnie – wynik

I wszystko :). Mam nadzieję, że Ci się przyda!

 

Poniżej plik do pobrania:
Tutaj plik z gotowcem do pobrania:Malinowy Excel Najmniejsza wartość w wierszu format war dw.xlsx

A tutaj wersja wideo:

 

 


Wyróżnianie aktywnej komórki kolorem

$
0
0

Czyli coś, o czym marzy każdy użytkownik…

… no, pewnie prawie każdy :). Ja bym się nie obraziła!

Chodzi o coś takiego:

Czyli gdziekolwiek w zakresie klikniemy – ta komórka ma się podświetlać na żółto (albo oczywiście jakikolwiek inny kolor). Tylko tyle i aż tyle, ponieważ, jak zobaczycie, to wcale nie będzie takie banalne… Do stworzenia tej magii użyję nazewnictwa komórek (choć da się bez), zdarzeń w VBA (makra) i oczywiście mojego kochanego formatowania warunkowego, do którego napiszę formułę…

Formatka do zadania wygląda tak:

Formatka

Formatka

1. Nazwanie komórki roboczej

Zacznijmy od nazwania komórki roboczej. Od razu powiem, że może być ona w innym, ukrytym arkuszu. Ja dałam ją w tym samym, aby czarno na białym widać było jej zmianę. Natomiast umiejscowienie jej nie ma znaczenia (tylko trzeba będzie odpowiednio się do niej odwołać w makrze).

Dla wygody nazwiemy tę komórkę np. KomorkaAdresu. Koniecznie to zrób zwłaszcza wtedy, gdy umieścisz ją w innym arkuszu – będzie to miało znaczenie dla formatowania warunkowego.

Aby nazwać komórkę – zaznacz ją, a następnie w polu nazwy (po lewej od paska formuły), wpisz nazwę: KomorkaAdresu. Zatwierdź Enterem i po sprawie.

Nazywanie komórki

Nazywanie komórki

2. Makro (VBA)

Kolejny etap to uzupełnianie przed chwilą nazwanej komórki.

Co powinno się w niej znajdować? Adres aktualnie zaznaczonej komórki. W jakiś sposób musimy określić, która komórka jest obecnie zaznaczona. Jakkolwiek śmiesznie to nie zabrzmi: Excel tego nie wie :). A konkretnie formuła w formatowaniu warunkowym tego nie wie. Ona umie odczytać wartość z komórki, ale nie adres aktywnej. To umie VBA. A żeby było dynamicznie zgodnie ze zmienionym zaznaczeniem, musimy użyć zdarzenia arkusza Selection Change, czyli zmiana zaznaczenia.

Aby je utworzyć, należy wejść do edytora VBA, najlepiej skrótem klawiszowym Alt + F11. Następnie w okienku Project Explorer, należy dwukrotnie kliknąć na nazwę interesującego nas Arkusza (u mnie Dane) i więc po wejściu do VBE (Visial Basic Editor), , dwa razy klikam w taki właśnie arkusz. Następnie z list rozwijanych w prawym oknie wybieramy:

(1) Worksheet, i

(2) SelectionChange (wybrane domyślnie)

Oba te kroki dokładnie opisałam tutaj.

Do procedury, która pojawiła się automatycznie wpisujemy następujący kod:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim Komorka As Range
 
 Set Komorka = Range("KomorkaAdresu")
 
 Komorka.Value = ActiveCell.Address
 
End Sub

Te kilka linijek robi tyle tyle, że do komórki, którą przed chwilą nazywaliśmy wpisujemy bezwzględny adres aktywnej komórki.

3. Formatowanie warunkowe

To teraz łączymy wszystko do kupy formatowaniem warunkowym.

Najpierw jednak zastanówmy się, kiedy w ogóle komórka zakresu ma się kolorować, czyli podświetlać. Odpowiedź nasuwa się oczywista: kiedy jest aktywna. I super, dokładnie tak jest. A jeszcze dokładniej: ma się podświetlać, kiedy jej adres jest równy wartości nazwanej komórki KomorkaAdresu.

Problem jednak w tym, że nie możemy porównać sobie tak: KomorkaAdresu = A1 (gdzie A1 ma reprezentować aktywną komórkę). To będzie oznaczało bowiem porównanie wartości tych komórek. A my chcemy adresy :).

I dlatego tutaj z pomocą przychodzi funkcja ADRES, która jako swój wynik zwraca właśnie adres komórki, określonej przez wiersz i kolumnę. Jeśli więc podamy jej te dwa argumenty – otrzymamy adres komórki. Dodatkowo podamy też trzeci argument, który określi sposób adresowania – u nas bezwzględne, czyli z dwoma dolarami ($). Pomocne będą jeszcze funkcje WIERSZ, która zwraca numer wiersza komórki, wskazanej w jej argumencie, i NR.KOLUMNY, działająca analogicznie, tylko na kolumny (zwraca numer, nie literę!).

Ale to w formatowaniu warunkowym. Najpierw należy je uruchomić:

1. Zaznacz zakres, który ma być formatowany (czyli ten, w którym aktywna komórka ma się kolorować), zaczynając od pierwszej komóki tego zakresu!!!

2. Wejdź 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 wpisz następującą regułę:

=ADRES(WIERSZ(B4);NR.KOLUMNY(B4);1)=KomorkaAdresu

4. Następnie kliknij przycisk Fortmatuj i wybierz formatowanie, jakie ma być zastosowane do wyróżniania aktywnej komórki, np. żółte wypełnienie.

5. Zatwierdź wszystko i gotowe!

Powyższe kroki ilustruje rysunek:

Reguła formatowania warunkowego

Reguła formatowania warunkowego

A efekt jest magiczny, nawet, gdy komórka miała już wcześniej kolor! Cudne, prawda? To zasługa formatowania warunkowego 🙂

Koniecznie jeszcze pamiętajcie, aby zapisać plik jako plik z obsługą makr, czyli z rozszerzeniem .xlsm (lub ewentualnie .xlsb – skoroszyt binarny).

I na koniec, jak zwykle, plik z gotowcem do pobrania:
MalinowyExcel Aktywna komórka podświetlona dw.xlsm

I film z rozwiązaniem tego case’a:

 

 

WARUNKI: nowa funkcja logiczna w Excelu

$
0
0

Czyli alternatywa dla zagnieżdżania funkcji JEŻELI

Do tej pory, jeśli mieliśmy do rozwiązania jakiś bardziej złożony problem logiczny, często trzeba było zagnieździć funkcję JEŻELI i to, o zgrozo!, kilka razy. Twórcy Excela postanowili się nad nami zlitować i stworzyli funkcję, która pozwala pominąć owo zagnieżdżanie. Funkcja WARUNKI, ponieważ ją mam na myśli, występuje na tę chwilę w najnowszej wersji Excela, w modelu subskrypcyjnym (artykuł z dnia 2018-05-03).

W tym wpisie pokazuję zastosowanie tej nowej funkcji, na prostym przykładzie badania wzrostów, spadków i braków zmian sprzedaży. Formatka, której użyję ma w sobie jedynie sprzedaż z 2 lat do porównania, i kolumnę, gdzie umieścimy komentarz z wynikiem: wzrost, spadek lub brak zmian:

Formatka

Formatka

Żeby zaprezentować Wam piękno tej funkcji, najpierw omówię sposób, w jaki można było to zrobić do tej pory, a potem pokażę Wam funkcję WARUNKI w akcji 🙂

Logika problemu i “stary” sposób

Zacznę oczywiście od logiki problemu, czyli powiem po co w ogóle kombinować?

Sytuacja bowiem ma się następująco: porównujemy sprzedaż z dwóch lat: 2016 i 2017. Chcemy się dowiedzieć, czy sprzedaż w 2017 wzrosła w stosunku do 2016, spadła, czy może była taka sama? Krótko mówiąc mamy 3 opcje, takie właśnie. Funkcja JEŻELI idealnie nadaje się do tego case’a, ponieważ umie ona ocenić, czy warunek jest prawdziwy, czy fałszywy. W naszej sytuacji warunkiem może być np.: czy sprzedaż 2017 jest większa niż 2016? Problem jednak jest taki, że funkcja JEŻELI rozpatruje tylko dwie sytuacje: spełnienie tego warunku lub niespełnienie. Jak spełnimy ten warunek, to wiadomo, że mamy wzrost. Natomiast jak nie spełnimy, to możemy mieć spadek, albo brak zmian.

Potrzebujemy więc trzech możliwości, a JEŻELI daje nam tylko 2. I dlatego musimy ją zagnieździć w sobie. Sytuację tę przedstawia poniższy obrazek:

Logika

Lewa gałąź “załatwia” nam wzrost, natomiast prawa, gdy warunek jest niespełniony, sprawdza kolejny warunek, tym razem o braku zmian. Jeśli ten warunek jest prawdziwy, to faktycznie mamy brak zmian. Jeśli fałszywy – nie pozostaje już nic innego jak spadek.

Formuła w Excelu wygląda więc następująco:

=JEŻELI(D4>C4;"wzrost";JEŻELI(C4=D4;"brak zmian";"spadek"))

Po skopiowaniu formuły do pozostałych komórek, otrzymujemy następujący wynik:

Wynik zagnieżdżonego JEŻELI

Działa i tak można robić w tych wersjach Excela, w których funkcji WARUNKI nie ma.

“Nowy” sposób

To po prostu użycie funkcji WARUNKI, zamiast tych zagnieżdżonych JEŻELI. Przyjrzyjmy się zatem samej funkcji WARUNKI. Oto jej składnia:

Składnia funkcji WARUNKI

Składnia funkcji WARUNKI

Z obrazka powyżej widać, że funkcja ta potrzebuje od nas par informacji: warunek – co ma się stać, gdy jest prawdziwy. Takich Par może od nas przyjąć aż 127, co wcale nie oznacza, że musimy. Korzystamy z tylu, ilu potrzebujemy.

Czyli w naszym przypadku, schematycznie może to wyglądać tak:

sprzedaż 2017 > sprzedaż 2016; “wzrost”; sprzedaż 2017 < sprzedaż 2016; “spadek”; sprzedaż 2017 = sprzedaż 2016; “brak zmian”

… i pięknie zadziała. Natomiast, jeśli zamiast ostatniego warunku, o równości, wpiszemy “PRAWDA”, funkcja zrozumie, że jeśli żaden wcześniejszy warunek nie będzie spełniony – ma wyświetlić “brak zmian”, czyli wartość dla tej PRAWDY. Czyli możemy napisać tak:

sprzedaż 2017 ; sprzedaż 2016; “wzrost”; sprzedaż 2017 < sprzedaż 2016; “spadek”; PRAWDA; “brak zmian”

A przekładając na formułę Excela:

=WARUNKI(D4>C4;"wzrost";D4<C4;"spadek";PRAWDA;"brak zmian")

Efekt tego będzie identyczny, jak formuły z zagnieżdżonym JEŻELI (dla porównania napisałam w kolumnie obok):

Wynik funkcji WARUNKI

Wynik funkcji WARUNKI

I wersja wideo tego wpisu:

 

Która data jest w przyszłym tygodniu?

$
0
0

Czyli formatowanie warunkowe z tygodniem zaczynającym się od poniedziałku

Załóżmy, że mamy spis faktur z ich terminami płatności:

Formatka

Formatka

Ponieważ płacimy faktury zawsze na czas (oby takich było jak najwięcej! :)), to chcielibyśmy wiedzieć, które z nich należy zapłacić w przyszłym tygodniu. Dobrze by było więc, aby przyszłotygodniowe faktury zostały jakoś wyróżnione na naszej liście. Wyróżnimy je oczywiście za pomocą formatowania warunkowego.

Na pierwszy rzut oka zadanie wydaje się prościutkie, ponieważ jeśli nasze terminy płatności są prawidłowymi datami (a są, no bo przecież jesteśmy świadomymi użytkownikami Excela :)), to formatowanie warunkowe zawiera wbudowaną funkcjonalność wyróżniania dat z przyszłego tygodnia. Ale, dla nas Polaków – ta funkcjonalność ma pewien minus, który może bardzo denerwować niektórych z nas  i jednocześnie uniemożliwiać korzystanie z tej funkcjonalności… Excel bowiem jest Amerykaninem, czyli zaczyna tydzień od niedzieli, a my, w Polsce, chcemy od poniedziałku.

Spójrzmy jak wygląda nasza formatka, jeśli zaznaczymy na niej daty z przyszłego tygodnia, korzystając z wbudowanej opcji formatowania warunkowego (zaznacz terminy płatności i Narzędzia główne/ Formatowanie warunkowe/  reguły wyróżniania komórek/ Data występująca/ W przyszłym tygodniu):

Wynik wbudowanej funkcjonalności formatowania warunkowego

Wynik wbudowanej funkcjonalności formatowania warunkowego

Zakładając, że dzisiejsza data to 4 sierpnia 2018, przyszły tydzień to zakres dat od 6. do 12. sierpnia (patrz obrazek poniżej). Natomiast, co widać na powyższym obrazku, Excel zaznaczył też 5 sierpnia (niedziela obecnego tygodnia) i nie zaznaczył 12 sierpnia (niedziela przyszłego tygodnia). Stalo się tak dlatego,że on zaczyna tydzień od niedzieli i, niestety, nie mają na to wpływu ustawienia systemu operacyjnego (u mnie na komputerze tydzień zaczyna się od poniedziałku).

Kalendarz Sierpień 2018

Kalendarz Sierpień 2018

Z tym właśnie problemem będziemy się mierzyć.

A tak swoją drogą: czy to jest faktycznie jakiś straszny problem? Dla mnie nie :). W rozpatrywanym przypadku – zapłacę fakturę trochę wcześniej, tragedii nie będzie. Ja lubię rozwiązania proste, więc skorzystałabym z wbudowanej funkcjonalności formatowania warunkowego. Problem pojawiłby się, gdybyśmy musieli pisać formułę w innej kolumnie – tutaj już trzeba pisać formułę…

Logika problemu

Teoretycznie sprawa jest prosta. Jeśli obecny tydzień ma numer np. 31, to kolejny będzie miał o jeden więcej, czyli 32. W Excelu są nawet 2 funkcje, które umieją określić numer tygodnia w roku: NUM.TYG i ISO.NUM.TYG. W zależności od sposobu numerowania tygodni – zwracają odpowiedni numer tygodnia. Moglibyśmy użyć którejkolwiek z nich, z odpowiednimi ustawieniami i by zadziałało. Natomiast problem pojawia się, gdy mamy przekroczenie roku. Wtedy ostatni tydzień to 52 lub 53, a kolejny to 1, a nie o jeden większy od poprzedniego… Przyznam, że gdy myślę o formule, która musiałby uwzględnić wszystkie możliwe tutaj sytuacje, to mnie głowa boli! Jeżeli to, to tamto, a jeżeli to lub to i tamto, to siamto. Masakra. Zbitek funkcji logicznych i pewnie i tak coś byśmy pominęli.

Krótko mówiąc: nie ma co się pchać w takie rozwiązanie (ech, gdyby nie ten przełom roku…;)). Na pewno istnieje jakieś prostsze” przecież tydzień to kolejne 7 dni, w naszym przypadku od poniedziałku do piątku, niezależnie od tego, jaki to jest miesiąc czy rok! Musi być łatwiejszy sposób!

I jest oczywiście. Nie będę się w nim odnosiła do numerów tygodni, tylko do samych dat i tego, którym dniem tygodnia są.

Skoro dziś jest np. 4 sierpnia, to za tydzień, czyli za 7 dni, będzie 11 sierpnia (4+7=11) i ta data na pewno będzie w przyszłym tygodniu. To oczywiste (i taki case już opisywałam). Problem jest taki, że mamy odwtorną sytuację, tzn. mamy datę hipotetycznie z przyszłego tygodnia, mamy też datę dzisiejszą i na tej podstawie ustalamy, czy owa pierwsza data jest w przyszłym tygodniu. A niekoniecznie różnica między tymi datami wynosi 7. Np. dziś jest 4 sierpnia, a szukaną datą jest 7 sierpnia. Różnica między nimi to 3 dni. Natomiast ponieważ 4 sierpnia to sobota, a 7 to wtorek, to tak – 7 sierpnia jest w przyszłym tygodniu.

I znowu, żeby sprawdzać, czy szukana data mieści się w jakimś przedziale i do tego spełnia określone warunki dnia tygodnia – wyszłaby nam formuła-tasiemiec. Brrr, tego nie chcemy. Musimy więc znaleźć jakieś uniwersalne rozwiązanie, które uwzględni siedmiodniową różnicę między datami.

Takim rozwiązaniem jest “przerobienie” obu dat na takie, między którymi jest różnica 7, jeśli są one oczywiście z następujących po sobie tygodni. Tylko jak dokonać takiego przerobienia skoro są różne różnice w zależności od dnia tygodni? Wykorzystać ten dzień tygodnia i “pozbyć się” go. Z każdą datą “wrócimy” niejako do początku tygodnia odejmując numer dnia tygodnia od daty, reprezentującej ten dzień. Dokonamy standaryzacji sobie obu dat.

Czyli np. dziś jest 4 sierpnia i jest to sobota. Sobota to 6. dzień tygodnia, więc od liczby, reprezentującej dzisiejszą datę, czyli 43316 odejmuję 6, co mi daje 43310, czyli dzień 29 lipca (niedziela poprzedniego tygodnia). Mogę do tego dodać 1, aby uzyskać poniedziałek, ale matematycznie nie będzie miało to znaczenia, ponieważ dokładnie taką samą operację zrobimy z drugą datą, czyli 7 sierpnia (wtorek, czyli odejmujemy 2), uzyskując 5 sierpnia (również niedziela poprzedniego tygodnia). Między tymi nowymi datami mamy dokładnie 7 dni różnicy. A taka różnica właśnie definiuje nam “przyszły tydzień”.

Tę nieco pokrętną logikę prezentuje poniższy obrazek:

 

Logika

Logika

Jak już rozumiemy zagadnienie, to formuła będzie już pikusiem 🙂

Formuła

Najpierw napiszę funkcje JEŻELI w żółtych komórkach formatki (E6:E16), a następnie pierwszy argument tej funkcji skopiuję do formatowania warunkowego i dostanę ładne wyróżnienie kolorem. A formuła jest taka:

=JEŻELI($E$3-DZIEŃ.TYG($E$3;2)=$B6-DZIEŃ.TYG($B6;2)-7;"przyszły tydzień";"")

Funkcja DZIEŃ.TYG określa numer dnia tygodnia, ze swoim drugim argumentem równym 2 – zaczyna numerację dni tygodnia od poniedziałku, czyli coś, co nas interesuje. Czyli od liczby reprezentującej dzisiejszy dzień odejmujemy jej numer dnia tygodnia, a następnie sprawdzamy, czy nowa liczba jest równa 7 plus liczba uzyskana w wyniku takiej samej operacji na dniu szukanym. Jeśli tak – mamy przyszły tydzień, jeśli nie – inny tydzień.

Efekt formuły wygląda tak (dla porównania zostawiłam wynik wbudowanej funkcjonalności formatowania warunkowego):

Wynik formuły

Wynik formuły

Teraz zostaje już tylko wrzucenie tej formuły do formatowania warunkowego.

Formatowanie warunkowe – formuła

Konkretnie będziemy wrzucać do niego tę część formuły:

=$E$3-DZIEŃ.TYG($E$3;2)=$B6-DZIEŃ.TYG($B6;2)-7

Aby to zrobić:

1. Zaznacz daty, które chcesz formatować warunkowo, czyli B6:B16

2. Wybierz: Narzędzia główne/ Formatowanie warunkowe/ Nowa reguła/ Użyj formuły do określenia komórek, które chcesz formatować

3. Wpisz wspomnianą wcześniej formułę i wybierz format komórki:

Ustawienia formatowania warunkowego

Ustawienia formatowania warunkowego

 

BTW formuła jest tak przygotowana, że po rozszerzeniu zakresu formatowania warunkowego na całą tabelę – pokoloruje całe wiersze:

I tyle! Efekt wszystkiego jest taki:

Wynik

Wynik

A co z przełomem roku?

Hehe, też zadziała :). Rozwiązanie jest niezależne od roku czy miesiąca. Działa po prostu na datach, czyli liczbach. Zobaczmy jak się zachowa, gdy jako dzisiejszą datę ustawimy 2018-12-27. Kalendarz na grudzień wygląda tak:

Kalendarz Grudzień 2018

Kalendarz Grudzień 2018

A nasze rozwiązanie tak:

Test na przełom roku

Test na przełom roku

Wygląda na to, że działa :).

I wersja wideo:

 

 

Excelowa krzyżówka

$
0
0

Przez wakacje mogę śmiało powiedzieć, że byłam bardziej babysitterem niż dziewczyną od Excela, ale już wrzesień, dzieciaczki w przedszkolu, więc mam dla Was coś na rozruszanie szarych komórek po wakacjach ;). Adam Golenia, fan Excela, stworzył… krzyżówkę o Excelu!

Tak oto wygląda:

Numerki w lewym górnym rogu to numery pytań, a w prawym dolnym – elementy hasła ;).

A to są pytania:

Niesamowita sprawa, ja już ją z przyjemnością rozwiązałam i powiem Wam, że 2 pozycji nie wiedziałam!

Krzyżówkę można pobrać do wydrukowania jako PDF: pobierz krzyżówkę

Ciekawe, jak Wam pójdzie?. Dajcie znać w komentarzu 🙂

Opis skrócony na liście rozwijanej

$
0
0

Czyli jak zrobić, aby wpisać do komórki inną wartość, niż wybraną z listy

Często w przypadków nazw klientów, mamy taki problem, że pełna ich nazwa jest bardzo długa, np. DREWMIRSTO Z.P.H. Paweł Mróz. Gdy wystawiamy fakturę dla takiego klienta, to chcemy, aby wyświetliła się na niej pełna nazwa. Natomiast sami posługujemy się nazwą skróconą, w tym wypadku DREWMIRSTO, i takiej też nazwy chcemy szukać na liście rozwijanej. Problem w tym, że standardowa funkcjonalność Excela wyświetla na liście tę samą wartość, co później wpisuje do komórki. W tym wpisie pokazać, jak tę funkcjonalność można zmienić. Uwaga! Nazwy firm są wymyślone.

Chodzi o coś takiego:

Formatka jest prosta, jak widać powyżej. Cała zabawa rozegra się w źródle listy rozwijanej i oczywiście w kodzie VBA 🙂

Źródło listy rozwijanej

Żeby wszystko się udało – potrzebujemy jakoś powiedzieć Excelowi, że DREWMIRSTO to to samo co DREWMIRSTO Z.P.H. Paweł Mróz. Stworzymy w tym celu prostą tabelę (mam na myśli obiekt tabela) z takimi przypisaniami. Ja ją umieściłam w innym arkuszu, aby go potem można było ukryć. Mój arkusz nazywa się Źródło:

Przypisania nazw klientów

Zdecydowałam się na umieszczenie tego w tabeli, ponieważ chcę, aby źródło listy rozwijanej było dynamiczne. Czyli, jak dopiszę do listy nowego klienta – ma on się pojawić na liście. W tym celu nazwałam kolumnę z klientami jako Lista_Klienci, a listę ze szczegółowymi nazwami Lista_Opisy. O tym już kiedyś pisałam tutaj.

Przygotowania zrobione, teraz kwestia podpięcia listy rozwijanej w formatce. W tym celu zaznacz komórkę C3 (wybierz klienta) i Dane/Poprawność danych. W okienku sprawdzania poprawności natomiast wybierz następujące opcje:

Tworzenie listy rozwijanej

Wybrałam listę z klientami, czyli krótkimi nazwami, ponieważ te dane użytkownik ma widzieć na liście.

Ok, to teraz ta trudniejsza część – makro 😉

Kod VBA

Cała magia ma się stać, kiedy user wybierze klienta z listy rozwijanej. Wybierze jego krótką nazwę, która zaraz potem ma zostać skasowana, a na jej miejsce ma zostać wstawiona odpowiednia długa nazwa. Do dzieła!

Aby w ogóle Excel zareagował na zmianę wartości w komórce, należy oprogramować takie własnie zdarzenie, czyli Change (tutaj opisałam jak to zrobić lub zobacz film na końcu artykułu). Pamiętajmy, że zdarzenie to działa dla każdej komórki w arkuszu, więc musimy się zabezpieczyć, aby działało tylko dla tych, które mają sprawdzanie poprawności i to jeszcze typu lista (type = 3). Dopiero w takim przypadku nasze makro powinno zacząć cokolwiek robić. A to już będzie proste:

  1. wyłączy zdarzenia
  2. sprawdzi pozycję wybranego klienta
  3. zapamięta długi opis tego klienta
  4. wstawi ten długi opis do komórki
  5. włączy zdarzenia

Miejmy jednak świadomość, że taki kod zadziała na każdą listę, nie tylko na tę z klientami. Ma to zarówno dobre jak i złe strony – wszystko jak zwykle zależy od sytuacji :).

Najpierw deklaracja wszystkich potrzebnych zmiennych (najczęściej piszemy ją sukcesywnie, ale gdybym to robiła w tym opisie, to chyba byście oszaleli ;)) i od razu – obsługa błędów just in case:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ListaKlienci As Range, ListaOpisy As Range
    Dim Opis As String, Pozycja As Long
    
    On Error GoTo Obsluga
    
Obsluga:
    Application.EnableEvents = True
End Sub

W powyższym: mówimy, że jeśli jakikolwiek błąd wystąpi, to makro ma najpierw przywrócić obsługę błędów (za chwilę ją wyłączymy), a potem zakończyć działanie.

Teraz kwestia warunku, że komórka musi zawierać sprawdzanie poprawności w postaci listy rozwijanej:

    If Target.Validation.Type = 3 Then

    End If

Gdy ten warunek jest spełniony – będziemy działać, jeśli nie – po prostu idziemy dalej, czyli kończymy działanie makra.

Teraz wyłączymy zdarzenia, ponieważ naszym celem jest skasowanie wartości komórki, a potem wpisanie do niej innej wartości. Czyli de facto kolejna zmiana wartości komórki, a na takie zdarzenie ma się uruchomić nasze makro, czyli mielibyśmy pętlę, a tego nie chcemy:

Application.EnableEvents = False

Teraz określamy zmienne obiektowe list klientów i opisów, aby kod był czytelniejszy, a makro szybsze:

        With Sheets("Źródło")
            Set ListaKlienci = .Range("Lista_Klienci")
            Set ListaOpisy = .Range("Lista_Opisy")
        End With

Ustalmy teraz pozycję klienta na liście – skorzystam tutaj z funkcji arkusza PODAJ.POZYCJĘ, czyli po angielsku MATCH. Zwraca ona pozycję wartości na liście. Można to zrobić na milion różnych sposobów, ale mi się podoba ten poniżej. Od razu przypiszemy  znalezioną długą nazwę klienta do zmiennej Opis i wpiszemy go do zmienianej przez użytkownika komórki (Target):

        Pozycja = WorksheetFunction.Match(Target.Value, ListaKlienci, 0)
        Opis = ListaOpisy.Cells(Pozycja, 1).Value
        
        Target.Value = Opis

Całość wygląda tak:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ListaKlienci As Range, ListaOpisy As Range
    Dim Opis As String, Pozycja As Long
    
    On Error GoTo Obsluga
    
    If Target.Validation.Type = 3 Then
        Application.EnableEvents = False
        With Sheets("Źródło")
            Set ListaKlienci = .Range("Lista_Klienci")
            Set ListaOpisy = .Range("Lista_Opisy")
        End With
        
        Pozycja = WorksheetFunction.Match(Target.Value, ListaKlienci, 0)
        Opis = ListaOpisy.Cells(Pozycja, 1).Value
        
        Target.Value = Opis
    End If
Obsluga:
    Application.EnableEvents = True
End Sub

Z kodowania to tyl, ważne jest jeszcze odpowiednie zapisanie pliku, ale to mam nadzieję, że już wiecie. Trzeba zapisać plik jako plik obsługujący makra, czyli *.xlsm lub *.xlsb.

Po wszystkim dostajemy taki efekt:

Wynik

Wynik

Tutaj możesz pobrać plik z gotowcem (włącz makra!):

MalinowyExcel Lista rozwijana Krotkie opisy i dlugie nazwy klientów dw.xlsm

A tutaj wersja wideo wpisu:

Enjoy!

Chcesz nauczyć się tworzyć listy rozwijane?

O listach w komórce oraz formantach formularzy  dowiesz się z nagrania webinaru Listy rozwijane.

Viewing all 291 articles
Browse latest View live