Kategorie powiązane:

Jak napisać pętlę?

HintMine

Cześć :)

 

Chcesz się dowiedzieć jak sprawić żeby kod wykonywał się wiele razy? Nie wiesz co to jest pętla, iteracja? Jak to stworzyć? Co to jest licznik? Zapraszam do lektury :)

 

W związku z pytaniami które ostatnio otrzymałem, pomyślałem że napiszę kolejnego posta. Tym razem na temat jednego z najważniejszych narzędzi w programowaniu czyli pętli For.

 

Z poniższego posta nauczysz się:

  1. Co to jest pętla For i do czego służy?
  2. Jak stworzyć pętlę For do przeglądania wierszy?
  3. Co to jest licznik i czy zawsze zmienia się on o jeden?
  4. Skąd pętla „wie” ile razy ma się wykonać i jak znaleźć ostatni pełny wiersz?

 

1. co to jest pętla For i do czego służy?

Najprościej mówiąc pętla For to dwie linijki kodu, dzięki którym jesteś w stanie powtórzyć ile tylko chcesz razy wybrany przez Ciebie kawałek programu.

 

Ta prosta definicja często umyka początkującym programistom :) Chodzi mi o to, że jeżeli zaczynasz przygodę z programowaniem nie rzucaj się od razu od pierwszych znaków kodu w wir tworzenia pętli. Pamiętaj że najpierw warto napisać program w jego najprostszej postaci, czyli w takiej, która zadziała raz, dla jednej komórki czy dla jednego wiersza. Potem wystarczy użyć magicznych dwóch linijek żeby zapętlić swój kod i już będzie on działał dla całej kolumny czy zakresu danych.

 

Wiem, że tak „na sucho” moje słowa brzmią dziwnie więc już pokazuję przykład.
Powiedzmy, że chciałbym ocenić kolokwium na podstawie ilości zdobytych przez studentów punktów. Sytuacja przedstawia się tak jak na screenie poniżej:

 

jak stworzyc petle

Jeżeli dopiero zaczynasz przygodę z programowaniem nie daj się nigdy przytłoczyć ilością czynności, które wydaje Ci się masz wykonać. Na początek stwórz kod który będzie działał tylko dla jednej komórki. Czyli powiedzmy coś takiego jak tu:

Warunki w programie zapisałem w leniwy sposób ;) tzn. zamiast pisać:

prościej jest:

a efekt jest ten sam :)

 

Czyli teraz wystarczy tylko zrobić ctrl+c a potem ctrl+v 19ście razy i już mamy ocenionych wszystkich studentów? Teoretycznie tak ale… aż się spociłem na samą myśl że musiałbym zrobić tyle kopiowań i wklejeń… Dzięki pętli można to zrobić znacznie prościej :)

 

2. jak stworzyć pętlę For do przeglądania wierszy?

Jak wspominałem wystarczy napisać 2 dodatkowe linie. Pierwsza z nich zaczyna się słowem For a druga słowem Next. No to jedziemy.

 

Mając program, który działa dla jednej osoby zanim pomyślimy o jakiejkolwiek pętli, zastanawiamy się najpierw co w naszym kodzie trzeba zmienić, żeby zadziałał on dla jednej innej osoby. Czyli nie dla wszystkich od razu ale dla jednej innej. Mój program działa teraz dla Ali czyli co muszę w nim zmienić żeby zadziałał dla np. Franka?

 

Mógłbym go zapisać np. tak:

 

Nie musicie być programistami żeby zobaczyć czym różnią się te 2 programy :) Wystarczy być jako tako dobrym w „znajdź różnicę”. Na wszelki wypadek zaznaczyłem te 2 różnice, o których mówimy na poniższym screenie:

 

petla for

 

Żeby kod działał dla Franka wystarczyło podmienić w programie nr wiersza w Range z 2 na 6 i tyle.

 

Super, przyznacie chyba że jest to na razie bardzo proste a… cały nasz kod jest już prawie gotowy :)

 

3. Co to jest licznik i czy zawsze zmienia się on o jeden?

 

Problem jaki jeszcze musimy rozwiązać to to, że cyfra 2 wpisana w naszym Range niestety sama z siebie nie potrafi się zmienić na 6. Dwójka raz wpisana w kodzie zawsze pozostanie dwójką :/ Musimy zamiast niej wpisać tam coś innego, coś co potrafi się zmieniać…

 

Jeżeli w tym momencie przyszło Wam na myśl „to może wpiszmy tam zmienną” to znaczy, że zaczynacie „czuć” te klocki :)

 

Zmienna nazywa się „zmienna” właśnie dlatego, że… jej zawartość może się zmieniać ;) Czyli czasem możemy tam wrzucić dwójkę, czasem szóstkę itd. To od nas zależy co sobie w tej zmiennej przechowamy.

 

