Działanie Bootstrapa w kontekście responsywnych stron

Framework Twitter Bootstrap w ostatnich kilku latach szturmem zdobywa serca programistów, pragnących budować responsywne strony. Praktycznie każdy, kto tworzy nowy projekt, rozważa wykorzystanie Bootstrapa do „zasilania” frontendu. Nic dziwnego, bo z każdą kolejną wersją Bootstrapa dostajemy zestaw gotowych klas, które znacząco ułatwiają i przyspieszają budowę responsywnych stron internetowych (a z wersją Bootstrap 3 również stron mobilnych).

Zatem przyjrzyjmy się bliżej jak działa Bootstrap i dlaczego tak dobrze wspiera budowę responsywnych stron.

Zapytania mediów

Po pierwsze, Bootstrap dzieli urządzenia na których przeglądana jest strona na 4 kategorie pod kątem rozmiaru ekranu:

  • Extra Small Devices – urządzenia z ekranem o szerokości mniejszej niż 768px, np. smartfony.

  • Small Devices – urządzenia z ekranem o minimalnej szerokości min-width: 768px i maksymalnej szerokości max-width: 991px. Na przykład tablety.

  • Medium Sized Devices – urządzenia z ekranem o minimalnej szerokości min-width:992px oraz maksymalnej szerokości max-width:1199px. Na przykład monitory komputerów stacjonarnych.

  • Larger devices – urządzenia z ekranem szerszym niż min-width: 1200px, np. monitory panoramiczne.

Bootstrap dopasowuje arkusz stylów CSS do danego urządzenia dzięki zastosowaniu zapytań @media.

Layout oparty o Grid

Po drugie, Bootstrap działa w oparciu o tzw. GRID system. W uproszczeniu, po prostu dzieli stronę na kolumny, a precyzyjniej – na 12 kolumn. Poniżej znajduje się szablon według którego tworzona jest struktura treści strony – w tym wypadku jest ona dwukolumnowa:

<div class="container">
    <div class="row">
        <div class="col-xs-6">
            <p>kolumna 1</p>
        </div>
        <div class="col-xs-6">
            <p>kolumna 2</p>
        </div>
    </div>
</div>

Według powyższego, struktura strony zawiera się w div.container. Obejmuje ona całą powierzchnię ekranu z odstępem 15px od lewej i prawej krawędzi ekranu (padding-left:15px oraz padding-right:15px zdefiniowane w bootstrap.css). Dzięki powyższym zapytaniom mediów, .container może przyjmować następujące szerokości:

  • width: auto (lub brak) na smartfonach (ekran mniejszy niż 768px)
  • width: 750px na tabletach (ekran większy równy 768px)
  • width: 970px na komputerach stacjonarnych (ekran większy równy 992px)
  • width: 1170px na monitorach panoramicznych (ekran większy równy 1200px)

Kolejnym elementem jest div z klasą .row. Jest on używany jako „opakowanie” dla kolumn. Jego najważniejsze atrybuty to margin-left:-15px oraz margin-right:-15px. Te minusowe wartości marginesów niwelują padding nadany klasie .container, która obejmuje .row. W wyniku tego .row dotyka lewej i prawej krawędzi ekranu. Dlaczego? Wszystko wyjaśnia się, jeśli zobaczymy jak zaprogramowane są kolumny. Poniżej klasa .xs-col-6:

.col-xs-6 {
padding-right: 15px;
padding-left: 15px;
}

A więc widzimy, że kolumny posiadają 15px padding. Dzięki temu zapewniona jest nie tylko odległość zawartości kolumn od krawędzi ekranu (zaznaczam, padding zapewnia odległość zawartości kolumn, sama krawędź kolumny dotyka krawędzi ekranu), ale także symetryczne odległości między zawartością sąsiadujących kolumn.

Taka struktura sprawia, że zawartość strony pozostaje w odległości 15px od krawędzi ekranu. Gdybyśmy chcieli tworzyć na całej szerokości, korzystamy z klasy .container-fluid zamiast .container, która wypełnia całą szerokość ekranu.

O co chodzi z tymi kolumnami i systemem GRID

Przestrzeń każdej strony opartej na Bootstrapie zajmuje w sumie 12 „niewidocznych” kolumn. To od nas jako developerów zależy, ile z tych kolumn chcemy wykorzystywać w danym miejscu. W jaki sposób wpływa to na responsywność? Po pierwsze, istnieją 4 kategorie klas dla kolumn w zależności od tego jak dużo miejsca mają zajmować, i na jakim urządzeniu przeglądana jest strona:

  • .col-xs-… – na smartfonach
  • .col-sm-… – na tabletach
  • .col-md-… – na komputerach
  • .col-lg-… – na dużych monitorach panoramicznych

W deklaracji każdej klasy po ostatnim myślniku dodajemy cyfrę od 1 do 12. Wyznacza ona liczbę kolumn, jaką zajmie nasz div. Na przykład col-xs-6 tworzy kolumnę szeroką 6 razy bardziej od pojedynczej kolumny:

bootstrap-tutorial

Po drugie, w domyśle szerokości tych kolumn nie są zdefiniowane (width:auto) jednak w wyniku zapytań mediów, szerokość każdej kolumny przyjmuje wartości procentowe:

.col-*-12 { width: 100%; }

.col-*-11 { width: 91.66666667%; }

.col-*-10 { width: 83.33333333%; }

.col-*-9 { width: 75%; }

.col-*-8 { width: 66.66666667%; }

.col-*-7 { width: 58.33333333%; }

.col-*-6 { width: 50%; }

.col-*-5 { width: 41.66666667%; }

.col-*-4 { width: 33.33333333%; }

.col-*-3 { width: 25%; }

.col-*-2 { width: 16.66666667%; }

.col-*-1 { width: 8.33333333%; }

Responsywne tabele

W Bootstrapie tworzymy tabele za pomocą klasy .table. W jej wyniku tabela wypełnia całą szerokość elementu, w którym sięznajduje (rodzica DOM), ponieważ posiada atrybuty width:100% oraz max-width:100%.

To sprawia, że tabela odpowiednio reaguje na zmniejszanie/powiększanie ekranu. Ale bardzo duże (wielokolumnowe) tabele wyglądają nieczytelnie na bardzo wąskich ekranach, kiedy je tak „miażdżymy”. Z pomocą przychodzi nam druga klasa Bootstrapa poświęcona tabelom: .table-responsive. Zastosowanie .table-responsive zamiast .table sprawia, że nie pozwalamy tabeli zwężać się na małych ekranach, ale zamiast tego dodajemy możliwość przewijania zawartości tabeli w poziomie:

