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

Dopisz dane do tabeli w chronionym arkuszu

$
0
0

Czyli auto-rozszerzanie tabeli…

Niby prosta rzecz: mamy chroniony arkusz, w nim obiekt tabela. Chcemy ją oczywiście uzupełniać i oczekujemy, że, jak to ma w zwyczaju tabela, powiększy się ona o dopisane poniżej niej dane.

A tu ZONK! Dane może i się dopisują (zakładając, że te komórki są odblokowane), ale tabela nie powiększa się w chronionym arkuszu!!!

Tak niestety się dzieje…

W tym artykule pospieszę na ratunek (koślawy co prawda – wolałabym, żeby tabele po prosu DZIAŁAŁY w chronionym arkuszu!). Pokażę makro, które spowoduje, że gdy user dopisze nowe dane bezpośrednio pod tabelą – powiększy się ona o ten dopisany rekord.

Dodatkowo, dzięki sprytnemu wykorzystaniu stylów sprawię też, że kopiowane formuły z kolumn obliczeniowych będą chronione, natomiast użytkownik nadal będzie mógł korzystać z list rozwijanych i wpisywać dane w odpowiednie kolumny tabeli.

Efekt będzie następujący:

Jedziemy!

Formatka, czyli z czym mamy do czynienia?

Zanim przejdziemy do pisania kodu – najpierw musimy mieć odpowiednio przygotowaną formatkę. Jest w niej obiekt tabela (nazwany tbFV), w którym przechowujemy dane o płatnościach. Dla ułatwienia kodu, tabela ta zaczyna się w pierwszym wierszu arkusza. Użytkownik uzupełnia pierwsze 4 kolumny (C:F), a ostatnia sama się wylicza, gdyż jest tam formuła. Założenie jest takie, że tej kolumny user ma nie tykać. Dodatkowo, informację o tym, czy faktura została zapłacona czy nie, użytkownik wybiera z listy (OK/NOK).

Formatka wygląda następująco:

Formatka

Formatka

I tak w naszej formatce:

  • kolumny uzupełniane przez usera: C:F
    • w tym kolumna F – dane wybierane z listy
  • kolumny z formułą (zablokowane): G

Chcemy, aby po dopisaniu nowych danych – powyższe opcje ochrony zostały takie same! Aby to osiągnąć, należy pamiętać o jednej, niezwykle istotnej rzeczy: tabela zachowuje formatowanie, czyli podczas dopisywania do niej nowych danych – kopiuje formatowanie na nowe komórki! Tzn., że nowe komórki dostaną takie samo formatowanie, jak miały komórki w tej samej kolumnie w tabeli. Przed ochronieniem arkusza musimy więc odpowiednio przygotować komórki zarówno w tabeli, jak i te pod nią:

  1. Komórki w tabeli: kolumny C:F muszą być odblokowane. User ma mieć możliwość ich modyfikacji zawsze.
  2. Komórki w tabeli: kolumna G: ta kolumna musi być zablokowna do edycji przez usera, a formuły w niej ukryte (nie chcemy, by widziano formułę, choć to opcjonalne)
  3. Komórki pod tabelą (te, które zamierzamy w przyszłości uzupełniać nowymi danymi) – wszystkie odblokowane!

A teraz po kolei o tym, jak to zrobić:

Odblokowanie komórek

Dotyczy komórek w kolumnie C:F tabeli i komórek pod tabelą.

Aby odblokować komórki, czyli spowodować, że po założeniu ochrony arkusza będzie można coś do nich wpisywać – należy:

  1. Zaznaczyć je
  2. Wejść do okienka formatowania komórki (Ctrl + 1), zakładka Ochrona
  3. Odznaczyć opcję Zablokuj:
Formatka - odblokowane komórki

Formatka – odblokowane komórki

Ta opcja będzie aktywna dopiero po uruchomieniu ochrony arkusza.

Zablokowanie komórki, ukrycie formuł

Dotyczy kolumny G w tabeli.

Odwrotną operację zrobimy z kolumną z formułami w tabeli. Tutaj będziemy blokować komórki, żeby user nam nic w nich nie popsuł. Dodatkowo można ukryć formułę, która się w nich znajduje, aby nie mógł jej podpatrzeć np. na pasku formuły.

W tym celu powtarzamy kroki jak przy odblokowywaniu komórek, tylko zaznaczamy opcje, jak na obrazku:

Formatka - zablokowane komórki

Formatka – zablokowane komórki

Ja zwykle stosuję w swoich arkuszach zasadę, że formuły zaznaczam na niebiesko i ustawiam im właśnie zablokowanie i ukrycie formuły. Ponieważ robię to za każdym razem, w każdym arkuszu – stworzyłam sobie specjalny styl Formuła, żeby jednym kliknięciem ustawiać dokładnie to formatowanie. Styl ten podpięłam do domyślnego arkusza, więc mam go w każdym nowym pliku – mega oszczędza mi to czas! O stylach i domyślnym szablonie arkusza mówiłam na tym webinarze.

Teraz, gdy te czynności są już wykonane, możemy zakładać ochronę arkusza.

Ochrona arkusza

Ochronę zakładamy np. z menu Recenzja/ Chroń arkusz. Jeśli chcesz ochronić arkusz hasłem – tutaj jest miejsce, aby to hasło podać. Jeśli nie podasz – każdy będzie mógł zdjąć ochronę (jeśli wie jak ;)).

To, czy nadasz hasło czy nie – zależy tylko od Ciebie. Pamiętaj jednak, że będzie to miało znaczenie w makrze. Ja ochronę założę z hasłem, aby pokazać jak to hasło uwzględnić w kodzie.

Zakładanie ochrony arkusza

Zakładanie ochrony arkusza (z hasłem)

Teraz właśnie jesteśmy na etapie, że tabela się nie powiększa, gdy dopiszemy pod nią dane. Będziemy naprawiać tę niedoróbkę.

Założenia makra

Zanim jednak przejdę do omawiania kodu – najpierw założenia:

  1. Arkusz jest chroniony
  2. Komórki w wierszach poniżej tabeli nie są chronione (musimy mieć możliwość dopisania w nich danych, gdy arkusz jest zablokowany)
  3. Tabela zaczyna się w pierwszym wierszu arkusza

Nie ukrywam, że te założenia są po to, aby uprościć sytuację, a co za tym idzie – kod.

Omówienie kodu

Logika kodu jest taka, że makro sprawdzi, czy użytkownik wpisał wartość w jedną z komórek zakresu tuż pod tabelą (C21:G21). Jeśli tak – zostanie zdjęta ochrona arkusza, zakres tabeli zostanie rozszerzony, a następnie arkusz znów zostanie ochroniony.

Makro będzie przechowywane w module prywatnym arkusza i będzie to zdarzenie Worksheet_Change, czyli uruchomi się w momencie jakiejkolwiek zmiany wartości komórki arkusza. O tym, gdzie wpisywać kod (stworzyć zdarzenie) pisałam już np. tutaj (możesz to też zobaczyć na filmie na końcu tego artykułu).

1. Zaczynamy od deklaracji zmiennych i określenia hasła (ja to zrobiłam w zmiennej lokalnej, żeby już nie mieszać). Jeśli Twój arkusz nie będzie miał hasła przy ochronie – pomiń zmienną Hasło i jakiekolwiek jej wystąpienie w kodzie poniżej.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim OstWiersz As Long, Tabela As ListObject, Zakres As Range
    Dim Haslo As String

    Haslo = "t"
End Sub

2. Następnie jest obsługa błędów, sprawdzenie, czy zmieniana komórka przypadkiem nie jest pusta i wyłączenie obsługi zdarzeń.

Jeśli jakikolwiek błąd wystąpi – przejdziemy do kawałka kodu (Obsluga), który (na razie) włączy obsługę zdarzeń:

    On Error GoTo Obsluga
    If Target.Value = "" Then Exit Sub

    Application.EnableEvents = False

Obsluga:
    Application.EnableEvents = True
End Sub

3. Dalsze linijki wpisujemy w środek powyższego kodu, czyli przed etykietą Obsluga.

Teraz zdefiniujemy naszą Tabelę, sprawdzimy jaki jest jej ostatni wiersz i określimy zakres tuż pod tabelą (do niego użytkownik wpisuje nowe wartości i wtedy tabela ma się powiększyć):

    Set Tabela = Me.ListObjects("tbFV")
       OstWiersz = Tabela.Range.Rows.Count
    Set Zakres = Tabela.Range.Rows(OstWiersz + 1)

4. Teraz sprawdzimy czy zakres pod tabelą, Zakres, i nasza uzupełniona komórka (Target) mają część wspólną (Intersect), czyli po prostu, czy Target znajduje się w Zakresie. Jeśli nie – nic się nie stanie, jeśli tak – odblokowujemy arkusz, a następnie zwiększamy rozmiar tabeli.

Dodatkowo, ponieważ własnie zdjęliśmy ochronę, koniecznie musimy ją założyć, aby pozostawić arkusz w takim stanie, w jakim go zastaliśmy. Dodajemy więc linijkę zakładającą hasło zaraz pod etykietą Obsluga:

    If Not Intersect(Zakres, Target) Is Nothing Then
        Me.Unprotect Haslo
        Tabela.Resize Me.Range("$C$1:$G$" & OstWiersz + 1)
    End If

Obsluga:
    Me.Protect Haslo
    Application.EnableEvents = True
End Sub

5. Całość wygląda tak:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim OstWiersz As Long, Tabela As ListObject, Zakres As Range
    Dim Haslo As String

    Haslo = "t"

    On Error GoTo Obsluga
    If Target.Value = "" Then Exit Sub

    Application.EnableEvents = False

    Set Tabela = Me.ListObjects("tbFV")
       OstWiersz = Tabela.Range.Rows.Count
    Set Zakres = Tabela.Range.Rows(OstWiersz + 1)

    If Not Intersect(Zakres, Target) Is Nothing Then
        Me.Unprotect Haslo
        Tabela.Resize Me.Range("$C$1:$G$" & OstWiersz + 1)
    End If

Obsluga:
    Me.Protect Haslo
    Application.EnableEvents = True
End Sub

W nowym wierszu wszystko działa pięknie: jest on częścią tabeli, kolumna z formułą jest chroniona, a pozostałe nie. Dzieje się tak dlatego, że podczas dodawania kolejnych wierszy do tabeli kopiowane jest tabelowe formatowanie komórki, czyli skopiowana formuła dostaje format z ochroną, a kolumny ręcznie uzupełniane przez usera – bez ochrony. Poprawność danych (lista rozwijana) też jest kopiowana.

Pamiętaj, aby plik zapisać tak, aby obsługiwał makra, czyli z rozszerzeniem .xlsm lub .xlsb.

O to dokładnie chodziło! Jeśli u Ciebie też działa i jest to coś, czego szukała(e)ś – mam do Ciebie ogromną prośbę: udostępnij ten artykuł swoim znajomym. Uważam, że to bardzo przydatna wiedza i, nieśmiało stwierdzę – kawał dobrej roboty z mojej strony. Na pewno przyda się wieeelu osobom. Dlatego udostępniaj! Dziękuję! :). Na koniec tradycyjnie gotowiec do pobrania tutaj.

 

Powiązane produkty

 

A tutaj film pokazujący to rozwiązanie:

Na koniec dodam, że problem niedziałania tabel w chronionym arkuszu denerwuje wieeeelu użytkowników. Dlatego do Microsoftu zostało już to zgłoszone – jeśli chcesz dodać swój głos w tej sprawie – zrób to tutaj (strona Excel User Voice). W prośbie tej zawarte jest o wiele więcej, niż podejmuję się w tym artykule, dlatego tym bardziej warto zagłosować :).

 

 

 


Wyróżnij kolorem cały wiersz tabeli

$
0
0

Czyli formatowanie warunkowe – prosty przykład