Poprawmy nasz kod tak, żeby zamiast na sztywno wpisanej w Range cyfry wstawić tam zmienną. Żeby tego dokonać musimy najpierw w kodzie taką zmienną stworzyć czyli jak to się mówi zadeklarować. Będzie to wyglądało tak:

 

To as integer na razie możecie pominąć, kiedyś napiszę o tym osobnego posta :)

 

Cały program po zmianach będzie wyglądał tak jak poniżej… ale jeszcze go nie uruchamiaj!!!

 

 

Jeżeli mimo mojego ostrzeżenia uruchomiliście kod (bo ja na Waszym miejscu bym się nie mógł powstrzymać ;) to zobaczycie następujący błąd:

 

tworzenie petli

 

O co tu chodzi?

 

Chodzi o to, że kazaliśmy (w tej żółtej linii) pobrać programowi ilość punktów z komórki B… Ale nie powiedzieliśmy z B ile? Mamy tam wpisane B licznik ale… licznik jest przecież pustą zmienną, nie ma w niej jeszcze wpisanej żadnej wartości ani dwójki ani szóstki ani niczego innego. Czyli tak jakby chcemy odczytać zawartość komórki B zero a takiej komórki nie ma i to powoduje błąd.

 

Zanim uruchomimy nasz program musimy do zmiennej licznik wpisać jakąś wartość. Dopiero tutaj (tutaj czyli nad linią, w której po raz pierwszy użyłem zmiennej licznik) wkracza zaklęcie tworzące pętlę:

 

 

Co to niby znaczy?

 

For rozpoczyna naszą pętlę.
Licznik = 2 oznacza, że na początku wpisujemy do zmiennej licznik wartość 2.
to 6 oznacza, że w zmiennej licznik będą się kolejno wpisywały trójka, czwórka itd. aż do 6 włącznie.

 

A jak to się stanie że zawartość zmiennej licznik będzie się zmieniać?
Odpowiedź jest prosta sprawi to magia (oraz słówko Next ;)

 

OK ok ale… czemu zrobiliśmy pętlę tylko do 6 skoro mamy 19stu studentów?

 

Już wyjaśniam :) Pamiętajcie co mówi stare przysłowie pszczół? Małe kroczki to podstawa.

 

Najpierw chcę mieć w kodzie pętlę która działa od 2 do 6 wiersza bo łatwiej jest taką krótką pętlę przetestować wykonując kod krokowo (F8). Dzięki temu widzimy jak program linia po linii się wykonuje i łatwo wychwycić ewentualne pomyłki. Potem rozwiniemy nasz kod tak, żeby pętla sama sobie sprawdzała ilu mamy studentów (tj. ile mamy wypełnionych wierszy) i żeby wykonywała się tyle razy ile trzeba :)

 

Ok no to kolejne pytanie, mianowicie skąd pętla wie kiedy licznik ma się zmienić z dwa na trzy, z trzy na cztery i jak to się w ogóle dzieje? (wiadomo to nie magia ale może ma to coś wspólnego z mocą Jedi? ;) )

 

Dzieje się tak ponieważ działa drugie słowo tworzące naszą pętlę (a tak naprawdę domykające pętlę) czyli Next.

 

Next piszemy na dole naszego kodu (po ostatniej linii, w której używałem zmiennej licznik). Dobrą praktyką przy tworzeniu pętli jest pisanie Next licznik czyli obok słowa Next piszemy nazwę zmiennej którą to polecenie Next nam zwiększa. Na razie może się to Wam wydawać niepotrzebne ale uwierzcie mi kiedyś przy zagnieżdżeniach pętli bardzo Wam się to przyda :)

 

Gdy program dojdzie do słowa Next dzieją się 2 rzeczy:
1. zawartość zmiennej licznik zwiększa się o 1 (bo takie jest ustawienie domyślne w VBA ale oczywiście można to zmienić)
2. kod „wraca” do słowa For, które sprawdza czy ta nowa wartość licznika nie jest przypadkiem większa niż 6. Jeżeli zawartość zmiennej licznik jest mniejsza lub równa 6 to kod wchodzi do pętli czyli wykonuje zawarty między słowami For…. Next kod. Ale jeżeli wartość zmiennej licznik będzie = 7 to kod „wyskoczy” poza Next czyli do frazy End Sub i program się zakończy.

 

Podsumowując wszystkie powyższe informacje nasz program powinien teraz wyglądać następująco:

 

Mamy gotowy program z pętlą :) Teraz trzeba go tylko trochę wygładzić.

 

4. Skąd pętla „wie” ile razy ma się wykonać i jak znaleźć ostatni pełny wiersz?

Nasz kodzik, ocenia tylko pierwszych 5 studentów (wiersze od 2 do 6).

 