tutorial-bootstrap-responsywna-strona

Ciekaw jestem czy znalezliście jeszcze inne pomysły autorów Bootstrapa zastosowane w celu radzenia sobie z responsywnością stron i prawidłowym wyświetlaniem contentu na różnych ekranach.

Jak w Excelu napisać tekst w komórce jeden pod drugim

Czasem potrzebujemy w Excelu umieścić tekst w jednej komórce, ale tak, aby był napisany w dwóch lub więcej liniach. Przyczyny mogą być różne, ale najczęściej występująca to ta, gdy mamy po prostu długi tekst do wpisania, a komórki nie możemy lub nie chcemy rozszerzać. Po co nam ogromnie szeroka kolumna, skoro możemy mieć ją węższą, a tekst w niej napisać po prostu w dwóch linijkach.

Oto dwa sposoby, jak napisać tekst jeden pod drugim w jednej komórce.

Pierwszy stosujemy na etapie wpisywania tekstu do komórki. Jeśli chcesz, pobierz plik źródłówy dołączony do tego artykułu (link po prawej stronie) i podążaj za instrukcjami krok po kroku. Możesz także otworzyć pusty skoroszyt i wykonać polecenia.

Zaczynamy od kliknięcia na komórce (A2 w dołączonym pliku na arkuszu „Sposób 1”) i wpisania „3,2 km stylem dowolnym

1-napisac-tekst-w-dwoch-linijkach-excel

Uwaga! Po wpisaniu tekstu nie wciskaj Enter. To będzie nasza pierwsza linia w tej komórce, dlatego wciskamy kombinację Alt+Enter. W ten sposób pozostaniemy cały czas w tej samej komórce, a kursor przeniesie się do nowej linijki:

2-excel-tekst-jeden-pod-drugim

Następnie wpisujemy ciąg dalszy: „10 km stylem klasycznym”:

3-jak-w-excelu-dwie-linie-w-jednej-komorce

I ponownie wciskamy Alt+Enter, aby przejść do trzeciej linijki. Wpisujemy kolejny bieg: „Sprint stylem dowolnym”. I możemy tak w nieskończoność, ale my poprzestaniemy na tym. Na koniec wciskamy Enter i mamy taki rezultat:

4-jak-w-excelu-pisac-tekst-jeden-pod-drugim

Jak widzisz pisaliśmy na bieżąco w komórce, umieszczając kolejne linijki tekstu jedna pod drugą za pomocą kombinacji klawiszy Alt+Enter.

Drugi sposób stosujemy wtedy, gdy mamy już tekst w komórce, ale np. jest on za długi i wolelibyśmy, aby był on napisany w kilki liniach, zmiast jednej długiej. Przykład takiej sytuacji jest w dołączonym pliku na drugim arkuszu o nazwie „Sposób 2”. Mamy tu tekst w komórce A2, który znacząco wystaje poza szerokość kolumny:

5-excel-tekst-pod-soba

Zaznaczamy komórkę z tym tekstem (A2) i klikamy na niej prawym przyciskiem, aby wyświetlić menu podręczne. Wchodzimy do pozycji Formatuj komórki:

6-excel-kilka-linijek-w-jednej-komorce

Wyświetli się okno dialogowe Formatowanie komórek. Kilkamy na zakładkę Wyrównanie, następnie zaznaczamy pole przy opcji Zawijaj tekst. Klikamy OK.

7-jak-w-excelu-napisac-tekst-jeden-pod-drugim

Excel automatycznie „przerobił ten tekst” na kilka linijek tak, aby dostosować go do szerokości kolumny.

8-excel-tekst-w-jednej-komorce-pod-drugim

Którą sposób najlepiej stosować? Ja osobiście preferuję ich połączenie. Czyli korzystam ze sposobu drugiego, ponieważ jest szybszy (nie muszą wpisywać co chwila Alt+Enter), a potem sprawdzam, czy tekst w komórce został podzielony na linijki tak jak chcę i ewentualnie wstawiam kursor i wciskam Alt+Enter w miejscach, gdzie preferuję przenieść tekst do nowej linijki.

Opanuj Excela 2013 krok po kroku

Zaczynasz przygodę z Excelem i pragniesz nauczyć się najlepszych technik pracy? Nie musisz czytać setek tutoriali lub książek – w tym kursie krok po kroku poznasz esencję skutecznej pracy z arkuszami kalkulacyjnymi w Excelu. Wystarczy Ci jeden dzień.

Jeśli masz już za sobą pierwsze kroki w Excelu, ten kurs to doskonały sposób, abyś odświeżył sobie dotychczasową wiedzę i przypomniał własne umiejętności.

Nareszcie będziesz wiedział jak szybko wykonać obliczenia w Excelu. Nie stracisz czasu na wertowanie Internetu w poszukiwaniu porad jakiej formuły użyć, czy jak zapisać datę lub walutę. Nie stracisz też włosów na głowie, gdy zamiast cieszyć szybkimi wyliczeniami, Excel będzie Cię tylko frustrował. Dzięki doświadczonemu instruktorowi, który opowiada jak sprawnie wprowadzać różne typy danych, jak je formatować, kopiować, przenosić, usuwać, czy wreszcie jak dodawać kolumny i wiersze, to Excel będzie słuchał się Ciebie, a nie na odwrót.

Potężne funkcje JEŻELI, WYSZUKAJ.PIONOWO i inne przestaną budzić strach. Zobaczysz, że korzystanie z nich jest banalne – po prostu trzeba wiedzieć, jak to robić. Po obejrzeniu kilku minut lekcji będziesz wiedzieć wszystko. Tak samo w małym palcu będziesz mieć tabele przestawne, wykresy czy makra.

W tym kursie:

  • Dowiesz się czym jest Excel i do czego służy
  • Poznasz interfejs i menu programu
  • Dowiesz się jak wprowadzać teksty, liczby, daty, godziny oraz jak je kopiować, przenosić i usuwać
  • Nauczysz się tworzyć formuły
  • Zobaczysz jak wyliczyć sumę, średnią, medianę czy skorzystasz z funkcji warunkowych
  • Uatrakcyjnisz wygląd arkusza, zmienisz czcionkę, rozmiar kolumn i wierszy, dodasz obramowanie, zdjęcia i elementy graficzne.
  • Zobaczysz jak dodawać / usuwać / ukrywać dane, wiersze i kolumny
  • Będziesz wiedzieć jak skutecznie sortować i filtrować dane
  • Przestaniesz marnować papier w drukarce, bo dowiesz się jak dobrze wydrukować arkusze
  • Stworzysz tabele przestawne i łatwo zanalizujesz dane dzięki wykresom
  • Zobaczysz jak zablokować arkusz przed nieuprawnioną edycją oraz jak śledzić zmiany
  • Przyśpieszysz swoją pracę, wykorzystując makra.

Kurs omawia jak zacząć pracować w programie Excel na przykładzie wersji Excel 2013, chociaż większość przedstawionych informacji można z powodzeniem stosować również we wcześniejszych wersjach programu.

Jak stworzyć tabelę przestawną w Excel z kilku arkuszy

Stworzenie tabeli przestawnej nie jest trudnym zadaniem. Wystarczy, że zaznaczymy jakąś komórkę w obrębie naszyc danych i skorzystamy z adekwatnej funkcji Excela na wstążce. Kiedy jednak mamy skomplikowany skoroszyt z wieloma arkuszami i danymi, stworzenie dla nich tabeli przestawnej przestaje być tak banalne.

No więc zastanawiasz się jak stworzyć tabelę przestawną, kiedy dane, które chcesz zawrzeć w tabeli, rozmieszczone są w kilku różnych arkuszach? W Excelu 2013 do dyspozycji mamy funkcję o nazwie Model Danych, która umożliwia łatwie skomponowanie takiej tabeli na podstawie relacji charakterystycznych dla typowych baz danych.

Do tego artykułu dołączony jest plik źródłowy, tabela-przestawna.xlsx, który możesz pobrać i wykorzystać do powtórzenia czynności opisanych w artykule. Plik to skoroszyt Excela, zawierający 3 arkusze. Pierwszy z nich, to Zamówienia:

tabele-przestawna-rozne-arkusze-1

Na tym arkuszu znajdują się informacje dotyczące każdego zamówienia w 2014 roku w pewnym umownym sklepie meblowym. Każde zamówienie opisane jest swoim unikalnym numerem, a następnie datą, kiedy zostało złożone, produktem, którego dotyczyło zamówienie, a także sposobem, w jaki zostało dokonane – poprzez wizytę w sklepie stacjonarnym lub przez stronę internetową. Kolejny arkusz, Klienci obejmuje oczywiście listę klientów:

tabele-przestawna-z-wielu-arkuszow-2

Każdy klient opisany jest imieniem, nazwiskiem oraz nazwą miasta, gdzie mieszka, a także numerem zamówienia, którego dokonał w sklepie. Numer zamówienia jest naszym kluczem. To znaczy, na jego podstawie możemy sprawdzić, jakiego zamówienia dokonał dany klient, po prostu porównując numer zamówienia z tego arkusza Klient z numerem zamówienia z arkuszu Zamówienia.

Natomiast w trzecim, ostatnim arkuszu Płatności mamy dodatkowe informacje o każdej transkacji, a konkretnie kwota, sposób płatności i wreszcie status – czy zamówienie zostało już zrealizowane, czy jest w trakcie realizacji.

jak-stworzyc-tabele-przestawna-excel-tutorial-3

Tutaj także mamy kolumnę Nr zamówienia. Dzięki temu numerowi, możemy łatwo połączyć informacje o płatności z zamówieniem, którego dotyczy na arkuszu Zamówienia, oraz klientem, który złożył to zamówienia, na zakładce Klienci.

Ta kolumna Nr zamówienia jest częścią wspólną dla wszystkich trzech arkuszy, a więc to na niej oprzemy naszą tabelę przestawną. Dzięki takiej tabeli przestawnej, nie będziemy musieli przełączać się między tymi akruszami za każdym razem, gdy będziemy chcieli uzyskać inne informacje o danym zamówieniu (określonym swoim unikalnym Nr zamówienia). Tak więc Nr zamówienia będzie dla nas czymś w rodzaju łącznika między arkuszami, na zasadzie podobnej do tego jak działa klucz główny (primary key) w relacyjnych bazach danych.

Posiadanie takiego unikalnego klucza głównego w swoich danych na różnych arkuszach nie jest warunkiem koniecznym do stworzenia łączącej ich tabeli przestawnej, ale znacząco zmniejsza ryzyko popełnienia błędu.

Przed stworzeniem tabel przestawnych, utworzmy tabele dla danych na każdym z trzech arkuszów. Zaczynamy od arkusza Zamówienia – mając ten arkusz aktywny zaznaczamy jakąkolwiek komórkę w obrębie danych, np. C11:

4-tutorial-excel-tabele-przestawne

Następnie klikamy na zakładce Wstawianie, odszukujemy ikonkę Tabela i klikamy na niej:

6-tabele-przestawne-pivot-table

Wyświetli się okno dialogowe Tworzenie tabeli, której obszar powinien automatycznie objąć wszystkie dane na tym arkuszu. Innymi słowy, dane w arkuszu powinny być otoczone przerywaną linią, tzw. Maszerującymi mrówkami. Upewniamy się, że w oknie dialogwym mamy zaznaczoną opcję „Moja tabela ma nagłówki”.

5-tworzenie-tabel-przestawnych

Klikamy OK. Nasze dane powinny przybrać format tabeli z przyciskami do filtrowania oraz naprzemiennie oznaczonymi rzędami niebiskim kolorem.

Teraz wchodzimy na kartę Projektowanie na wstążce. Ta karta jest widoczna tylko wtedy, gdy mamy zaznaczoną jakąś komórkę w obrębie naszej tabeli, więc upewniamy się, że tak właśnie jest. W przeciwnym razie karty Projektowanie nie będziemy widzieć na wstążce. Z lewej strony tej karty znajduje się pole Nazwa tabeli – zmieniamy nazwę z domyślnej Tabela3 na Dane_zamowien.

8-zmienic-nazwe-tabeli-excel

Teraz powtarzamy ten krok w każdym z naszych arkuszów. Nazwy utworzonych tabel ustawiamy na odpowiednio: Dane_klientow oraz Dane_platnosci. Po ukończeniu tej czynności możemy nareszcie utworzyć tabelę przestawną.

Wchodzimy na arkusz Płatności i zaznaczamy dowolną komórkę w tabeli. Następnie na zakładce Wstawianie klikamy ikonkę Tabela przestawna. Powinniśmy ujrzeć okno dialogowe tworzenia tabeli przestawnej. Obszar danych do tabeli powinien być zaznaczony automatycznie i prawidłowo, miejsce docelowe wyznaczamy jako nowy arkusz, natomiast kluczowym elementem jest zaznaczenie pola przy opcji „Dodaj te dane do modelu danych”:

9-tutorial-tabele-przestawne-excel

Po kliknięciu OK zostaniemy przeniesieni na utworzony arkusz1 z tabelą przestawną. Z lewej strony jest obszar, w którym pojawi się tabela, a po prawej stronie znajduje się belka, która daje nam możliwość wybory pól odo tabeli przestawnej. Jeśli miałeś wcześniej styczność z tabelami przestawnymi, jest to standardowy widok po utworzeniu nowej tabeli przestawnej w nowym arkuszu. Dodatkowo, aktywna zakładka na wstążce to Analiza. Klikamy na nim na przycisk Relacje.

10-tabela-przestawna-widok

W wyświetlonym w ten sposób oknie dialogowym utworzymy relacje do naszej tabeli przestawnej. Są one nam potrzebne, aby połączyć ze sobą dane z 3 róznych arkuszy w logiczne zestawienie. Klikamy na przycisk Nowy. W kolejnym oknie tworzymy pierwszą relację – będzie to relacja arkusza z zamówieniami z arkuszem klientów, a łącznikiem, czyli kluczem głównym będzie tabela Nr zamówienia. W polu Tabela wybieramy Dane_zamowien, w polu Kolumna (obiekt obcy) wybieramy Nr zamówienia, w polu Pokrewna tabela wybieramy Dane_klientów, a w polu Pokrewna kolumna (obiekt podstawowy) wybieramy również Nr zamówienia – jak na poniższym obrazie:

12-relacje-w-tabeli-przestawnej

W ten sposób wiersze Excel skojarzy ze sobą wiersze z obu tych arkuszy, posiadające ten sam numer zamówienia. Powtórzy tę samą czynność, tym razem łącząc arkusze Zamówień z Płatnościami – również za pomocą kolumny Nr zamówienia. Po wykonaniu tych akcji nasze relacje powinny prezentowac się następująco:

13-jak-utworzyc-relacje-tabeli-przestawnej

Klikamy Zamknij. Tabela przestawna jest już gotowa. Najwyższa pora ją do czegoś wykorzystać. Wyznaczmy więc pola, które chcemy wyświetlić. Jest to moment, w którym możesz poeksperymentować i zobaczyć, jakie ciekawe informacje możesz uzyskać na podstawie tych 3 arkuszów. Ja proponuję zestaw pól poniżej. Najpierw jednak kliknij na WSZYSTKIE, aby wyświetlić dane ze wszystkich 3 arkuszów:

wszystkie-pola-tabeli-przestawnej-wiele-arkuszy

Następnie kliknij na te małe trójkąciki przy każdym z arkuszów, aby otrzymać listę pól z każdego z nich:

14-pola-tabeli-przestawnej

Teraz przesuń pola do obszarów w ten przykładowy sposób:

  • Miasto do obszaru WIERSZE
  • Produkt do obszaru KOLUMNY
  • Kwota do obszaru WARTOŚCI
  • Kanał do obszaru FILTRY

Powinieneś uzyskać taką tabelę:

Zachęcam do eksperymentowania z innym układem danych w tabeli – jak w każdej innej tabeli przestawnej.

Jak wyświetlać poprawną formę rzeczowników liczby mnogiej w PHP

Tak to już w pracy programisty bywa, że oprócz reguł rządzących językami programowania, musi często uważać także na zawiłe aspekty naszego ojczystego języka mówionego. Chyba nie polskiego kodera, który wcześniej czy później nie trafi na problem poprawnego użycia liczby mnogiej.

Chodzi o to, że w języku polskim rzeczowniki w liczbie mnogiej przyjmują różne końcówki w zalezności od danej liczby. Dla przykładu, tak to wygląda w przypadku rzeczownika „osoby”:

2 osoby
5 osób
22 osoby
23 osoby
24 osoby
25 osób
...
101 osób
102 osoby
...
1239 osób
...
1302 osoby
...
907342034 osoby
907342035 osoby

W poniższym tutorialu zademonstruję, jak rozwiązać ten problem, czyli jak wyświetlać poprawną formę „osoby” w zależności od liczby osób.

Najpierw przeanalizujmy, jak zmienia się forma „osób/osoby„. Szybko zauważymy, że forma rzeczownika zależy od ostatniej cyfry liczebnika – bez względu, z jak dużym liczebnikiem mamy do czynienia. I tak, dla liczb kończących się na 2,3 oraz 4, mamy formę „osoby”, np:

8**2** osoby
16**3** osoby
902**4** osoby

… a dla liczb kończących się pozostałymi cyframi, mamy formę „osób„:

80 osób
81 osób
165 osób
9026 osób
4897 osób
...itd.

W takim razie wystarczy nam tylko dowiedzieć się, jaka jest ostatnia cyfra naszej liczby osób. Aby to zrobić, skorzystamy z funkcji SUBSTR.

$liczba_osob = 124; // to tylko przykład, możesz zadeklarować dowolną wartość całkowitą
$ostatnia_cyfra = substr($liczba_osob, -1);

Następnie użyjemy prostej instrukcji warunkowej, aby wyświetlić odpowiednią formę „osoby”:

if ($ostatnia_cyfra == 2 OR $ostatnia_cyfra == 3 or $ostatnia_cyfra == 4): 
    echo $liczba_osob." osoby";
else:
    echo $liczba_osob." osób";
endif;

Cały kod wygląda więc tak:

$liczba_osob = 124; // to tylko przykład, możesz zadeklarować dowolną wartość całkowitą
$ostatnia_cyfra = substr($liczba_osob, -1);
if ($ostatnia_cyfra == 2 OR $ostatnia_cyfra == 3 or $ostatnia_cyfra == 4): 
    echo $liczba_osob." osoby";
else:
    echo $liczba_osob." osób";
endif;

Testując nasz kod przez podawanie różnych zmienny dla $liczba_osób (122, 123, 124, 125) widzimy, że sprawdza się doskonale i wyświetla odpowiednio 122 osoby, 123 osoby, 124 osoby, 125 osób. Niestety, nie jest to jeszcze 100-procentowe rozwiązanie. Nasze początkowe założenie, że poprawna forma rzeczownika w języku polskim zależy od ostatniej cyfry liczebnika jest nie do końca słuszne, a mianowicie nie sprawdza się w przypadku liczb 12, 13 oraz 14. W tych przypadkach bowiem poprawna forma to „osób„, a nasz aktualny kod wyrzuci oczywiście „osoby„, ponieważ liczby te kończą się cyframi podanymi przez nas w warunku.

Aby rozwiązać ten problem, musimy rozszerzyć naszą instrukcję warunkową:

if (($liczba_osob != 12 AND $liczba_osob != 13 AND $liczba_osob != 14) AND ($ostatnia_cyfra == 2 OR $ostatnia_cyfra == 3 or $ostatnia_cyfra == 4)):
    echo $liczba_osob." osoby";
else:
    echo $liczba_osob." osób";
endif;

W ten sposób nasz skrypt, zanim wyświetli „osoby” sprawdza 2 główne warunki – po pierwsze, $liczba_osób musi być różna od 12, 13 lub 14, a po drugie ostatnią cyfrą $liczba_osób musi być 2, 3 lub 4. Nareszcie mamy poprawne wyniki:

12 osób
13 osób
14 osób
122 osoby
54352343 osoby
100004 osoby

Całość skryptu wygląda w ten sposób:

$liczba_osob = 12; // to tylko przykład, możesz zadeklarować dowolną wartość całkowitą
$ostatnia_cyfra = substr($liczba_osob, -1);
if (($liczba_osob != 12 AND $liczba_osob != 13 AND $liczba_osob != 14) AND ($ostatnia_cyfra == 2 OR $ostatnia_cyfra == 3 or $ostatnia_cyfra == 4)):
    echo $liczba_osob." osoby";
else:
    echo $liczba_osob." osób";
endif;

Ten kod oczywiście nie dotyczy tylko i wyłącznie reczoniwka „osoby”, ale praktycznie każdego jednego – można go zastosować do poprawnego odnieniania słowa „komentarze„, co również jest popularnym problemem na polskich stronach WWW. Jestem ciekaw, czy stosujecie inne zabiegi do radzenia sobie w takich przypadkach?

Projektowanie w Photoshop od podstaw

Szeroka gama filtrów i efektów, jakie oferuje Photoshop czynią go fantastycznym narzędziem dla designerów graficznych. Ten kurs skierowany jest głównie do osób, które chciałyby wykorzystywać Photoshopa właśnie do projektowania.

Zamierzam zapoznać Cię z Photoshopem w najkrótszym możliwym czasie. Program ten ma tak wiele opcji, że rozkładanie każdej z nich na czynniki pierwsze to zadanie na całe życie. A wiem, że Ty, jak każdy z nas, masz mało czasu. Dlatego w tym kursie skupimy się na funkcjach, które pozwolą Ci szybko zacząć tworzyć realistyczne i profesjonalne projekty. A konkretnie, pokażę Ci jak w skuteczny sposób wykorzystywać tak uznane aspekty Photoshopa jak warstwy, filtry i tryby mieszania. Przedstawię Ci jak tworzyć atrakcyjne elementy tekstowe i nadać im ciekawe efekty, tworzyć i edytować wektory a także np. jak wyciągnąć jakiś element z jednego obrazu i wstawić go na inne, tworząc efektowny fotomontaż.

Nie musisz znać się na Photoshopie. Jeśli próbowaleś już kiedyś coś działać w tym programie, to świetnie. Jeśli to Twój pierwszy raz – nie stanowi to problemu. Przyjmuję, że nie znasz Photoshopa i chcesz, abym Ci pokazał wszystko krok po kroku. Dlatego wszystkie lekcje Photoshop w tym kursie są łatwe do przyswojenia, a dołączone materiały dydaktyczne pozwolą Ci łatwo się uczyć, podążając za moimi instrukcjami.

Co zyskujesz?

  • Lekcje Photoshop krok po kroku
  • Jak zrobić fotomontaż
  • Jak skutecznie korzystać z filtrów takich jak rozmycie gaussowskie
  • Jak wykorzystywać tryby mieszania takie jak Ekran czy Ciemniej.

Tutorial AngularJS: tworzymy pierwszą aplikację

Zaczynamy budowę naszej aplikacji w AngularJS zupełnie od zera. Na początek więc stwórzmy prostą stronę HTML, do której później dołączymy biblioteki AngularJS. Otwórz więc swój ulubiony edytor tekstowy i wpisz następujący kod, a następnie zapisz jako plik HTML:

<!DOCTYPE html>
  <head>
   <meta charset=”UTF-8”>
   <title>Kurs AngularJS</title>
  </head>
  <body>
  </body>
</html>

Jako, że mamy już pusty dokument HTML, który stanowi bazę dla naszej aplikacji, czas podłączyć pod niego framework AngularJS. Wchodzimy na stronę https://angularjs.org/ i klikamy DOWNLOAD. Kopiujemy link z okienka w polu CDN (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js) i dołączamy go jako zewnętrzny skrypt do naszej strony w części<head></head>.

<!DOCTYPE html>
<head>
    <meta charset=”UTF-8”>
    <title>Kurs AngularJS</title>
    <script type=”text/javascript” src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js”></script>
</head>
<body>
</body>
</html>

Okej, teraz możemy już zacząć używać AngularJS na naszej stronie. Najpierw musimy jednak wyraźnie zaznaczyć, w którym miejscu będziemy używać tego frameworka. Robimy to poprzez dodanie zbiorczego bloku div i nadajemy mu atrybut ng-app. Ten atrybut jest tzw. dyrektywą AngularJS. W dalszej części naszej aplikacji zobaczysz inne atrybuty zaczynające się od ng-, one wszystkie są dyrektywami, czyli niejako poleceniami AngularJS. Dyrektywa ng-app mówi, że będziemy w tym miejscu korzystać z kodu AngularJS. Opcjonalnie możemy podać jej wartośc, która będzie nazwą aplikacji – jest to przydatne szczególnie w zaawansowanych projektach. Ja użyłem „PremierySeriali”. Od razu dodałem też klasę „container”, która przyda nam się później, gdy do naszej aplikacji podłączymy Bootstrapa.

<!DOCTYPE html>
<head>
    <meta charset=”UTF-8”>
    <title>Kurs AngularJS</title>
    <script type=”text/javascript” src=” https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js”></script>
</head>
<body>
    <div class="container" ng-app=’PremierySeriali’>
    </div>
</body>
</html>

No dobra, mamy już stronę przygotowaną pod naszą aplikację „PremierySeriali”. Ale gdzie właściwie znajduje się ta aplikacja? No właśnie, musimy ją stworzyć! Otwieramy ulubiony edytor tekstowy i tworzymy nowy plik aplikacja.js. W środku wpisujemy kod:

var apka = angular.module('PremierySeriali',[]);

I zapisujemy plik. Pamiętaj, aby plik aplikacja.js zapisać w tym samym folderze, co plik html. Powyzszy kod tworzy moduł angular, który będzie zawierał naszą aplikację. Ma taki sam tytuł, jak użylismy w pliku html (PremierySeriali) i przypisuje go do nowej zmiennej apka. Moduły, jak pewnie się domyślasz, pozwalają dzielić naszą aplikację na części, a każda część zajmuje się np. inną funkcjonalnością. Do potrzeb tego tutoriala wystarczy nam jeden moduł.

Zanim przystąpimy do kolejnego kroku, warto nadmienić, ze AngularJS jest frameworkiem działajacym w oparciu o architekturę MVC, czyli Model – View – Controller. Czym jest każda z tych części? Najłatwiej myśleć o Modelu jako o zestawie danych – większość dynamicznych aplikacji webowych opiera się właśnie na danych. W AngularJS możemy oczywiście sami rozpisać nasze dane w pliku, ale najczęściej wykorzystuje się połączenia z istniejącymi bazami danych lub plikami JSON. Dane wyświetlamy użytkownikom za pomocą kolejnej części architektury MVC, mianowicie View. Można porównać View (widok) do szablonu dla wyświetlanych danych. W AngularJS tworzymy widoki informacji (Views) poprzez umieszczanie podwójnych nawiasów klamrowych {{}} w kodzie HTML. Ostatnią częścią architektury są Kontrolery, które stanowią pomost między modelem a widokiem. Kontroler pozwala wzbogacić zestaw danych w modelu o jakieś funkcjonalności. Tworzymy więc kolejny plik, w którym umieścimy kontroler, którego będziemy używać do przeprowadzania operacji na danych:

apka.controller("MojController", function($scope,$http){
});

Nazwijmy ten plik kontroler.js I również umieśćmy w folderze z naszą aplikacją. Powyższy plik przypisuje kontroler MojController do aplikacji „apka”. Zamiast tworzyć oddzielny plik .js na kontroler, mogliśmy umieścić wszystko w jednym pliku, ale myślę, że powinniśmy pielęgnować troskę o czytelność kodu, bez względu czy to tutorial czy oficjalna aplikacja. Zatem połączmy dwa stworzone właśnie pliki, aplikacja.js oraz kontroler.js z plikiem html, a utworzony kontroler dodajmy do naszego elementu div#container za pomocą dyrektywyng-controller:

<!DOCTYPE html>
<head>
    <meta charset=”UTF-8”>
    <title>Kurs AngularJS</title>
    <script type=”text/javascript” src=” https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js”></script>
    <script src="aplikacja.js" type="text/javascript"></script> <!-- aplikacja angularJS -->
<script src="kontroler.js" type="text/javascript"></script> <!-- glowny controller przypisany do aplikacji AngularJS -->
</head>
<body>
    <div class="container" ng-app=’PremierySeriali’ ng-controller='MojController'>
    </div>
</body>
</html>

Teraz możemy już korzystać z kontrolera w naszej aplikacji, a konkretnie w elemencie div #container. Sprawdźmy, czy to działa. W pliku kontroler.js, być może zauważyłeś, gdy tworzyliśmy kontroler, od razy stworzyliśmy funkcję $scope. Utwórzmy przykładową zmienną w tej funkcji:

apka.controller("MojController", function($scope,$http){
    $scope.mojtekst = "Witaj w mojej aplikacji AngularJS!";
});

i spróbujmy się do niej odwołać w naszym pliku html przy pomocy nawiasów klamrowych:

...
<div class="container" ng-app=’PremierySeriali’ ng-controller='MojController'>
    {{mojtekst}}
</div>
...

Jeśli wszystko zrobiliśmy, jak trzeba, przeglądarka powinna wyrenderować tekst:

kurs-angularjs-tutorial Wszystko gra, a więc możemy przystąpić do kolejnego kroku.

Zaciągamy dane do aplikacji

Okej, jak wspomniałem na wstępie, nasza aplikacja będzie wyświetlała nowości serialowe. Potrzebujemy więc danych o tych serialach. Skorzystamy z API serwisu www.themoviedb.org. Aby korzystać z API, potrzebny nam jest klucz. Aby otrzymać klucz API, należy założyć (darmowe) konto na stronie themoviedb.org i wejść do zakładki API.

Klucz jest nam potrzebny, aby nie tracić czasu na ręczne tworzenie bazy danych po stronie naszego serwera, a także aby bazować na rzetelnych informacjach z serwisu, który na co dzień zajmuje się kinematografią. W ten sposób możemy założyć, że nasza aplikacja po ukończeniu będzie rzeczywiście użyteczna.

Po zdobyciu klucza do API, dodajemy go do naszego kontrolera. Wchodzimy do pliku kontroler.js i usuwamy poprzednią zadeklarowaną zmienną mojetekst, na jej miejsce tworzymy nową, która przechowywać będzie nasz klucz API:

apka.controller("MojController", function($scope,$http){
    $scope.kluczApi = "...";  // wstaw swój klucz api - np. d9eb45644e9.....
});

Lektura dokumentacji API serwisu themoviedb.org dostarcza nam informacji, jak stworzyć odwołanie, które prześle nam dane potrzebne do naszej aplikacji. Chodzi mianowicie o odwołanie ‘ first_air_date.gte‘, które pozwoli nam otrzymać seriale, które pierwszy raz pojawiły się w telewizji po wpisanej przez nas dacie. API oczekuje daty w formacie YYYY-MM-DD. Nasza aplikacja ma wyświetlać nowości, które pojawiły się w telewizji w tym miesiącu, musimy więc jeszcze określić, jaki dzisiaj jest miesiąc.

var dzisiaj = new Date();
var miesiac = dzisiaj.getFullYear() + “-“ + (“0” + (dzisiaj.getMonth() + 1)).slice(-2) + “-“ + (“0” + dzisiaj.getDate()).slice(-2);

W powyższym kodzie najpierw pobieramy dzisiejszą datę za pomocą JavaScriptowej funkcji ‘Date()‘, następnie wykorzystujemy ją w odpowiedni sposób w zmiennej ‘var miesiąc‘ aby uzyskać datę w wymaganym formacie.

Następnie wykorzystujemy tę zmienną do odwołania się do API za pomocą ‘$http.jsonp‘:

$http.jsonp("https://api.themoviedb.org/3/discover/tv?first_air_date.gte=" + miesiac + "&sort_by=popularity.desc&api_key=’+kluczApi+’&callback=JSON_CALLBACK").success(function(data) {

})

Ubieramy wszystko w funkcję ‘glowna‘ i w efekcie nasz plik ‘kontroler.js‘ powinien wyglądać tak:

apka.controller(„MojController”, function($scope,$http){
    $scope.kluczApi = „...”;  // wstaw swój klucz api - np. d9eb45644e9.....
    $scope.glowna = function() {
        var dzisiaj = new Date();
        var miesiac = dzisiaj.getFullYear() + “-“ + (“0” + (dzisiaj.getMonth() + 1)).slice(-2) + “-“ + (“0” + dzisiaj.getDate()).slice(-2);
        $http.jsonp("https://api.themoviedb.org/3/discover/tv?first_air_date.gte=" + miesiac + "&sort_by=popularity.desc&api_key=’+$scope.kluczApi+’&callback=JSON_CALLBACK").success(function(dane) {

        }).error(function(error) {
            alert(‘Houston, mamy problem z uzyskaniem danych.’);
        });
    };
});

Jak widzisz, wzbogaciłem adres odwołania do API o ciąg &sort_by=popularity.desc. Dzięki temu lista seriali, którą otrzymamy będzie posortowana pod kątem popularności serialów. Na koniec ciągu dodajemy jeszcze zmienną &callback=JSON_CALLBACK, aby upewnić się, że odpowiedź serwera będzie w formacie JSON.

Jeśli chcesz sprawdzić „na sucho” odwołanie do API, wstaw link prosto do przeglądarki, wpisując jakąś datę (na skrinie poniżej jest to 2014-09-01). Powinieneś otrzymać czystą odpowiedź w formacie JSON:

nauka-angularjs

Na jej podstawie możemy stwierdzić, jakie dane o każdym serialu otrzymamy w ramach odpowiedzi z serwera: "id" "original_name" "first_air_date" "origin_country" "poster_path" "popularity" "name" "vote_average" "vote_count"

Dodałem jeszcze alert na wypadek, gdyby nie udało się wykonać połączenia z API. Otrzymane z API dane musimy jeszcze gdzieś przechować. Zadeklarujmy tablicę w obrębie funkcji $scope:

$scope.wyniki = [];

Następnie wykorzystajmy tablicę do zgromadzenia danych z API:

$scope.wyniki = dane.results;

Po tych modyfikacjach plik kontroler.js przedstawia się następująco:

apka.controller(„MojController”, function($scope,$http){
    $scope.kluczApi = "...";  // wstaw swój klucz api - np. d9eb45644e9.....
    $scope.wyniki = [];
    $scope.glowna = function() {
        var dzisiaj = new Date();
        var miesiac = dzisiaj.getFullYear() + “-“ + (“0” + (dzisiaj.getMonth() + 1)).slice(-2) + “-“ + (“0” + dzisiaj.getDate()).slice(-2);
        $http.jsonp("https://api.themoviedb.org/3/discover/tv?first_air_date.gte=" + miesiac + "&sort_by=popularity.desc&api_key=’+$scope.kluczApi+’&callback=JSON_CALLBACK").success(function(dane) {
            $scope.wyniki = dane.results;
        }).error(function(error) {
            alert("Houston, mamy problem z uzyskaniem danych.");
        });
    };
});

Wyświetlamy pobrane dane

Czas wyświetlić informacje o serialach w naszej aplikacji. Wracamy do pliku html i dodajemy atrybut ng-init z nazwą naszej głównej funkcji do div.container. W ten sposób upewniamy się, że ta funkcja będzie wywołana jako pierwsza z naszej angularnej aplikacji po wyświetleniu strony. W elemenciediv.container’ powinieneś mieć odwołanie do naszej testowej zmiennej{{mojtekst}}`. Usuń więc je.

<div class="container" ng-app='PremierySeriali' ng-controller='MojController' ng-init='glowna()'>
    {{mojtekst}}  <!--- <-kasujemy -->
</div>

Teraz bierzemy się za wyświetlenie danych na naszej stronie. Skorzystamy z dyrektywy ng-repeat, która pozwoli nam dynamicznie wyświetlić zawartość danych w tablicy wyniki[] jako np. listę. Gotowy kod wygląda tak:

<div class="container" ng-app='PremierySeriali' ng-controller='MojController' ng-init='glowna()' >
    <div class="row">
        <div class="col-md-2" ng-repeat='serial in wyniki'>
        <h2>{{serial.original_name}}</h2>
        </div>
    </div>
</div>

Po uruchomieniu w przeglądarce, otrzymujemy listę serialowych premier miesiąca. W moim przypadku wygląda tak:

jak-stworzyc-projekt-w-angularjs

Zanim dodamy nowe funkcjonalności, ubierzmy naszą aplikację w estetyczne wdzianko. Najlepiej sprawdzi się Boostrap, popularny framework, umożliwiający szybkie tworzenie projektów stron, także responsywnych. Pobieramy Bootstrapa i dodajemy go do naszej strony, tworząc także prosty szablon za pomocą obecnych w Bootstrapie gotowych modułów. Nie będę się rozwodził nad nimi w szczegółach w tym tutorialu, wszak skupiamy się tu na AngularJS.

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Kurs AngularJS</title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
    <script src="aplikacja.js" type="text/javascript"></script> <!-- aplikacja angularJS -->
    <script src="kontroler.js" type="text/javascript"></script> <!-- glowny controller przypisany do aplikacji AngularJS -->

    <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"><!-- bootstrap -->
    <link rel="stylesheet" type="text/js" href="css/bootstrap.min.js"><!-- bootstrap -->

</head>
<body>

    <div class="navbar navbar-inverse" role="navigation">
        <div class="container">
            <div class="navbar-header">
              <a class="navbar-brand" href="#">Serialowe nowości</a>
            </div>
        </div>
    </div>

    <div class="container" ng-app='PremierySeriali' ng-controller='MojController' ng-init='glowna()' >
        <div class="row">
            <div class="col-md-2" ng-repeat='serial in wyniki'>
                <img ng-show="serial.poster_path != null" src="https://image.tmdb.org/t/p/w185{{serial.poster_path}}" style="height:272px" />
                <img ng-show="serial.poster_path == null" src="images/brak-postera.jpg" />
                <h2>{{serial.original_name}}</h2>
            </div>
        </div>
    </div>
</body>
</html>

Ponadto, posługując się zmienną serial.poster_path możemy wyświetlić plakat do każdego serialu. Jeśli plakatu nie ma w otrzymanym z API zestawie danych, wyświetlamy informującą o tym grafikę. Odpowiada za to dyrektywa ng-show, która sprawdza, czy serial.poster_path istnieje, a następnie wyświetla stosowny <img>. Drobnym kłopotem jest fakt, że plakaty niektórych seriali w bazie themoviedb.org mają większą wysokość od pozostałych, co czasem może powodować rozjeżdzanie się naszej aplikacji, która wyświetla seriale w formie siatki. Rozwiązaniem jest utrzymanie stałego rozmiaru plakatów za pomocą atrybutu style="height:272px dla tagu img.

Gotowa aplikacja powinna wyglądać mniej więcej w poniższy sposób. Wyświetlane są premierowe seriale w danym miesiącu, a zawartość zmienia się dynamicznie w zależności od tego, jaki aktualnie mamy miesiąc – bazując na danych z API serwisu themoviedb.org.

tutorial-angularjs-od-podstaw

Jestem ciekaw, jak rozwiniesz swoją aplikację – samo API daje jeszcze sporo możliwości rozbudowy naszej angularnej apki o nowe funkcjonalności. Zachęcam do eksperymentowania – wszyscy wiemy, że to najlepszy sposób na naukę.

10 formuł Excela, dzięki którym wyjdziesz wcześniej z pracy

Nie trać więcej czasu, próbując ręcznie wyliczyć coś w Microsoft Excel. Poznaj efektywne sposoby korzystania z bogatej kolekcji formuł w Excelu, które nie tylko znacząco zredukują czas, jaki spędzasz na dłubaniu w skoroszytach, ale także poprawią dokładność Twoich wyliczeń i raportów. A Ty nie będziesz zostawać w biurze po godzinach.

Formuły Excela, które musisz znać

1. SUMA Przykład: SUMA(2,3) lub SUMA(A1, B1) lub SUMA(A1:A12) Formuła SUMA robi dokładnie to, czego możemy się spodziewać po jej nazwie – pozwala dodać (zsumować) dwie lub więcej liczb. Możemy sumować konkretne liczby (podając je jako argumenty w nawiasie) lub użyć oznaczeń komórek w arkuszu do zsumowania wartości, jakie się w nich znajdują. Możemy też zsumować zakres komórek, wtedy oddzielamy nazwy komórek dwukropkiem (jak w trzecim przykładzie powyżej). 2. ILE.LICZB Przykład: =ILE.LICZB(A1:A11) Wynikiem tej funkcji jest liczba komorek z zaznaczonego zakresu, ktore zawierają wartości numeryczne. kurs_excel_funkcja-licz Zdjęcie powyżej demonstruje działanie funkcji ILE.LICZ. Zauważ, że wynik wynosi 10, a zaznaczony obszar ma 11 komórek. To dlatego, że w jednej z komórek znajduje się tekst, a nie liczba. 3. ILE.NIEPUSTYCH Przykład: =ILE.NIEPUSTYCH(A1:A10) W odróznieniu od poprzedniej funkcji, ta funkcja zwraca liczbę komórek w danym zakresie, w których są jakiekolwiek wartości – bez względu na ich typ. Mogą więc to być zarówno tekst jak i liczby. kurs_excel_funkcja-ile-niepustych 4.DŁ Przykład: =DŁ(A1) Funkcja DŁ podaje liczbę znaków w danej komórce. Uwaga: obejmuje również spacje. kurs_excel_funkcja-dl 5. USUŃ.ZBĘDNE.ODSTĘPY Przykład: =USUŃ.ZBĘDNE.ODSTĘPY (A1) Ta funkcja powoduje usunięcie wszelkich spacji z tekstu w komórce oprócz tych, które rozdzielają poszczególne słowa. Innymi słowy, usuwają spacje z początku lub końca tekstu. Może wydawać się mało przydatne, ale jesli ktoś wyciąga do Excela dane z jakichś baz danych lub innych zestawień, z pewnością spotkał częściej czy rzadziej spotkał się z sytuacją, że wartości miały dodatkowe spacje. Powoduje to potem problemy przy manipulacji takimi danymi np. w instrukcjach IF. kurs_excel_funkcja-usun-zbedne-odstepy W podanym przykładzie dodałem dodatkową spację na końcu zdania „Excel jest cudowny. ”. Dla porównania wstawiłem też funkcję DŁ ktora, jak widzisz, policzyła 20 znaków, natomiast funkcja USUŃ.ZBĘDNE.ODSTĘPY dała wynik 19. 6. LEWY, PRAWY, FRAGMENT.TEKSTU Przykłady: = PRAWY(tekst, liczba znaków), =LEWY(tekst, liczba znaków), =MID(tekst, liczba startowa, liczba znaków). Zamiast “tekst” można oczywiście odwołać się do adresu komórki, która ten tekst zawiera. Wszystkie te funkcje zwracają fragment tekstu tak długi, jaką wartość podaliśmy w „liczba znaków”. Funkcja PRAWY zwraca XX znaków z końca tekstu, LEWY zwraca XX znaków od początku tekstu natomiast FRAGMENT.TEKSTU zwraca XX znaków z wewnątrznej częsci tekstu, podajemy mu miejsce od którego ma zacząć „wycinać” fragment (liczba startowa). kurs_excel_funkcja-prawy-lewy-fragment-tekstu W przykładzie powyżej użyłem PRAWY aby uzyskać ostatnie słowo „cudowny” z tekstu w komórce A1. Jest to po prostu 8 znaków od prawej. Użyłem LEWY aby uzyskać pierwsze słowo „Excel” z tekstu w komórce A1. Jest to po prostu 5 znaków z lewej. Użyłem FRAGMENT.TEKSTU aby uzyskać słowo „jest” ze środka tekstu w komórce A1. Są to po prostu 4 kolejne znaki zaczynając od znaku 7 w tym tekscie.