Ostatnio prowadziłam szkolenie, pod koniec którego jeden z uczestników zapytał mnie jak zaznaczyć cały wiersz tabeli, jeśli w wybranej kolumnie występuje wybrany wpis. Ponieważ nie starczyło już czasu na pełną odwiedź na to pytanie – skierowałam go na blog, żeby na spokojnie o tym doczytał. Zaczęłam szukać konkretnego wpisu, bo byłam przekonana, że taki jest, a tutaj patrzę: nie ma! Jest kilka innych, wykorzystujących tę samą technikę (np.  wartości w 2 kolumnach musiały już kiedyś wystąpić, część wspólna warunków, lub inna wersja części wspólnej warunków), natomiast nie było takiego stricte najprostszego przykładu!

Pomyślałam: no nie, tak nie może być! Przecież to klasyka!

Ten wpis będzie nadrabiał tę niedoróbkę i omówię w nim jak zrobić, aby po wybraniu z listy rozwijanej działu – w tabeli z danymi podświetlały się całe wiersze, w których ten dział występuje. Czyli chcę uzyskać taki efekt:

Formatka będzie to prosta tabela z danymi, u mnie akurat dane pracowników. Do tego, jako bajerek i dla swojej własnej wygody – jest lista rozwijana, z której user wybiera dział, który ma zostać wyróżniony:

Formatka

Formatka

Aby dodać formatowanie warunkowe dla całego wiersza, tak na prawdę określamy je dla całej tabeli, na podstawie aktywnej komórki.

  1. Zaznaczmy więc całą tabelę (bez nagłówka), zaczynając od pierwszej komórki danych, czyli u mnie od B6.
  2. Wybieramy z menu Narzędzia główne/Formatowanie warunkowe/Nowa reguła…/Użyj formuły do określenia komórek, które należy sformatować
  3. W pole formuły wpisz prostą regułę:
    =$E6=$E$3

    Tworzenie reguły formatowania warunkowego.

    Tworzenie reguły formatowania warunkowego.

  4. Wybierz format, czyli wyróżnienie (pkt. 3 na rysunku powyżej). U mnie to zaznaczenie na kolor jasnożółty
  5. Zatwierdź wszystko i to już koniec!

Efekt jest dokładnie taki, jak chcieliśmy:

Prawda, że proste?

Zgadzam się, że wymyślenie tego od zera wcale proste nie jest – te dolary są dość nieintuicyjne na pierwszy rzut oka. Jednak jak pomyślimy sobie, że mamy napisać uniwersalną formułę dla każdej komórki tabeli, i ta formuła ma być prawdziwa (dać w swoim wyniku PRAWDA), gdy użytkownik wybierze konkretny dział, to zobaczymy, że prawdziwość tej formuły zależna będzie od wartości komórki w kolumnie E danego wiersza. Dlatego tę kolumnę blokujemy dolarem ($E), a wiersz zostawiamy w spokoju, ponieważ wiersze akurat mają się zmieniać.

Ważny jest też oczywiście dział wybrany przez usera, E3, który musi być bezwzględnie zablokowany ($E$3), ponieważ każda komórka odwołuje się właśnie do niego. Mam wrażenie, że tu akurat nie ma wątpliwości :).

Powiązane produkty

 

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

MalinowyExcel Wyroznij caly wiersz tabeli formatowanie warunkowe dw.xlsx

 

A tutaj wersja wideo na YB:

 

 

 

 

Zaproszenie na WEBINAR: Nazwy w Excelu – wstęp

$
0
0

Zapraszam Cię na bezpłatny webinar Nazwy w Excelu – wstęp. Na webinarze wprowadzę Cię w temat nazewnictwa. Temat, który bardzo ułatwia życie w Excelu również początkującym użytkownikom, a bywa, że tym zaawansowanym w ogóle umożliwia wykonanie niektórych zadań, jak dynamiczne listy rozwijane między arkuszami.

Wpadaj koniecznie, tylko najpierw się zapisz TUTAJ, ponieważ tylko zapisane 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!

Korespondencja seryjna generująca oddzielne PDF-y

$
0
0

Czyli tworzenie wielu PDF-ów z jednej formatki

Podobny temat kiedyś już poruszałam na blogu, natomiast chodziło o stworzenie oddzielnych arkuszy dla pracowników, których informujemy o podwyżce. Tym razem też będziemy informować pracowników o podwyżce, natomiast dla każdego wygenerujemy oddzielny PDF z tą informacją. O tak:

Tylko troszkę zmodyfikujemy kod, który pokazywałam tutaj. Jedziemy!

Co będzie do zmiany?

Logika poprzedniego kodu była taka, że kopiowaliśmy arkusz z formatką i podstawialiśmy do niego dane kolejnej osoby. Robiliśmy to (pętlą) tyle razy, ile było osób na liście w arkuszu Dane. Oto formatka z listą osób, dla przypomnienia:

Dane do podstawienia do formatki

Dane do podstawienia do formatki

Teraz, będziemy oczywiście wstawiać dane odpowiednich osób, natomiast zamiast kopiowania arkuszy – stworzymy PDF. A dokładniej: będziemy eksportować arkusz Excela do PDF (już kilka razy pisałam o tym na blogu – listę artykułów znajdziesz na dole tego wpisu).

W tym celu dokonamy kilku zmian w poprzednim kodzie.

Poprzedni kod i zmiany w nim

Poprzedni kod (umieszczony w module, tutaj znajdziesz opis jak to zrobić) wygląda następująco (dokładny jego opis znajdziesz tutaj):

Sub Korespondencja()
    Dim Zakres As Range, Czlowiek As String, Stawka As Double
    Dim ArkWniosek As Worksheet, ArkNowy As Worksheet
    Dim Licznik As Long, Wierszy As Long
    
    Application.ScreenUpdating = False
    
    Set ArkWniosek = Sheets("Wniosek")
    Set Zakres = Sheets("Dane").Range("tbOsoby")
        Wierszy = Zakres.Rows.Count
    
    For Licznik = 1 To Wierszy
        Czlowiek = Zakres.Cells(Licznik, 1).Value
        Stawka = Zakres.Cells(Licznik, 2).Value
        
        ArkWniosek.Copy After:=ArkWniosek
            Set ArkNowy = Sheets(ArkWniosek.Index + 1)
            ArkNowy.Name = Czlowiek
        
        ArkNowy.Range("F9").Value = Czlowiek
        ArkNowy.Range("F12").Value = Stawka
    Next
    
    ArkWniosek.Activate
    Application.ScreenUpdating = True
End Sub

1. Na początek dodeklarujemy zmienną Sciezka, która będzie mówiła o miejscu zapisywania naszych wynikowych PDF-ów. Przypiszemy od razu do niej wartość – będzie to dokładnie ta sama ścieżka co pliku, w którym jest makro. Te 2 linijki o tym mówią:

    Dim  Sciezka As String

    Sciezka = ThisWorkbook.Path & "\"

2. Teraz usunę fragment kopiujący arkusz i zmieniający jego nazwę.

3. Zostawię przypisanie wartości do komórek, natomiast zmienię arkusz, w którym to robię z ArkNowy na ArkWniosek, ponieważ wszystko będzie działa się w jednej formatce. Wrzucę to w konstrukcję With:

        With ArkWniosek
            .Range("F9").Value = Czlowiek
            .Range("F12").Value = Stawka
        End With

4. Teraz już czas zapisanie tego jako PDF, czy raczej eksport do PDF (poniższy kod najłatwiej wygenerować poprzez nagranie makra, które zapisze plik jako PDF):

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

Zauważ, że jako nazwę pliku (filename) podałam kombinację Sciezki i Czlowieka – tak chcę nazywać utworzone pliki PDF.

5. Na koniec jeszcze czyszczenie formatki:

    With ArkWniosek
        .Range("F9").ClearContents
        .Range("F12").ClearContents
    End With

6. I poinformowanie użytkownika, że wygenerowano PDF-y. Kosmetyka, ale ułatwia pracę:

       MsgBox "Stworzono PDF-y.", vbInformation

7. Cały kod wygląda tak (makro nazwałam TworzPDFy):

Sub TworzPDFy()
    Dim Zakres As Range, Czlowiek As String, Stawka As Double
    Dim ArkWniosek As Worksheet, Sciezka As String
    Dim Licznik As Long, Wierszy As Long
    
    Application.ScreenUpdating = False
    
    Set ArkWniosek = Sheets("Wniosek")
    Set Zakres = Sheets("Dane").Range("tbOsoby")
        Wierszy = Zakres.Rows.Count
    Sciezka = ThisWorkbook.Path & "\"
    
    For Licznik = 1 To Wierszy
        Czlowiek = Zakres.Cells(Licznik, 1).Value
        Stawka = Zakres.Cells(Licznik, 2).Value
        
        With ArkWniosek
            .Range("F9").Value = Czlowiek
            .Range("F12").Value = Stawka
        End With
        
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=Sciezka & Czlowiek & ".pdf", _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    Next
    
    With ArkWniosek
        .Range("F9").ClearContents
        .Range("F12").ClearContents
    End With
    
    Application.ScreenUpdating = True
    MsgBox "Stworzono PDF-y.", vbInformation
    
End Sub

To tyle. Pamiętaj koniecznie, aby plik zapisać jako plik obsługujący makra (czyli xlsm lub xlsb). I pamiętaj, aby podzielić się tym wpisem ze znajomymi – pewnie im też się przyda :)!

Załączam plik do pobrania:

MalinowyExcel_Korespondencja seryjna w Excelu oddzielne PDF dw.zip

I wersja wideo:

 

Tutaj znajdziesz jeszcze inne wpisy o tworzeniu PDF na podstawie arkusza:

 

 

Uzupełnianie danych na podstawie wyboru z listy rozwijanej

$
0
0

Czyli bajeranckie zastosowanie WYSZUKAJ.PIONOWO

Na podstawie wyboru z listy rozwijanej do formatki mają się wpisać określone dane. Jedni użyją tego mechanizmu do pomocy przy tworzeniu świadectw pracy, inni do pracy z umowami, jeszcze inni – do tworzenia ofert dla klientów.

Najlepsze jest to, że niezależnie od zastosowania – potrzebujemy tego samego mechanizmu, aby osiągnąć ten sam efekt:

A tym mechanizmem jest nic innego, jak ukochana przez wszystkich (no… prawie wszystkich) funkcja WYSZUKAJ.PIONOWO! I o niej dzisiaj 🙂

Formatka

Mechanizm tworzenia takiego cuda omówię na danych potrzebnych do stworzenia świadectwa pracy.

Formatka składa się z 2 arkuszy:

  1. Formatka – tutaj jest arkusz, który widzi użytkownik
  2. Dane – tutaj są dane, które pobiera formatka po wyborze pracownika z listy rozwijanej

A tak wyglądają po kolei oba arkusze.

Arkusz samej formatki:

Formatka

Formatka

Lista rozwijana w tej formatce jest już stworzona. O tym, jak zrobić, aby jej źródło było w innym arkuszu i do tego aby się sama powiększała – pisałam tutaj.

I arkusz z danymi pracowników:

Tabela z danymi (tbPracownicy)

Tabela z danymi (tbPracownicy)

Istotne jest, że dane pracowników przechowywane są w obiekcie tabela, nazwanym tbPracownicy. Będzie to za chwilę wykorzystywane w formule.

Formuła

Formuła będzie wykorzystywała funkcję WYSZUKAJ.PIONOWO w swoim klasycznym zastosowaniu. Czyli na podstawie imienia i nazwiska pracownika (zakładam, że jest ono unikalne w tych danych!) będzie wyszukiwała odpowiednią informację. Jaką? Będziemy chcieli uzupełnić wszystkie dane o pracowniku w formatce, czyli kolejno imiona rodziców, datę i miejsce urodzenia, nazwę pracodawcy itd. Będziemy musieli więc napisać tyle formuł, ile jest tych danych. Dla każdego wiersza oddzielnie. Oczywiście zrobimy to sprytnie tak, żeby się nie narobić :).

Dane na formatce są ułożone w identycznej kolejności, co dane w tabeli tbPracownicy. Wykorzystamy to i napiszemy jedną formułę, która będzie wyświetlała inny numer kolumny tabeli tbPracownicy. Ten odpowiedni numer, w zależności od wiersza, w którym jest formuła.

Przyporządkowanie danych

Przyporządkowanie danych

Czyli żeby wyświetlić imię matki będziemy chcieli pobrać dane z kolumny drugiej naszej tabeli z danymi, dla imienia ojca z trzecie, dla daty zatrudnienia z czwartej itd.

Żeby sobie ułatwić to zadanie, w arkuszu Formatka, w kolumnie np. H stworzę sobie kolumnę pomocniczą, którą potem ukryję przed użytkownikiem. W tej kolumnie po prostu wpiszę numerki kolumn, które będę chciała wyświetlać z tabeli z danymi. O tak:

Kolumna pomocnicza z numerami kolumn

Kolumna pomocnicza z numerami kolumn

Użyłam tutaj ręcznie wpisanych numerów kolumn, ponieważ nie planuję zmieniać kolejności w danych źródłowych, więc takie rozwiązanie w zupełności mi wystarczy. Oczywiście, można użyć tutaj funkcji PODAJ.POZYCJĘ, aby namierzyć, skąd WYSZUKAJ.PIONOWO miałaby pobierać dane, jednak trzeba wtedy zadbać o identyczne nagłówki w obu miejscach, a moje takie nie są.

Tę kolumnę pomocniczą wykorzystamy do następującej formuły we wszystkich komórkach z zakresu D3:D20, czyli naszych uzupełnianych informacjach:

=WYSZUKAJ.PIONOWO($D$3;tbPracownicy;H5;0)

Funkcja wyświetli nam dane po wyborze pracownika z listy rozwijanej. Jeśli pracownik nie będzie wybrany – wyświetli błąd #N/D!. Aby temu zapobiec, mozna zastosować lekką modyfikację tej formuły, np. taką:

=JEŻELI($D$3="";"";WYSZUKAJ.PIONOWO($D$3;tbPracownicy;H5;0))

I to tyle :). Cała magia :).

Efekt jest taki:

Tadam!

A oto plik z gotowcem do pobrania:

MalinowyExcel Uzupełnianie danych po wyborze z listy new dw.xlsx

 

I film na YB:

Powiązane produkty:

  • Webinar WYSZUKAJ.PIONOWO, podczas którego dokładnie omawiam zasadę działania funkcji, o której piszę w tym wpisie. Dodatkowo, oprócz zastosowania dokładnego, omawiam też zastosowanie przybliżone, które można świetnie wykorzystać np. do przyporządkowywania klas wynagrodzenia pracownikom. Tym samym funkcja ta świetnie nadaje się jako alternatywa dla wielokrotnie zagnieżdżonego JEŻELI.
  • Webinar Listy rozwijane, podczas którego pokazuję jak zrobić listę rozwijaną zarówno taką, jak we wpisie (czyli sprawdzanie poprawności), jak i formant formularza.
  • Webinar Walidacja danych – triki, pokazujący ciekawe zastosowania sprawdzania poprawności, którego lista rozwijana w komórce (użyta w tym wpisie) jest opcją. ALe narzędzie to potrafi dużo, duuuużo więcej!

 

 

 

Dane do wykresu wybierane z listy rozwijanej

$
0
0

Czyli dynamiczny wykres prostą metodą

Chcemy porównać ze sobą sprzedaż i plan z 2 lat. Przedstawienie tego na jednym wykresie będzie nieczytelne, a na 2 oddzielne wykresy nie mamy miejsca i ochoty. Chcemy więc stworzyć jeden wykres, ale taki, aby użytkownik mógł decydować, czy chce zobaczyć na nim porównanie sprzedaży czy planu. O tak:

Wygląda groźnie i skomplikowanie, ale zobaczysz, że do zrobienia tego zadania potrzebujemy sprytnego ułożenia danych i jednej funkcji… :). Let’s go!

1. Dane początkowe

Dane sprzedażowe za 2 lata mamy w następującym układzie: najpierw dane za 2018 rok, a potem za 2019. O tak:

Dane początkowe

Dane początkowe

Wykres potrzebuje jednak od nas tylko 2 informacji, z których powstaną 2 serie danych: jedna dotycząca roku 2018, a druga 2019. Czyli jeśli użytkownik zdecyduje, że chce oglądać plan – wykres powinien pokazać mu takie dane (C6:C17 i E6:E17):

Dane dla PLANU

Dane dla PLANU

A jeśli będzie chciał zobaczyć sprzedaż, to takie (D6:D17 i F6:F17):

Dane dla SPRZEDAŻY

Dane dla SPRZEDAŻY

Takie dane mogłyby nam wystarczyć, gdybyśmy zdecydowali się tworzyć wykres oparty na formule (nazwanej). Ja jednak tego rozwiązania nie lubię (choć jest widowiskowe). Ja lubię stworzyć oddzielną tabelę źródłową dla wykresu – w końcu potrzebuje on tylko 2 kolumn z seriami danych i opisy miesięcy (kategorie) – i tabelę tą zasilać danymi pobranymi przez odpowiednie formuły. Takie rozwiązanie jest dla mnie zdecydowanie bardziej czytelne i łatwiejsze do ewentualnych modyfikacji.

Stwórzmy zatem tabelę, bezpośrednio z której wykres będzie pobierał dane.

2. Dane źródłowe dla wykresu – formatka

Będzie to prosta tabelka gdzieś w innym miejscu arkusza. U mnie jest tak (H5:J17):

Tabela źródłowa dla wykresu - formatka

Tabela źródłowa dla wykresu – formatka

Uzupełnienie tej tabeli będzie dla nas największym wyzwaniem. Pomogą nam w tym odpowiednie formuły, ale to za chwilę. Pamiętajmy bowiem, że wykres ma być połączony z listą rozwijaną, dzięki której użytkownik będzie wybierał co chce zobaczyć na wykresie: plan czy sprzedaż.

Przejdźmy więc do tworzenia listy rozwijanej.

3. Lista rozwijana

Mamy tutaj 2 opcje: sprawdzanie poprawności albo formant formularza. Ja skorzystam z tej drugiej opcji. Wstawię do arkusza formant listy rozwijanej, czyli pole kombi. Zanim jednak to zrobię – przygotuję dane dla tego formantu.

Nasza lista rozwijana potrzebuje zakresu wejściowego, zawierającego wartości, które mają zostać wyświetlone na liście. Zakres ten musi być pionowy. Ponieważ nie mam takich danych (pionowych), stworzę osobne źródło do tej listy (wolę tak, niż zmieniać układ tabeli, który mi się podoba:)). Wpiszę wartości do komórek I1 i I2 (obrazek poniżej).

Dodatkowo potrzebuję też łącza komórki, czyli komórki, w której ma wylądować numer wiersza listy rozwijanej, który wybierze użytkownik. U mnie będzie to J1, którą dla ułatwienia jeszcze sobie nazwę jako Nr. Aby nazwać komórkę, zaznacz ją i w polu nazwy wprowadź nazwę, którą chcesz nadać, po czym zatwierdź Enterem (więcej o nazywaniu komórek możesz się dowiedzieć tutaj):

Zaplecze listy rozwijanej

Zaplecze listy rozwijanej

Jak już to mamy, można wstawiać listę rozwijaną: Deweloper/ Wstaw/ Pole kombi (wstawianie formantu opisywałam dokładnie tutaj). W ustawieniach formantu odwołujemy się do komórek, które przed chwilą wstawiliśmy:

Ustawienia formantu: lista rozwijana

Ustawienia formantu: lista rozwijana

Po naciśnięciu OK mamy ślicznie działającą listę rozwijaną. Wybór wpisu na niej umieszczany jest w formie liczbowej (numer wiersza) w komórce Nr. I ten właśnie wpis wykorzystają nasze formuły uzupełniające dane do wykresu.

4. Dane do wykresu – formuła

Dla tak ułożonych danych, jak w naszej formatce, napiszemy dwie formuły różniące się jedynie przeszukiwanym zakresem.

Pamiętajmy, że w danych do wykresu powinien pojawić się plan lub sprzedaż zawsze z 2018 i 2019 roku. Czyli rok mamy stały – kolumna I zawsze pokaże dane dla 2018, a kolumna J – dla 2019. Zmieniać się będzie tylko plan/sprzedaż.

Zajmijmy się najpierw rokiem 2018.

Do wybrania danych użyję funkcji INDEKS. Dla 2018 roku wybierać będę z zakresu C6:D17. Jeśli user wybierze z listy, że chce zobaczyć Plan – wyświetlę pierwszą kolumnę tego zakresu (zobacz, że na liście plan jest w pierwszym wierszu, czyli do komórki Nr trafi liczba 1 – idealnie), a raczej odpowiednią komórkę z tej kolumny, w zależności od miesiąca. Miesiąc mam napisany numerycznie, więc zadanie będzie proste.

Formuła w I6 wygląda następująco:

=INDEKS($C$6:$D$17;H6;Nr)

Z zakresu $C$6:$D$17 każemy funkcji INDEKS wybrać wartość z wiersza takiego jak miesiąc (jest numeryczny) i z kolumny o numerze wybranym z listy przez użytkownika. Dla planu: 1, dla sprzedaży: 2.

Analogicznie zrobimy dla 2019. Formuła będzie następująca:

=INDEKS($E$6:$F$17;H6;Nr)

Po skopiowaniu obu formuł w dół otrzymamy gotowe dane do wykresu:

Dane do wykresu

Dane do wykresu

Teraz już tylko stworzyć na nich wykres.

5. Wykres

Zaznaczmy więc dane, które mają być źródłem wykresu: I6:J17, kliknijmy menu Wstawianie/Wykres liniowy. Ponieważ zarówno miesiące jak i nazwy serii są liczbami – warto dokonać modyfikacji wykresu tak, aby uzyskać odpowiednie opisy serii na wykresie. Modyfikacji tych możesz dokonać klikając menu Narzędzia Wykresów Projektowanie/ Zaznacz dane i tam przycisk Edytuj dane (po wybraniu odpowiedniej serii), np.:

Edytowanie serii danych 2018

Edytowanie serii danych 2018

Tytułem wykresu może być lista rozwijana – ciekawie to będzie wyglądało i jednocześnie będzie użyteczne.

Jeśli jednak chcesz mieć tradycyjny tytuł wykresu w polu tekstowym – polecam, aby był on dynamiczny. W końcu prezentowane na wykresie dane zależą od wyboru użytkownika, więc tytuł wykresu też powinien się zmieniać. W tym celu zastosuję patent pokazany w tym wpisie.

W komórce I4 umieszczę następującą formułę (żeby się nie powtarzać – funkcja WYBIERZ ;)):

=WYBIERZ(Nr;I1;I2)

I to będzie moje źródło tytułu wykresu. Efekt tego będzie taki:

Na koniec można jeszcze popracować nad kosmetyką. Wykres z listą rozwijaną można przenieść do oddzielnego arkusza (uważaj wtedy na odwołania w formancie!), a arkusz ze wszystkimi roboczymi danymi ukryć. Będzie pięknie, a user nie będzie widział całej kuchni tematu, a jedynie to, co go interesuje.

PS. Można oczywiście porównywać lata między sobą – wystarczy odpowiednio ułożyć dane. To jednak łatwiej zrobić za pomocą wykresu przestawnego i fragmentatorów i to zdecydowanie mniejszym nakładem pracy :).

Plik z gotowym rozwiązaniem do pobrania:

MalinowyExcel Dane na wykresie wybierane z listy rozwijanej dw.xlsx

 

I instrukcja krok po kroku na wideo:

(pojawi się we wtorek, 11 czerwca 2019)

 

Powiązane produkty:

 

Treść nagłówka lub stopki na wydruku pobierana z komórki

$
0
0

Czyli dynamiczny nagłówek lub stopka

Dziś zadanie będzie proste – chcemy, aby tekst z komórki pojawił się w nagłówku lub w stopce na wydruku, np. niech to będzie nazwa klienta, dla którego drukujemy ofertę czy jakąś informację. Nie chce nam się zmieniać wartości bezpośrednio w nagłówku/stopce, tylko niech pobiera się ona z komórki (a ta przecież może być uzupełniana przez formułę, niekoniecznie przez nas). O tak:

Formatka

Użyjemy do tego zdarzenia skoroszytu, którego jeszcze na blogu nie pokazywałam…

Ponieważ Excel nie ma (niestety) takiej wbudowanej funkcjonalności, a chcemy, żeby cała podmianka treści działa się bez naszego udziału – użyjemy tutaj zdarzenia VBA. Konkretnie BeforePrintczyli przed wydrukowaniem. Jest to zdarzenie skoroszytu.

To makro możemy nawet nagrać, natomiast nagra się mnóstwo śmietnika (inne ustawienia strony), więc napiszę interesujący nas fragment.

A interesuje nas tylko wstawienie odpowiednich danych np. do lewego nagłówka. Czyli przed wydrukowaniem chcemy tak ustawić wartość lewej sekcji nagłówka, aby była ona równa wartości z żółtej komórki  (u mnie nazywa się ona Firma).

Tak wygląda formatka w arkuszu:

Formatka w arkuszu

Formatka w arkuszu

Na mojej formatce użytkownik wybiera firmę z listy rozwijanej w komórce D3 (nazwana jako Firma), na tej podstawie podmieniają się dane na formatce (sposób na to opisywałam w poprzednim wpisie). I to chcemy wydrukować tak, aby właśnie w lewym nagłówku pojawiła się nazwa firmy.

Kod jest bardzo prosty i należy umieścić go w module prywatnym skoroszytu (tutaj opisywałam dokładnie jak to zrobić).

Kod VBA

Całą pracę wykonuje ta linijka kodu:

   ActiveSheet.PageSetup.LeftHeader = Range("Firma").Value

Natomiast ja jeszcze bym chciała, aby takie działanie było tylko dla jednego wybranego arkusza o nazwie Dane. Dorzucę więc warunek, że jeśli aktywny arkusz to Dane – zmienię nagłówek na wartość z komórki Firma.

Wszystko do kupy wygląda tak (pamiętaj tylko, że nazwę zdarzenia Excel sam wpisuje po wybraniu tego zdarzenia z listy! Zobacz w tym wpisie):

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    If ActiveSheet.Name = "Dane" Then
        ActiveSheet.PageSetup.LeftHeader = Range("Firma").Value
    End If
End Sub

A jeśli chcesz wstawić tekst w inne miejsce, niekoniecznie do lewego nagłówka, to wpisz odpowiednie po PageSetup:

Nagłówek Lewy LeftHeader
Środkowy CenterHeader
Prawy RightHeader
Stopka Lewa LeftFooter
Środkowa CenterFooter
Prawa RightFooter

Hehe, i to wszystko :). Jeśli oczywiście robisz ze swoich arkuszy PDF-y (zobacz, jak zrobić to za pomocą makra podpiętego do przycisku) i nadal chcesz, aby podmianka w nagłówku/stopce działa się automatycznie – użyj zdarzenia BeforeSave i wstaw ten sam kod w środek. Kombinować można na różne sposoby, do czego Cię zachęcam!

A tutaj plik do pobrania:

MalinowyExcel Parametryzowanie nagłówków i stopek na wydruku VBA dw.zip

 

I wszystko krok po kroku w wersji wideo na YB:

(film pojawi się wkrótce)

 

 

 

Zaproszenie na WEBINAR: Nagrywanie makr – wstęp

$
0
0

Zapraszam Cię na bezpłatny webinar Nagrywanie makr – wstęp. Na webinarze wkroczymy w cudowny świat VBA: pierwszym przystankiem będzie nagrywanie makr. Pokażę Ci, że nagrywając makra można stworzyć rozwiązania dynamiczne, niezależne od rozmiaru zakresów danych. Wystarczy znać możliwości… Excela! Co się da nagrać, czego nie, jak sobie usprawnić żmudną pracę dzięki nagranym makrom – oto czym będziemy się zajmować.

Wpadaj koniecznie, tylko najpierw się zapisz TUTAJ, ponieważ tylko zapisane 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!

 


Nazwy arkuszy na liście rozwijanej, generowanej automatycznie

$
0
0

Czyli zdarzenie arkusza tworzące listę arkuszy

Zadanie na dziś to stworzenie listy rozwijanej, zawierającej nazwy arkuszy w pliku. Powiedzmy, że oddziały naszego sklepu są w różnych miastach, każde miasto ma swój arkusz. My chcemy do głównego arkusza pobrać sumę sprzedaży z wybranego miasta. Interesujące nas miasto (arkusz) chcemy wybrać z listy rozwijanej, i na podstawie naszego wyboru ma się obliczyć suma sprzedaży z tego miast. O tak:

Jak już będziemy mieli nazwę arkusza to dalej pikuś – kiedyś już to opisywałam. Natomiast samo uzupełnienie listy – tutaj bez VBA się nie obejdzie – będą pętle, liczniki i inne bajerki, więc do dzieła!

1. Logika zadania

Najpierw należy się zastanowić, kiedy nasza lista arkuszy ma się aktualizować? Tzn. tak po ludzku to wiemy: wtedy, kiedy zostanie dodany/usunięty arkusz (ewentualnie zmiana kolejności, nazwy itp.). Od strony użytkownika tak to właśnie wygląda. Natomiast od strony twórcy aplikacji – musimy wejść na wyższy poziom szczegółowości i zastanowić się, kiedy technicznie ma się dokonać zmiana.

Czy na zmianę wartości komórki, w której jest lista (na mojej formatce: D4)?

No nie. Zmiana wartości jest wtórna – najpierw na listę trzeba załadować dane, żeby user mógł je wybrać, czyli docelowo zmienić wartość komórki.

Tutaj proponowałabym ładować wartości na listę w momencie aktywowania arkusza. Zauważ, że to jest moment, kiedy wiemy, że na pewno mamy do czynienia z dobrymi arkuszami. Jeśli jakiemuś jakiś arkusz dodamy, usuniemy, zmienimy mu nazwę itp. – zawsze następuje zmiana aktywnego arkusza. Krótko mówiąc: aby coś zrobić z arkuszem – należy go aktywować. Jedyny minus – jeśli robimy coś z arkuszem, w którym jest lista (u mnie: Dane). Ale liczę, że z tym arkuszem akurat nie będziemy nic robić, a docelowo w moim kodzie będę chciała go w ogóle pomijać – zobaczysz dalej :).

Z całego mojego wywodu wynika więc, że zdarzeniem, które będzie aktualizowało wartości na liście, będzie zdarzenie Worksheet_Activate. Tak, zdarzeniem, ponieważ makro ma się uruchomić “samo”, czyli na jakąś czynność/zdarzenie.

Ok, jak już wiemy kiedy ma się to dziać, to teraz zastanówmy się co ma się dziać?

Ponieważ do stworzenia listy rozwijanej skorzystam ze sprawdzania poprawności – najlepiej, aby dostarczyć temu narzędziu gotową nazwaną listę. Jeśli bowiem tak zrobimy – nie będziemy musieli martwić się o aktualizowanie adresu w liście rozwijanej, a jedynie o aktualizowanie nazwy. A listę arkuszy – zwykły zakres komórek – umieścimy w oddzielnym arkuszu roboczym.

Po tych rozmyślaniach już wiemy, że chcemy,  aby Excel stworzył nam listę wszystkich arkuszy (w oddzielnym arkuszu), a potem załadował ją do nazwy (zaktualizował nazwę o adres tej listy), która jest źródłem listy rozwijanej w komórce G4 w arkuszu Dane.

I to byłoby z grubsza tyle. Jest jeszcze kilka technicznych szczegółów, natomiast omówię je na etapie pisania kodu. Najpierw przygotujmy formatkę (bardzo ważny element układanki!).

2. Przygotowanie formatki

Ponieważ chcemy, aby nasze makro było możliwie proste – pewne czynności wykonamy zanim napiszemy makro. Chodzi mi tutaj konkretnie o stworzenie listy rozwijanej – na razie pustej, i nazwanie jej zakresu źródłowego. Jedziemy.

  1. Arkusz roboczy i nazwanie zakresu. Potrzebujemy arkusz roboczy, w którym makro będzie wpisywało nazwy arkuszy. Ten arkusz możemy na koniec oczywiście ukryć. Dodaj więc arkusz, nazwij go Roboczy, a następnie nazwij komórkę A1 jako Lista_Arkusze (tutaj, w sekcji Nazywanie komórek, dowiesz się jak nazywać komórki i przy okazji jak stworzyć zdarzenie arkusza).
  2. Stworzenie listy rozwijanej. Teraz, w arkuszu głównym, Dane, w komórce G4 należy stworzyć listę rozwijaną (czynność tę opisywałam tutaj), a następnie nazwać komórkę G4 jako WybranyArkusz.

Czynności te są o tyle istotne, że makro korzysta zarówno ze stworzonego własnie arkusza jak i nazw. Jak to mamy – możemy zabierać się za kodowanie.

3. Kod VBA

Wszystko dzieje się w zdarzeniu Worksheet_Activate, zatem tutaj:

Private Sub Worksheet_Activate()
    
End Sub

Na pewno będziemy potrzebowali zmiennych roboczego arkusza (ArkRob), technicznego arkusza dla pętli (Ark), Zakresu i licznika. Deklarujemy więc i przypisujemy wartości, jeśli się da:

Private Sub Worksheet_Activate()
    Dim ArkRob As Worksheet, Ark As Worksheet
    Dim Zakres As Range, Licznik As Long

    Set ArkRob = ThisWorkbook.Sheets("Roboczy")
End Sub

Z punktu widzenia użytkownika jeszcze nic się nie dzieje. Techniczne sprawy. Teraz jednak, jak już określiliśmy arkusz roboczy (ArkRob, czyli nasz arkusz o nazwie Roboczy), trzeba go wyczyścić – zakładamy bowiem, że będą w nim jakieś dane – te, z poprzedniej listy arkuszy. Nie wiemy, czy użytkownik nam jakichś arkuszy nie skasował, nie zmienił ich nazwy, więc listę arkuszy musimy stworzyć od początku, na “czystym tle”:

      ArkRob.Cells.Clear

Ok, zaraz pętla, która zczytuje nazwy arkuszy, ale przed nią – ustawimy sobie licznik, który będzie określał wiersz w arkuszu roboczym, do którego należy wstawić pobraną nazwę arkusza. Chcemy zacząć wstawiać od pierwszego wiersza, więc licznik ustawiamy na 1, a potem zaczynamy pętlę. Pętla ta przejedzie się po wszystkich arkuszach, odczyta ich nazwy i wstawi do odpowiedniego wiersza roboczego arkusza:

    Licznik = 1
    For Each Ark In Worksheets
            ArkRob.Cells(Licznik, 1).Value = Ark.Name
            Licznik = Licznik + 1
    Next

Powyższy kod działa na wszystkie arkusze, łącznie z arkuszem głównym (Dane) i arkuszem roboczym (Roboczy). Natomiast warto się zastanowić, czy na pewno tak chcemy? Ja wolę, żeby na liście wylądowały tylko arkuszy z nawami miast, a u mnie w pliku zaczynają się one od czwartego arkusza. Wyświetlę więc na liście rozwijanej tylko arkusze, które są w kolejności od czwartego w  górę. Do określenia tego potrzebuję więc lekko zmodyfikować powyższy kod, wstawiając tam if-a:

    For Each Ark In Worksheets
        If Ark.Index >= 4 Then
            ArkRob.Cells(Licznik, 1).Value = Ark.Name
            Licznik = Licznik + 1
        End If
    Next

Oczywiście założenie jest taki, że wszystkie te arkusze są arkuszami miast. To już jednak Twoja użytkowniku broszka ;).

OK. Dalej trzeba już tylko określić zakres komórek, które będą źródłem do listy rozwijanej (nasze nazwy arkuszy z miastami):

    Set Zakres = ArkRob.Range("A1").CurrentRegion

A teraz podmienić adres tego zakresu w nazwie:

    ThisWorkbook.Names("Lista_Arkusze").RefersTo = "=" & ArkRob.Name & "!" & Zakres.Address

I voila! Pięknie będzie działać kod. W całości wygląda tak:

Private Sub Worksheet_Activate()
    Dim ArkRob As Worksheet, Ark As Worksheet
    Dim Zakres As Range, Licznik As Long

    Set ArkRob = ThisWorkbook.Sheets("Roboczy")
        ArkRob.Cells.Clear
    
    Licznik = 1
    For Each Ark In Worksheets
        If Ark.Index >= 4 Then
            ArkRob.Cells(Licznik, 1).Value = Ark.Name
            Licznik = Licznik + 1
        End If
    Next

    Set Zakres = ArkRob.Range("A1").CurrentRegion
    
    ThisWorkbook.Names("Lista_Arkusze").RefersTo = "=" & ArkRob.Name & "!" & Zakres.Address
End Sub

Zauważ, że ja dałam warunek, że dla wszystkich arkuszy, których numer jest większy lub równy 4. Możesz natomiast dawać inne warunki, np. że tylko dla widocznych arkuszy (ale pamiętaj, że arkusz główny też jest widoczny!):

    If Ark.Visible = xlSheetVisible Then

albo dla wszystkich oprócz taki, które się nazywają np. “Roboczy”:

    If Ark.name <> "Roboczy" Then

Po prostu podmień odpowiednią linijkę w kodzie. Plik oczywiście zapisz z obsługą makr, czyli *.xlsm lub *.xlsb.

4. Pobieranie sumy sprzedaży

To już będzie prościutkie – w komórce D7 wpisz taką formułę:

=ADR.POŚR(WybranyArkusz&"!G2")

Oczywiście założenie jest takie, że w komórkach G2 arkuszy z miastami są już odpowiednie wartości do wyświetlenia.

 

Na koniec warto też zaznaczyć, że ponieważ makro wykonuje pewne czynności zaraz po aktywowaniu arkusza, może się okazać, że przestaną nam działać pewne funkcjonalności, jak choćby przeklejanie danych między arkuszami!

 

 Plik możesz pobrać tutaj:

MalinowyExcel Nazwy arkuszy na liście rozwijanej automatycznie dw.zip

 

A tutaj możesz obejrzeć tworzenie tego rozwiązania krok po kroku (YB):

(pojawi się wkrótce)

 

Powiązane produkty:

 

 

Jak wyświetlić cudzysłów w wyniku formuły?

$
0
0

Czyli sposób na oszukanie Excela

Niby taka prosta sprawa: w tytule wykresu chcemy wyświetlić nazwę produktu, którego sprzedaż prezentujemy. Tytuł opiera się na wartości komórki, w której jest formuła, uzależniona od wyboru produktu przez użytkownika. Wszystko byłoby proste, gdybyśmy chcieli wyświetlić TYLKO nazwę produktu, ale my chcemy tak: Sprzedaż dla “Batonik”. Szef się uparł… i ma być tak:

Cały problem z cudzysłowem polega na tym, że umieszczamy w nim tekst w formułach. Jeśli więc go użyjemy – Excel pomyśli, że chcemy wyświetlić w formule tekst. A my chcemy wyświetlić ten znak (“). Jak więc “oszukać” Excela?

Jest na to wieeeele sposobów: można wstawić znak cudzysłowu do oddzielnej komórki, a następnie odwołać się w do niej w formule; można dokleić cudzysłów bezpośrednio do tekstu w komórce. Jeśli jednak nie chcemy odwoływać się do zewnętrznej komórki ani ingerować w wartości – warto sięgnąć po inne metody. Opiszę dalej dwie. Jedna mi się bardziej podoba, druga – trochę mniej. Zobaczymy jak Tobie 🙂

Formatka

Formatka składa się z zakresu, będącego źródłem wykresu (B3:C15) i z dany surowych, z których ten wykres czerpie (B19:D105). Wygląda ona następująco:

Formatka

Formatka

W miejscu, gdzie utworzymy wykres (może być to ten sam arkusz) będzie jeszcze komórka z listą rozwijaną (u mnie H8), z której użytkownik będzie wybierał produkty. Gdzieś obok, w komórce roboczej (u mnie G4) będzie nasza formuła, czyli źródło dla tytułu wykresu. Tam właśnie będziemy wstawiali znak ” tak, aby został wyświetlony przez formułę.

Sposób 1: Funkcja ZNAK

To ten sposób, który bardziej mi się podoba, ponieważ dzięki niemu formuła jest czytelniejsza. Chodzi o użycie funkcji ZNAK. Jest to prościutka funkcja, która wyświetla znak, o numerze podanym jej w argumencie. Numer ten to liczba strony kodowej używanej na danym komputerze. Dal nas najważniejsze jest to, że cudzysłów ma numer 34. Jeśli więc zapiszemy taką funkcję:

=ZNAK(34)

w wyniku otrzymamy: .

Trzeba to teraz podpiąć do naszej formuły (G4):

=”Sprzedaż dla “&ZNAK(34)&H8&ZNAK(34)

Po podpięciu tej formuły do tytułu wykresu (sposób na to opisywałam tutaj), efekt jest taki:

Wynik

Wynik

Sposób 2: Dwa cudzysłowy

Alternatywnym sposobem jest specjalny zapis cudzysłowu w formułach: zamiast jednego znaku “, należy wstawić “”. To będzie dla Excela oznaczało, że ma wyświetlić ten znak. Czyli w naszym wypadku, w komórce z tytułem wykresu powinna znaleźć się następująca formuła:

="Sprzedaż dla "&""""&H8&""""

ewentualnie tak:

="Sprzedaż dla """&H8&""""

Trochę słabo to wygląda, ale zadziała :). Gdyby nazwa produktu nie pochodziła z komórki (czyli prostsza sytuacja), formuła byłaby następująca:

=”Sprzedaż dla “”Snickers”””

Czyli za każdym razem, gdy chcesz wyświetlić znak ” w wyniku formuły – wpisz 2 takie znaki: “”.

Efekt jest identyczny, co użycie funkcji ZNAK:

Wynik

Wynik

I to wszystko. Jestem ciekawa, która metoda Ci się bardziej podoba?

 Tutaj plik z gotowcem do pobrania:

MalinowyExcel Jak wyświetlić cudzysłów używając formuły dw.xlsx

 

A tutaj wersja wideo na YB:

(pojawi się wkrótce)

 

Powiązane produkty:

  • WEBINAR: Listy rozwijane. Tutaj zobaczysz jeszcze inne opcje wykorzystania list rozwijanych na potrzeby wykresów i nie tylko.

 

Graficzne przyciski uruchamiające makra

$
0
0

Czyli prosty sposób na skuteczną komunikację z użytkownikiem

Makra możemy wywoływać na wiele sposobów. Z części z tych sposobów korzystamy na etapie tworzenia kodu, niektóre dzieją się same (zdarzenia), a inne – mają być wygodne dla użytkownika. Do tych z pewnością należą skróty klawiszowe i… przyciski. Zazwyczaj korzystamy z formantów formularza (pisałam o tym tutaj). Metody super, bo działają.

Jeśli jednak chcesz pójść o krok dalej (a zakładam, że skoro czytasz ten artykuł, to chcesz ;)), warto zamiast zwykłego przycisku z napisem (np.: Drukuj), użyć przycisku graficznego. Jest to o tyle fajna metoda, że użytkownik nie musi się wczytywać w tekst na przycisku (a takie wczytywanie jest to szczególnie uciążliwe, gdzie przycisków jest kilka!), tylko rzuca okiem na grafikę i od razu wie co robi dany przycisk.

Przykład:

 

Najlepsze jest to, że takie graficzny przycisk zrobimy od początku do końca sami, bez jakichś specjalnych umiejętności – cały czas będziemy korzystać z wbudowanych możliwości Excela. Nie musimy angażować grafika komputerowego :).

Jest kilka etapów zrobienia graficznego przycisku:

  1. Wybór grafiki
  2. Tworzenie obrazu
  3. Formatowanie obrazu

1. Wybór grafiki – ikony

Najciekawsza część :). Co ma znajdować się na przycisku? Na pewno coś związanego z funkcją tego przycisku, z makrem, które ma odpalać. Dla drukowania będzie to drukarka, dla odświeżenia – pewnie jakieś półokrągłe strzałki, a do wysłania maila – koperta. Niech to będzie symbol. Im prostszy rysunek, tym lepiej. Doskonale nadają się do tego ikony – graficzne symbole ukryte pod obrazkiem kaczki w menu Wstawianie:

Kaczka :)

Kaczka 🙂

Ta opcja jest jednak dostępna w Office’ie 365 (z podłączonym Internetem!). Jeśli masz starszą wersję Excela – polecam Ci pobrać grafiki z Internetu (uważaj tylko na ich prawa autorskie).

Załóżmy, że będziemy tworzyć przycisk drukowania. Poszukam więc w Kaczce ikonki z drukarką – znajduje się ona w kategorii Technologia i elektronika:

Wybór ikony

Wybór ikony

Można wybrać kilka ikon jednocześnie i wstawić je hurtowo do arkusza przyciskiem Wstaw. Ja wybrałam tylko jedną drukarkę (tę pierwszą) – wstawiła mi się czarna:

Ikona drukarki

Ikona drukarki

Teraz kwestia zmiany koloru na taki, jak i Ci się podoba – ja wybiorę granatowy (Narzędzia grafiki/Formatowanie/ Wypełnienie grafiki).

Jednak to jeszcze nie koniec. Te excelowe ikony nie mają tła. Przycisk ma mieć. Wstawimy więc teraz zwykły kwadrat (lub prostokąt – zależy jaki kształt przycisku chcesz mieć), czyli  menu Wstawianie/Kształty i odpowiednio go formatujemy (ja nadam kolor szary wypełnienia i bez obramowania).

Teraz chcemy drukarkę nałożyć na kwadrat, czyli ustalić wygląd przycisku. Problem jest jednak taki, że drukarkę wstawiliśmy najpierw, czyli jest ona na spodniej warstwie, a chcielibyśmy, aby była na wierzchu. Zaznaczmy więc drukarkę i wybierzmy: Narzędzia grafiki/Formatowanie/Przesuń do przodu. Taka jest różnica:

Zmiana kolejności warstw

Zmiana kolejności warstw

Warstwy są już w dobrej kolejności, więc teraz kwestia rozmiaru. To kwestia gustu, natomiast ja polecam, aby ikona była znacznie mniejsza niż kwadrat. Lepiej to będzie wyglądało na docelowym przycisku.

Ok, teraz wyśrodkowanie. Zaznaczmy więc zarówno drukarkę i kwadrat (z klawiszem Shift), i wybieramy z menu Narzędzia grafiki/Formatowanie/Wyrównaj/ Wyrównaj do środka w pionie, i za chwilę to samo, tylko z opcją Wyrównaj do środka w poziomie:

Wyśrodkowanie

Wyśrodkowanie

Dalej to już kwestia gustu – ja polecam jednak, aby ikona była znacznie mniejsza niż kwadrat. Lepiej to będzie wyglądało na docelowym przycisku:

Rozmiar drukarki vs kwadrat

Rozmiar drukarki vs kwadrat

Na koniec można, ale nie trzeba, te kształty ze sobą zgrupować. Nie trzeba, ponieważ i tak są nam potrzebne tylko na chwilę, ponieważ zaraz zrobimy z nich obraz…

2. Tworzenie obrazu

… czyli zaznaczamy oba kształty, kopiujemy je (Ctrl + V) i wklejamy jako obraz z menu kontekstowego (prawy przycisk myszy):

Tworzenie obrazu

Tworzenie obrazu

A obraz jest o tyle fajny, że mamy mnóstwo predefiniowanych opcji jego formatowania. I z nich właśnie będziemy teraz korzystać.

3. Formatowanie obrazu

Najpierw wybierzemy styl obrazu. Mam na myśli jeden z wbudowanych w Excela:

Wybór stylu

Wybór stylu

Wyboru stylu zaznaczonego myszką obrazu dokonujemy klikając strzałeczkę w dół obok wizualizacji stylów (zaznaczona na żółto na obrazku powyżej). Ja najbardziej lubię style:

  • ścięta z perspektywą i
  • z odbiciem i perspektywą w prawo.

Same w sobie te style głowy nie urywają, ale po lekkich modyfikacjach efekt jest OK. Oto porównanie obu przed modyfikacjami:

Porównanie stylów

Porównanie stylów

Żeby te obrazki wyglądały jak przyciski dokonamy pewnych zmian w efektach obrazu. Po pierwsze usuniemy obrót, czyli Narzędzia obrazów/ Formatowanie/ Efekty obrazów/ Obrót 3-W/ Brak obrotu. Już samo w sobie wygląda nieźle, choć dla mnie trochę “za bardzo”:

Brak obrotu

Brak obrotu i wynik końcowy

Ja bym je jeszcze trochę wypłaszczyła, czyli zmniejszyła skos na np. 4 pkt (Narzędzia obrazów/ Formatowanie/ Efekty obrazów/ Skos/ Opcje 3-W / Górny skos/ Wysokość i Szerokość):

Ustawienia skosu

Ustawienia skosu

Można usunąć jeszcze cień (Narzędzia obrazów/ Formatowanie/ Efekty obrazów/ Cień/ Brak) i wyjdzie coś takiego:

Wynikowe przyciski

Wynikowe przyciski

Wyglądają jak przyciski i są subtelne. Oczywiście można jeszcze tak się pobawić i osiągnąć jeszcze lepsze efekty. Ja na tym etapie uważam, że są wystarczająco dobre. Do przycisku (tak na prawdę jest to obrazek) możemy podpiąć teraz dowolne makro i będzie śmigać.

Ja mam porobiony cały zestaw takich przycisków w jednym pliku i – jak potrzebuję- po prostu wybrane przyciski stamtąd kopiuje i wklejam gdzie trzeba. Polecam zrobić tak samo!

 

Pliku nie załączam, bo nie ma czego :).

Ale film na  YB oczywiście jest:

(pojawi się wkrótce)

 

Powiązane produkty:

  • WEBINAR: Nagrywanie makr – podczas którego dowiesz się jak w sprytny sposób nagrywać całkiem inteligentne makra

 

 

Jak zaokrąglić liczbę w górę do wielokrotności liczby 3?

$
0
0

Czyli 1, 2, 3 → 3,    a   4, 5, 6 → 6 …

Zadanie jest proste: chcemy zawsze zaokrąglać liczbę naturalną do wielokrotności liczby 3. Pierwsze co mi przyszło do głowy to funkcja ZAOKR.DO.WIELOKR, ale ona tutaj nie zadziała, ponieważ zaokrągla dopiero, gdy wynik dzielenia liczby przez wielokrotność (u nas: 3) będzie większy lub równy połowie tej wielokrotności! Dla liczby 1 więc otrzymamy zero (0), a chcemy trzy (3).

Zastosujemy więc inną funkcję zaokrąglającą, a nawet i dwie.

Tylko najpierw jeszcze formatka:

Formatka

Formatka

Do dzieła!

Sposób 1 – ZAOKR.W.GÓRĘ

Ten sposób zadziała w każdej wersji Excela. Funkcja ZAOKR.W.GÓRĘ zaokrągla liczbę w górę (dalej od zera) do podanej istotności. U nas istotnością jest liczba 3 (w komórce D3). Liczbą do zaokrąglenia jest C7 i inne w kolumnie C. Wystarczy więc podstawić te komórki do funkcji i dalej nie ma co robić :). Funkcja jest taka (D7):

=ZAOKR.W.GÓRĘ(C7;$D$3)

Zobaczcie, że dla jedynki też zadziała:

Wynik, sposób 1

Wynik, sposób 1

Sposób 2 – ZAOKR.W.GÓRĘ.MATEMATYCZNE

Nowsza funkcja (od 2013 w górę), ZAOKR.W.GÓRĘ.MATEMATYCZNE trochę więcej potrafi. Umie zaokrąglić do najbliższej liczby całkowitej, ale też – co dla nas najistotniejsze – umie zaokrąglić liczbę do podanej wielokrotności (tak tutaj nazwali ten argument – w poprzedniej funkcji była to istotność). W naszym przypadku obie funkcje zadziałają.

Oto formułą w E7:

=ZAOKR.W.GÓRĘ.MATEMATYCZNE(C7;$D$3)

I wyniki dla naszych danych:

Wynik, sposób 2

Wynik, sposób 2

I to tyle. Dwie proste funkcje, w tym jedna z hardkorową nazwą :).

 Plik do pobrania jest tutaj:

MalinowyExcel Zaokrąglenie w górę do liczby dw.xlsx

 

A tutaj wersja wideo na YB:

(pojawi się wkrótce)

 

 

 

 

Pobierz wagę produktu z jego nazwy

$
0
0

Czyli wyodrębnianie liczby w nawiasie

Naszym zadaniem będzie wyodrębnienie liczby, będącej wagą produktów, z tekstu – czyli z nazwy produktu. O tak:

Wynik

Wynik

Problem polega na tym, że owe wagi są w różnych miejscach: czasem na końcu, czasem w środku nazwy. No i dodatkowo same liczby są różnej długości: raz mają 2 znaki, innym 3 lub 4!

Na szczęście liczba do wyodrębnienia (waga) zawsze jest ujęta w nawias. Dzięki temu łatwo znaleźć regułę, dzięki której namierzymy miejsce występowania liczby w tekście.

Nie możemy tutaj zastosować funkcji FRAGMENT.TEKSTU w najprostszym wydaniu (czyli wpisać argumentów z palca). Trzeba ją trochę ztiuningować…

Szukamy reguły

Zauważmy, że liczba do wyciągnięcia zawsze jest ujęta w nawias. Nasza waga zaczyna się więc na pozycji kolejnej niż nawias otwierający “(“, a kończy się pozycję wcześniej niż nawias zamykający “)”. Jeśli więc poznamy pozycje obu tych nawiasów – jesteśmy w stanie namierzyć naszą wagę. I tak, liczba oznaczająca wagę:

  • zaczyna się na pozycji kolejnej niż “(“
  • ma tyle znaków, co różnica między pozycją “)” a pozycją “(“, pomniejszoną o 1.

Na szczęście te nawiasy są jedynymi w nazwie produktu i liczba zawsze się w nich znajduje. To czyni cały problem bardzo prostym. Do wyodrębnienia znaków użyjemy więc funkcji FRAGMENT.TEKSTU, a do namierzenia pozycji nawiasów – SZUKAJ.TEKST (można też ZNAJDŹ – tutaj to obojętne).

Namierzanie pozycji nawiasów

Ogólnie stworzę jedną formułę wyodrębniającą wagę produktów, natomiast będzie ona składała się z zagnieżdżonych funkcji. Aby ułatwić sobie zadanie, najpierw poznam pozycję nawiasów, a potem zagnieżdżę wszystko w sobie. Dla ułatwienia kolejne etapy zrobię w kolumnach pośredniczących, a potem skleję w jedno.

Namierzanie pozycji pierwszego nawiasu zrobię funkcją SZUKAJ.TEKST, w komórce D4:

=SZUKAJ.TEKST("(";B4)

A w E4 pozycję drugiego nawiasu:

=SZUKAJ.TEKST(")";B4)

Po wstawieniu tych roboczych formuł nasza formatka wygląda tak:

Kolumny robocze

Kolumny robocze

Wyodrębnianie liczby

Teraz pozostaje już tylko wyciągnąć liczbę, czyli wagę produktu. Zrobi to funkcja FRAGMENT.TEKSTU w F4:

=FRAGMENT.TEKSTU(B4;D4+1;E4-D4-1)

Czemu odejmujemy 1? Najlepiej widać to w kreatorze funkcji, jak nie odejmiemy:

Gdy nie odejmiemy 1...

Gdy nie odejmiemy 1…

Wszystko fajnie, tylko funkcja ta w wyniku daje tekst (jak każda tekstowa!), co może utrudnić nam późniejszą pracę na tych danych. Warto więc od razu przekonwertować tę tekstową wagę na liczbę. Możemy to zrobić za pomocą dwóch minusów przed funkcją (pisałam o tym tutaj):

=--FRAGMENT.TEKSTU(B4;D4+1;E4-D4-1)

Teraz już wszystko ładnie wygląda i jest użyteczne…

Jedna formuła

…no prawie użyteczne. Bo nadal mamy 3 osobne formuły, które nic nie wnoszą użytkownikowi. W sumie to go nie interesuje pozycja nawiasów, a ją widzi. W tym wypadku warto byłoby więc wyodrębnić wagę produktów jedną formułą. W żółtych polach, czyli w komórce C4. Połączymy więc poprzednie formuły ze sobą. Najprościej to zrobić podstawiając funkcje, znajdujące się w poszczególnych komórkach roboczych (D4 i E4) do ich odwołań w funkcji łączącej wszystko (F4). Jak to robię – możesz zobaczyć na filmie poniżej, albo na webinarze o zagnieżdżaniu funkcji, który prowadziłam dokładnie na ten temat.

Otrzymamy następujący wynik:

=--FRAGMENT.TEKSTU(B4;SZUKAJ.TEKST("(";B4)+1;SZUKAJ.TEKST(")";B4)-SZUKAJ.TEKST("(";B4)-1)

Teraz śmiało możemy kasować wszystkie pomocnicze dane w kolumnach od D do F.  A wynik jest taki sam:

Wynik

Wynik

I to cała praca.

 Tutaj jest plik z rozwiązaniem do pobrania :

MalinowyExcel Wyodrębnianie liczby w nawiasie dw.xlsx

 

A tutaj wersja wideo, na której fajnie widać zagnieżdżanie funkcji:

(pojawi się wkrótce)

Powiązane produkty:

  • Webinar: Zagnieżdżanie funkcji, podczas którego dowiesz się jak sprawnie zagnieżdżać funkcje jedna w drugiej (i trzeciej :)), oraz poznasz kilka ciekawych tików ułatwiających pracę z zagnieżdżonymi formułami, jak choćby praca z kreatorem funkcji czy genialna opcja “Edytuj bezpośrednio w komórce”.

 

 

 

 

Wykres rozpiętości wynagrodzeń

$
0
0

Czyli uproszczony wykres pudełkowy w Excelu

Ostatnio prowadziłam szkolenie Wizualizacja danych HR w MS Excel. W sumie jedno z pierwszych pytań, które padło brzmiało: “a będziemy robić wykres rozpiętości wynagrodzeń?”. Pomyślałam: No nie, ze wszystkich wykresów, które zaplanowałam, tego jednego nie mam. I akurat o to jest pytanie :). W tym wpisie nadrobię to i pokażę jak zrobić właśnie taki wykres – będzie na nim widoczna rozpiętość wynagrodzeń w działach naszej firmy. Dorzucimy do tego jeszcze medianę, czyli środkowe wynagrodzenie w danym dziale. Wszystko wygląda tak:

WYNIK

I wbrew pozorom w kilku prostych krokach można takie cudo zrobić. Tym się teraz zajmiemy.

Logika wykresu

Wykres jest kombinacją 2 typów wykresów:

  1. kolumnowego skumulowanego,
  2. liniowego ze znacznikami.

Wykres kolumnowy skumulowany to nasza rozpiętość (różowe kolumny), a liniowy to mediana.

Aby umiejscowić rozpiętość w odpowiednim miejscu, aby wydawała się “pływająca”, trochę oszukamy Excela i ustawimy kolor serii wynagrodzeń minimalnych na przeźroczysty. Kolumna pokazująca rozpiętość będzie to techniczna seria danych, której wartość/wysokość będzie wyliczana na podstawie minimalnego i maksymalnego wynagrodzenia. Obie te kolumny są po prostu ustawione na sobie, stąd potrzebny jest wykres skumulowany.

Mediana to wykres liniowy ze znacznikami, tylko bez widocznej linii.

Całą kuchnię rozwiązania przedstawiam na poniższym rysunku:

Wykres od kuchni

Wykres od kuchni

Ok – wprowadźmy to teraz w życie.

Dane do wykresu (formatka)

Aby przedstawić rozpiętość wynagrodzeń w działach (i medianę) – potrzebujemy takich danych:

  • minimalne wynagrodzenie
  • maksymalne wynagrodzenie
  • środkowe wynagrodzenie (medianę)

Zakładam, że mamy takie dane (ich zdobycie to temat na oddzielny artykuł).

Natomiast powyższych danych nie możemy tak po prostu przedstawić na wykresie skumulowanym, ponieważ Excel stworzy kolumnę dla minimalnego wynagrodzenia; później na niej ustawi maksymalne wynagrodzenie. My tak nie chcemy, ponieważ wyszłyby nam zbyt wysokie słupki i do tego źle umiejscowione. Dlatego potrzebujemy technicznej serii danych, która będzie stała na kolumnie minimalnych wynagrodzeń, na której ustawimy kolumnę rozpiętości. Ta druga seria będzie kolumną techniczną, wyliczaną na podstawie wynagrodzeń. Będzie ona po prostu różnicą między wynagrodzeniem maksymalnym i minimalnym.

Nasza formatka będzie więc wyglądała tak:

Formatka

Formatka

Widać na niej od razu formułę, którą należy wpisać do roboczej kolumny (komórka F6):

=D6-C6

Tworzenie wykresu

Teraz już ta łatwiejsza część – zrobienie wykresu z danych.

  1. Zaznaczmy dane, które mają być widoczne na wykresie, czyli kolumny Dział, MIN, Mediana i MAX (robocza). Do zaznaczenia użyj klawisza Ctrl.
  2. Menu Wstawianie/Wykres kolumnowy skumulowany.
  3. Pojawi się taki wykres, który oczywiście jest tylko pewnym etapem w tworzeniu docelowego wykresu:

    Tworzenie wykresu - kolumnowy skumulowany

    Tworzenie wykresu – kolumnowy skumulowany

  4. Ustaw wypełnienie serii danych MIN (ciemny różowy) na Brak wypełnienia (Narzędzia wykresów/ Formatowanie/ Style kształtów/ Wypełnienie kształtu/ Brak wypełnienia). Efekt tego wygląda tak:

    Brak wypełnienia serii MIN

    Brak wypełnienia serii MIN

  5. Zmień typ wykresu dla serii danych Mediana na liniowy ze znacznikami (zaznacz na wykresie serię Mediana/ Narzędzia wykresów/ Projektowanie/ Zmień typ wykresu). Efekt widać od razu na podglądzie (w wersjach Excela >= 2013):

    Wykres liniowy ze znacznikami

    Wykres liniowy ze znacznikami

  6. Ustaw brak linii dla wykresu liniowego, dzięki czemu będą widoczne same znaczniki (zaznacz wykres liniowy i Ctrl + 1):

    Likwidowanie linii z wykresu liniowego

    Likwidowanie linii z wykresu liniowego

  7. W tym samym okienku, zmień znacznik na długą poziomą kreskę, rozmiar np. 10:

    Ustawienie znacznika

    Ustawienie znacznika

  8. Ustaw tytuł wykresu i legendę według uznania. Jeśli chcesz uzyskać dynamiczny tytuł wykresu, czyli oparty na wybranej komórce – tutaj przeczytasz jak to zrobić.

Wykres na koniec wygląda tak (nie zmieniałam domyślnego koloru):

Wynik

Wynik

Moim zdaniem cacuszko. Można te dane przedstawić też w poziomie, czyli na wykresie słupkowym, i wyglądałoby to następująco:

Poziomo - wykres słupkowy

Poziomo – wykres słupkowy

Też fajnie. Nawet nie wiem, który mi się bardziej podoba. Oba są czytelne. Można byłoby pomyśleć nad posortowaniem danych? Zależy już, od osoby analizującej :).

 A tutaj plik z rozwiązaniem do pobrania:

MalinowyExcel Wykres rozpiętości wynagrodzeń dw.xlsx

 

I film na YouToube’ie:

 

 

 

Proste łączenie danych z kilku plików w jeden plik

$
0
0

Czyli najprostszy z możliwych sposobów na łączenie danych z plików

Jeśli masz w jednym folderze wiele plików o tej samej strukturze – możesz szybko połączyć dane z tych plików w jeden zbiorczy plik. Potrzebujesz tylko Power Query i dosłownie kilka kliknięć myszką.

W moim przykładzie są dane sprzedażowe poszczególnych przedstawicieli handlowych – każdy ma swój plik nazwany jego imieniem. W każdym z tych plików znajduje się jeden arkusz, nazwany Sales, gdzie jest zakres z danymi do scalenia.

Zobacz dalej, jakie to proste…

Założenia

Zanim pokażę Ci tę prościutką i przyjemną metodę łączenia danych z plików – sprecyzuję w jakich okolicznościach można w ogóle tej metody użyć. Od razu mówię: w najprostszych z możliwych :).

  • pliki znajdują się w jednym folderze,
  • jeden arkusz z danymi do scalenia w plikach źródłowych,
  • jednakowa liczba kolumn w scalanych zakresach,
  • jednakowe nazwy kolumn w scalanych zakresach.

Założenia te obrazuje poniższy obrazek:

Założenia

Założenia łączenia plików

Jak widać – najprostsza sytuacja z możliwych: pliki w jednym miejscu, o identycznej strukturze. Ale często taką własnie sytuację mamy :).

Pamiętaj tylko, że do wykonania tego zadania potrzebne jest Power Query: od wersji 2016 w górę jest to wbudowana funkcjonalność; w 2010 i 2013 – należy doinstalować dodatek.

Kolejne czynności

  1. Najpierw mówimy Power Query skąd chcemy zaimportować dane, a jest to folder z naszymi plikami źródłowymi, czyli (nawigacja Excela 2016 i wyższych): Dane/ Pobierz dane/ Z pliku/ Z folderu:
Nawigacja

Nawigacja

2. Następnie, w okienku z obrazka poniżej wskazujemy folder, w którym znajdują się nasze pliki źródłowe (ze sprzedażą handlowców). Po wybraniu folderu – klikamy OK:

Okienko Wskaż folder

Okienko Wskaż folder

3. Pojawi się podgląd plików z wybranego folderu. Klikamy dalej Połącz/ Połącz i edytuj:

Łączenie

Łączenie

4. Kolejny krok to wybór szablonowego arkusza. Na jego podstawie Power Query stwierdzi z jakimi plikami ma do czynienia – klikamy w nazwę arkusza, u mnie to Sales. Krok ten zatwierdzamy OK:

Wybór arkusza szablonowego

Wybór arkusza szablonowego

5. Ostatni krok to już tylko załadowanie danych do Excela, czyli Plik/ Zamknij i załaduj. Przy tej instrukcji dane zostaną załadowane do nowego arkusza. Jeśli zaś chcesz, aby zostały załadowane do już istniejącego arkusza, polecam Ci opcję: Plik/ Zamknij i załaduj ▼ /Zamknij i załaduj do… i tam możesz wybrać gdzie dokładnie chcesz umieścić wynikowe dane:

Wybór miejsca umieszczenia danych

Wybór miejsca umieszczenia danych

Gotowe, połączone dane wyglądają tak:

Wynik

Wynik

Jak widać dostaliśmy bardzo ładną informację o nazwach plików źródłowych, z których pochodzą dane. W naszym przypadku akurat informacja ta nie jest potrzebna, ponieważ mamy już kolumnę z przedstawicielami handlowymi, natomiast nie zawsze tak musi być. Jeśli chcielibyśmy jedną z tych kolumn usunąć – trzeba byłoby to zrobić w edytorze Power Query, którego celowo w tym wpisie nie dotykam bardziej.

Rozwiązanie to jest mega proste, co czyni je cudownym! Każdy może je wykonać. Jest niestety mało eleganckie, ponieważ tworzy “śmietnik” w zapytaniach. Zobacz, ile ich zostało wygenerowanych (Dane/ Zapytania i połączenia):

Bardzo dużo zapytań

Bardzo dużo zapytań…

Ale coś za coś… Sami oceńcie na ile to rozwiązanie się Wam przyda i na ile jesteście w stanie zaakceptować to “niedociągnięcie” ;).

 

A na koniec wersja wideo tego rozwiązania:

(pojawi się wkrótce)

 

 

 


Wyróżnianie najmniejszej niezerowej wartości

$
0
0

Czyli formuła w formatowaniu warunkowym

Jakiś czas temu opisywałam jak wyróżnić najmniejszą wartość w wierszu, mając dane wiele wierszy. Pod tym postem padło pytanie jak zrobić tak, aby wyróżnić najmniejszą wartość, ale nie będącą zerem. No i pojawił się problem, bo funkcja MIN, użyta przeze mnie w tamtym wpisie, oczywiście takie zero zaznaczy.

Formatka wygląda tak:

Formatka

Formatka

Będziemy wyróżniać najniższy niezerowy stan magazynowy. Zauważ, że zera zaznaczyłam na czerwono, aby łatwo je było wyłapać.

Do dzieła!

Formuła

Trudności są dwie:

  1. mamy zaznaczyć wartość per wiersz
  2. dla wierszy, gdzie najmniejsze jest zero funkcja MIN poda właśnie to zero.

Aby rozwiązać problem pierwszy – musimy napisać formułę w formatowaniu warunkowym i zastosować odpowiednie adresowanie komórek.

Aby rozwiązać problem drugi – użyjemy po prostu innej funkcji: MIN.K.

Zajmijmy się najpierw namierzeniem najmniejszej niezerowej wartości. Jeśli w danym wierszu najmniejszą wartośćią nie jest zero – chcemy ją wyświetlić. Jeśli natomiast najmniejsze jest zero – chcemy wyświetlić drugą co do kolejności najmniejszą wartość. Do tego celu użyjemy właśnie MIN.K. Funkcja ta potrafi zwrócić k-tą w kolejności najmniejszą wartość. My chcemy albo pierwszą (k=1) albo drugą (k=2). Owe k to drugi argument tej funkcji.

Czyli jeśli interesuje nas pierwsza najmniejsza wartość (czyli po prostu: najmniejsza), tak napiszemy funkcję MIN.K: =MIN.K(C4:I4;1), a gdy drugą najmniejszą- tak: =MIN.K(C4:I4;2).

Mam nadzieję, że proste :).

Problem w tym, że raz chcemy pierwszą najmniejszą raz drugą. Zależy to oczywiście od wartości tej pierwszej, najmniejszej wartości. Będziemy więc ją sprawdzać i zrobimy to za pomocą funkcji JEŻELI:

=JEŻELI(MIN(C4:I4)=0;MIN.K(C4:I4;2);MIN(C4:I4))

lub ewentualnie tak (ja tak wolę – jest czytelniej):

=MIN.K(C4:I4;JEŻELI(MIN(C4:I4)=0;2;1))

Powyższymi formułami po prostu wyświetlimy najmniejszą niezerową wartość. Teraz trzeba to ubrać tak, jak potrzebuje od nas formatowanie warunkowe, czyli w logikę: w wyniku chcemy uzyskać PRAWDA lub FAŁSZ. Dodatkowo pamiętajmy, że ta formuła ma działać dla każdej komórki ze stanami magazynowymi. Czyli wartość każdego stanu ma zostać w ten sposób sprawdzona, a mamy do dyspozycji tylko jedną formułę. Zastosuję więc adresowanie mieszane tak, aby zablkoować kolumny zakresów (jednowierszowych), w których badam najmniejszą wartość):

Całość będzie wyglądała tak:

=C4=MIN.K($C4:$I4;JEŻELI(MIN($C4:$I4)=0;2;1))

Teraz wystarczy to tylko przekopiować do formatowania warunkowego i wybrać kolor :).

Formatowanie warunkowe

Zanim jednak przekopiujemy – zaznaczmy zakres, który ma być formatowany (C4:I9. Uwaga, tutaj bardzo ważne jest to, aby zacząć zaznaczać od pierwszej komórki zakresu formatowanego, czyli C4. Dla Excela będzie to oznaczało, że formuła, którą napisaliśmy ma być stosowana począwszy od tej właśnie komórki. To tak, jak piszemy formułę w zwykłej tabeli i kopiujemy ją w dół. Też zaczynamy pisać od pierwszej komórki.

Ok. Teraz można tworzyć regułę formatowania, czyli:

  1. Narzędzia główne/ Formatowanie warunkowe/ Nowa reguła/ Użyj formuły do określenia komórek, które należy sformatować
  2. W pole formuła wklej treść formuły opisanej powyżej:
  3. Wybierz formatowanie
  4. I zatwierdź wszystko OK:

    Tworzenie reguły formatowania warunkowego

    Tworzenie reguły formatowania warunkowego

Oto wynik (ostatnio mam fazę na taki seledynowy ;)):

Wynik

Wynik

Mam nadzieję, że proste :).

Powiązane produkty

 

Tutaj możesz pobrać plik z rozwiązaniem:
MalinowyExcel Wyróżnianie najmniejszej niezerowej wartości dw.xlsx

 

A tutaj wersja wideo:

(pojawi się wkrótce)

 

 

 

Wyróżnianie najmniejszej niezerowej wartości – po tuningu

$
0
0

Czyli co będzie, jeśli są dwa zera w wierszu?

Po opublikowaniu ostatniego wpisu, a konkretnie filmu na YouToube, Bill Szysz i Adam Kopeć napisali mi, że moja formuła dla tamtych danych działa jak najbardziej, natomiast nie zadziała, jeśli w wierszu jest więcej niż jedno zero. Faktycznie! Kompletnie o tym nie pomyślałam, a przecież to dość prawdopodobny przypadek. Dlatego dzisiaj zmienię trochę dane – dorzucę więcej zer – i pokażę formułę zaproponowaną przez Billa, która sobie z taką sytuacją doskonale radzi. A zobaczycie, że jest ona równie prosta :).

Oto nowa formatka:

Formatka

Formatka

Jest w niej więcej zer.

Logika formuły

No właśnie, więcej zer. W takim razie, którą najmniejszą wartość trzeba wyróżnić? Wtedy było łatwo – bo była to albo pierwsza albo druga. Dlatego zwykłe JEŻELI w zupełności wystarczyło. Natomiast jeśli teraz będą 2 zera? Albo 3?

Pomyślmy chwilę i rozpiszmy to łopatologicznie.

  1. Ilość zer: 0 → Która minimalna? 1
  2. Ilość zer: 1 → Która minimalna? 2
  3. Ilość zer: 2 → Która minimalna? 3
  4. Ilość zer: 3 → Która minimalna? 4

Dokładnie. Mam nadzieję, że wzór widać (czy “rytm” jak mówi moja córeczka).

Wyświetlimy wartość minimalną o numerze o jeden większym niż ilość zer. A jak policzyć te zera? Oczywiście funkcją LICZ.JEŻELI.

Zatem nasza formuła wyświetlająca którąś najmniejszą wartość będzie taka:

=MIN.K(C5:I5;LICZ.JEŻELI(C5:I5;0)+1)

A w formatowaniu warunkowym, z dolarami taka:

=C5=MIN.K($C5:$I5;LICZ.JEŻELI($C5:$I5;0)+1)

Idąc jeszcze krok dalej, jeśli chcielibyśmy się zabezpieczyć przed wartościami ujemnymi, to wystarczy, że zmodyfikujemy lekko tę formułę:

=C5=MIN.K($C5:$I5;LICZ.JEŻELI($C5:$I5;”<=0″)+1)

Gdybyśmy więc mieli w zestawieniu ujemne stany magazynowe (śmiesznie, bo Bill mi napisał, że już spotkał się z czymś takim, a ja, dosłownie kilka dni później widziałam coś takiego w IKEI!!!) – też nie zostaną one zaznaczone. Choć tak sobie myślę, że na tę akurat sytuację, dość nietypową, można byłoby dać oddzielną regułę, żeby zaznaczać na czerwono takie anomalie :).

Formatowanie warunkowe

Tutaj tworzymy nową regułę, jak ostatnio. Wpisujemy jedynie formułę opisaną wyżej:

Reguła formatowania warunkowego

Reguła formatowania warunkowego

I dostajemy taki wynik:

Wynik

Wynik

Hehe, w sumie identyczny jak poprzednio, natomiast bardziej odporny na zera, niż poprzedni 🙂

Powiązane produkty

 

 Tutaj gotowiec do pobrania:

MalinowyExcel Wyróżnianie najmniejszej niezerowej wartości TUNING dw.xlsx

 

A tu film na YT:

(pojawi się wkrótce)

 

 

 

Zaproszenie na WEBINAR: Konwersja tekstu na liczbę w Excelu

$
0
0

Zapraszam Cię na bezpłatny webinar Konwersja tekstu na liczbę. Na webinarze omówimy szereg metod na radzenie sobie z sytuacją, gdy Excel liczby traktuje jak tekst. Zaczniemy od formuł, w których też trzeba sobie radzić z tym problemem, a skończymy na Power Query. A ponieważ czasem liczb przechowywana w formie tekstu jest sytuacją pożądaną – powiemy sobie również o tym, jak to zrobić.

Wpadaj koniecznie, tylko najpierw się zapisz TUTAJ, ponieważ tylko zapisane 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!

 

 

Metoda ze schowkiem

$
0
0

Czyli szybka metoda na konwersję tekstów na liczby

Na ostatnim webinarze o konwersji liczb przechowywanych jako tekst na liczby, Bill Szysz wspomniał o metodzie konwersji, o której nie miałam zielonego pojęcia. Metoda ta wykorzystuje schowek pakietu Office i jest mega-szybka! Postanowiłam się nią z Wami podzielić – zależy mi, abyście ją znali – jest super!

Konwersja-tekstu-na-datę-Metoda-ze-schowkiem-Schemat-działania
Schemat działania

Formatka

Formatka jest bardzo prosta, natomiast zawiera daty przechowywane przez Excela jako tekst (kolumna Data FV):

Formatka
Formatka

Metoda polega na skopiowaniu danych do schowka, a następnie na wklejeniu ich do arkusza w to samo miejsce. Możemy to zrobić myszką, ale też przy użyciu skrótów klawiszowych.

Myszką…

Najpierw zaznaczamy dane, które chcemy przekonwertować.

Następnie wywołujemy schowek. Możemy to zrobić z menu Narzędzia główne, sekcja Schowek, i jego opcje:

Wywoływanie schowka
Wywoływanie schowka

Pojawi się schowek, więc teraz kopiujemy zaznaczony zakres – Ctrl + c.

Zakres ten wskoczy do schowka, więc teraz wystarczy już go tylko wkleić do arkusza (w to samo miejsce):

Wklejanie danych ze schowka
Wklejanie danych ze schowka

I to tyle. Wkleimy już przekonwertowane dane (uwaga na format komórki, które te dany miały pierwotnie! Może być inny niż oczekujemy):

Wynik wklejania
Wynik wklejania

Klawiaturą…

To samo możemy zrobić prawie całkowicie za pomocą klawiatury. Warunek jest jednak taki, że mamy w schowku ustawioną opcję Pokaż schowek pakietu Office po dwukrotnym naciśnięciu Ctrl +C:

Ustawianie opcji schowka
Ustawianie opcji schowka

Jeśli ta opcja jest włączona – możemy właśnie w ten sposób wywołać schowek, jednocześnie od razu ładując do niego zaznaczone wcześniej dane do przekonwertowania. Potem to już tylko Wklej wszystko:

Szybkie kopiowanie i wklejanie
Szybkie kopiowanie i wklejanie

I gotowe! Efekt wychodzi ten sam, co wcześniej:

Wynik wklejania
Wynik wklejania

Którą metodę wybierasz? 😜

A tutaj plik z danymi przed konwersją do pobrania:

I film na YouToube:

Powiązane produkty

  • WEBINAR: Konwersja tekstu na liczbę, odpowiadający na pytanie dlaczego w ogóle Excel czasem traktuje liczby/ daty jako tekst oraz prezentujący szereg metod na radzenie sobie z takimi sytuacjami. Dodatkowo pokazana jest też metoda na sytuację odwrotną: gdy chcemy z liczby stworzyć tekst.

Wizualizacja odchyleń od planu sprzedaży

$
0
0

Czyli ciekawe użycie formatowania warunkowego

Zazwyczaj odchylenia od planu sprzedaży prezentujemy tak, aby było widać jego kierunek: na plus czy na minus. Używamy do tego najczęściej ikon formatowania warunkowego (strzałek, świateł ulicznych), formatowania niestandardowego, czy po prostu zwykłych procentów. I super, to są jak najbardziej skuteczne sposoby na wizualizację różnic/odchyleń. Stosujemy je, gdy chcemy się zorientować raczej w dużym obrazku – na zasadzie: dobrze/źle.

Natomiast odchylenia te możemy zaprezentować też w nieco inny sposób wtedy, gdy zależy nam na ich bardziej wnikliwej analizie. Możemy wtedy skorzystać z takich pasków danych:

Wynik - odchylenie od planu jako paski danych

Dzięki nim nadal widzimy dość duży obrazek, ale też na pierwszy rzut oka dostajemy dodatkową informację: porównanie wykonania planu przez handlowców. Dostajemy to niejako gratis, właśnie dzięki temu sposobowi zaprezentowania wyników.

A zrobienie tego cudeńka jest niesamowicie proste. Jest to bowiem wbudowana funkcjonalność formatowania warunkowego: paski danych.

W naszej formatce, do danych sprzedażowych potrzebujemy dopisać prostą formułkę, badającą odchylenie: może to być zwykłe odejmowanie albo procenty – dobierz odpowiednio do swoich danych. Dla formatowania warunkowego nie ma to znaczenia – działać będziemy tak samo. Ja wybiorę tym razem zwykłą różnicę: do komórki F4 i kolejnych wprowadzę formułę:

=D4-E4

O tak:

Formuła licząca różnicę między wykonaniem a planem sprzedaży
Formuła licząca różnicę między wykonaniem a planem sprzedaży

A jeśli chcesz odchylenie procentowe, to formuła będzie taka:

=D4/E4-1

I tę właśnie nowo-powstałą kolumnę z formułą będziemy formatować. Zaznaczmy ją.

Teraz tylko: Narzędzia główne/ Formatowanie warunkowe/Paski danych/…:

Wybór pasków danych...
Wybór pasków danych…

Polecam Ci wybrać zielony kolor bez gradientu – nie trzeba będzie tutaj już nic formatować (jeśli oczywiście chcesz tradycyjne kolory zielony i czerwony).

I w zasadzie można byłoby już na ty poprzestać, bo z tego wyklikania wyjdzie nam to:

Wynik formatowania
Wynik formatowania… jeszcze do poprawy

Widoczne są jeszcze liczby, będące wynikiem formuły -to one właśnie są graficznie prezentowane przez paski danych. Od bidy mogłyby zostać, ale dla mnie zbytnio przesłaniają obrazek. Pozbędę się ich. W tym celu będę edytować regułę formatowania warunkowego, czyli: Narzędzia główne/ Formatowanie warunkowe/Zarządzaj regułami/ przycisk Edytuj regułę i tam zaznaczamy checkbox Pokaż tylko pasek:

Opcja: Pokaż tylko pasek
Pokaż tylko pasek

Zauważ, że w tym okienku można ustawić wiele ciekawych opcji, choćby kolor paska.

Po zatwierdzeniu wszystkich okienek wyjdzie już coś takiego:

Wynik
WYNIK

Szerokość i wysokość pasków zależy od szerokości kolumn i wysokości wierszy, w których się znajdują. Można je dowolnie zmieniać. Sensownie, oczywiście!

Na koniec tradycyjnie plik z gotowym rozwiązaniem do pobrania:


I film prezentujący rozwiązanie:

Viewing all 291 articles
Browse latest View live