W jaki sposób możemy go poprawić żeby działał tyle razy ile trzeba? Teoretycznie wystarczyłoby w linii która rozpoczyna nasza pętlę czyli For licznik = 2 to 6 zamiast 6 wpisać 19 i po sprawie…

 

Ale my chcemy napisać program, który sam sobie sprawdzi ile jest wypełnionych wierszy w kolumnie A (lub B) i tą wyliczoną wartość wstawi w linii z For zamiast naszej 6stki :)

 

Jak w Excelu wyliczyć ostatni wypełniony wiersz? Jest na to kilka sposobów (w sumie to jest ich tyle, że starczyłoby materiału na kolejnego posta). Na razie podam Wam więc taki, który można najłatwiej nagrać za pomocą rejestratora makr. Czyli ctrl+strzałka.

 

Znacie na pewno tą funkcjonalność w Excelu, że po naciśnięciu ctrl i strzałki w którąś stronę, Excel przenosi was do ostatniej komórki w zapełnionym zakresie. Czyli ctrl+strzałka_w_dół przeniesie Was do ostatniej wypełnionej komórki w dół itd. Ok w takim razie my się zajmiemy… ctrl+strzałka_w_górę :)

 

Czemu w strzałka w górę a nie w dół? Już odpowiadam.

 

W sytuacji, w której mielibyście w waszej kolumnie jakąś pustą komórkę ctrl+strzałka_w_dół przeniesie Was tylko do miejsca nad tą pustą komórką a nie do naprawdę ostatniej wypełnionej komórki w zakresie…
Jeżeli natomiast ustawicie się w ostatniej komórce kolumny np. A (czyli w A1048576) a następnie naciśniecie ctrl+strzałka_w_górę Excel przeniesie Was do ostatniej wypełnionej komórki w kolumnie A bez względu na to ile kolumna zawiera pustych komórek pomiędzy.

 

Czyli jak to trzeba krok po kroku zrobić? :)
• Ustawiamy się w komórce A1048576
• Włączamy rejestrator makr
• Nie wpisujemy żadnej nazwy makra ani skrótu klawiszowego, tylko klikamy OK.
• Naciskamy ctrl+strzałka_w_gore
• Zatrzymujemy rejestrowanie makr.

 

Kod który się nagrał nie jest tym co finalnie chcielibyśmy uzyskać bo wygląda tak:

 

To nie jest do końca to, czego potrzebujmy czytam więc nagrany kod od lewej do prawej i poprawiam to co trzeba poprawić.

 

  1. Zamiast słowa selection wpisuję Range(”A1048576”)
  2. Klauzula end(xlup) zostaje bo to jest ta nasza ctrl+strzałka_w_górę
  3. Na koniec zamiast .select wpisuję .row ponieważ nie chcę zaznaczać komórki (select) tylko poznać nr jej wiersza (row).

 

Brzmi to wszystko trochę skomplikowanie ale to kwestia przyzwyczajenia :) Czyli nasza linia wyliczająca nr ostatniego zapełnionego wiersza wygląda tak (Pamiętajcie to jest end(xLup) czyli L nie 1 jak czasem może się wydawać.):

 

 

Obiecuję, że kiedyś napiszę całego osobnego posta o wyliczaniu ostatniego pełnego wiersza gdzie to wszystko dokładnie powyjaśniam ale na razie przyjmijmy taką strategię jak użyjecie powyższej linii w 300 swoich programach (kopiując ją i wklejając) to zobaczycie, że za 301 razem palce same ją już napiszą ;)

 

Ok mamy już wyliczony nr ostatniego pełnego wiersza, wygodnie będzie go przypisać do jakiejś zmiennej np.: ostatni_wiersz czyli nasza linia kodu mogłaby wyglądać tak:

 

A cały program oceniający wszystkich studentów będzie wyglądał tak:

 

O pętlach można by jeszcze pisać i pisać bo sam For ma jeszcze wiele ciekawych opcji np:

  • ustawianie o jaką wartość polecenie Next zmieni licznik (bo nie zawsze musi to być 1)
  • puszczanie pętli „od dołu” (czyli np. od 6 do 1)
  • tworzenie pętli w poziomie (czyli zamiast zmieniać nr wiersza zmieniamy kolumnę)
  • oprócz pętli For jest jeszcze kilka innych…

 

Ale nie chcę przedłużać tego posta w nieskończoność :) miało być prosto i przyjemnie i mam nadzieję, że tak wyszło. Jak się Wam spodoba to dopiszę w wolnej chwili kolejne rozdziały a na razie kodujcie, kodujcie i jeszcze raz kodujcie :)

 

Pozdrawiam
Michał

Powrót do:
Blog VBA | Podstawy VBA |


Zobacz też: