Blog (39)
Komentarze (405)
Recenzje (0)
@molexorWalczymy z Makrami w Excelu Część 2

Walczymy z Makrami w Excelu Część 2

13.03.2011 15:52, aktualizacja: 14.03.2011 07:00

Witam. Po długiej przerwie zdecydowałem się napisać kolejne kilka słów o makrach w excelu. Zanim przystąpimy do zabawy proponuję żebyś zapoznał się z wcześniejszym tekstem. Podobnie jak wtedy, chciałbym żebyś miał otwarty edytor makr.

Ostatni tekst w tym temacie był tak naprawdę krótkim wprowadzeniem do edycji makr. Dziś podejdziemy do tematu z zupełnie innej strony. Będzie trochę teorii i podstaw programowania. Pozwoli to przejść płynnie do planowanej kolejnej części, gdzie będziemy wykorzystywać zdobytą wiedzę. Choć w tekście piszę o excelu, to  w większości przypadków odnosi się to do VBA w ogóle, a także do skryptów VBS.

Zagłębimy się dziś w wiedzę tajemną dostępną tylko dla nielicznych, opisywaną w mrocznych księgach dla programistów. Nie zejdziemy tak głęboko, żeby ta moc nas porwała, ale będziemy obserwować te magię z daleka. Zapraszam w podróż. :)

Otóż VBA jest kolejnym językiem programowania. Jest dość prosty w swej strukturze i dla początkujących łatwiejszy do nauki niż języki ze składnią zaczerpniętą z C (Java , c++ , php ).

1) Zmienne w makrach

Zmienne w markach są nieodłącznym elementem. Bez nich nie było by możliwe pisanie większości makr, warto, więc myślę powiedzieć troszkę na ich temat.

Charakterystyczną cechą języka VBA jest dynamiczne rozpoznawanie typów danych w trakcie wykonywania programu. Cóż to oznacza?

W językach jak c i c++ każda zmienna musi mieć określony typ. Nie zagłębiając się zbytnio w tematykę: tekst jest tekstem, liczba jest liczbą, obiekt jest obiektem. Niesie to ze sobą pewien ( niewielki) problem: nie można mieszać typów danych. Czyli np. nie możesz dodać do tekstu liczby bo liczba to coś innego niż tekst. A w VBA można! :) W VBA , podobnie, jak np. w php, typ jest rozpoznawany w czasie wykonywania programu, jeśli nie został zadeklarowany. Zmienne mogą być w różnych językach konwertowane w locie, ale dla nas na chwilę obecną ważne jest to że w VBA najczęściej nie musisz deklarować typu zmiennej(dostaje ona typ variant) .

Kolejną charakterystyczną cechą jest brak konieczności deklaracji zmiennych. W innych językach wygląda to tak, że programista zanim wykorzysta zmienną musi „powiedzieć komputerowi”, że taka, a taka litera/wyraz, będzie oznaczała zmienną. W VBA po prostu korzystamy ze zmiennych kiedy tego potrzebujemy.

Jeśli masz doświadczenie w innych językach programowania to wiesz, że czasem nie deklarowanie zmiennych i ich typów prowadzi do bałaganu, a w konsekwencji do błędów. W VBA możesz wymusić konieczność deklarowania zmiennych za pomocą dyrektywy Option Explicit na początku makra

Deklaracja zmiennych może nastąpić w module aplikacji, lub wewnątrz makra/procedury/funkcji. Zmienne deklarujemy za pomocą słówka dim. W modułach możemy deklarować zmienne publiczne (słowem public) i prywatne (słowem private) . Stałe deklarujemy słowem const Przykład wart więcej niż milion słów, więc proszę:


Private d ' tak deklaruje zmienna dostępną w całym module
Const stala = "Bardzo STAŁA STAŁA" ' Tego nie da sie zmienić

Sub zmienne()
Dim x 
    x = "1" ' ta zmienna jest tekstem
    d = 2
    z = x + d ' to byłoby nie możliwe w niektórych językach
    
End Sub

Gdyby w powyższym przykładzie dodać na początku Option Explicit , program poinformowałby nas o błędzie, bo zmienna z nie jest zadeklarowana.

2) Instrukcje sterujące

Instrukcje sterujące to takie instrukcje, które mówią programowi, co ma robić w danym momencie i łamią liniowe wykonywanie programu. Gdy chcemy, żeby program wykonał coś kilka razy użyjemy pętli, a  gdy chcemy żeby zareagował różnie w zależności od jakiegoś warunku wykorzystamy instrukcję warunkową.

Jeśli chcesz podrywać dziewczyny „NA EXCEL MASTERA” to musisz poznać podstawowe instrukcje sterujące ;)

Nie zapisywałem rozpoczęcia i zakończenia procedury. Przykłady należy umieścić pomiędzy linijkami z sub nazwa () a end sub, czyli w środku jakiejś procedury/makra. Będziesz pisał też proste pętle. Łatwo się pomylić, więc jeśli zawiesisz program to wciśnij esc żeby przerwać jego działanie.

1) Pętla FOR

W VBA podstawowa składnia pętli wygląda następująco:


	For x = 0 to 20
		‘Instrukcje  do wykonania pomiędzy tymi znacznikami 
	Next x 

Spróbuj napisać prosta pętle, bo możesz nie wiedzieć, co się dzieje, następnie wciskaj f8 jak długo będziesz chciał śledzić przebieg programu. Dobrze by było gdybyś miał włączony podgląd zmiennych lokalnych. Warto samemu to zobaczyć. Pętla zwiększa o 1 wartość x przy każdym przejściu aż do 20 i wykonuje instrukcje w środku.

Dodatkowo możesz w pętli użyć słowa step N , gdzie N  to liczba, jaka jest dodawana przy każdy kroku. Np.:


	For x = 0 to 20 step 2 
		‘Instrukcje  do wykonania pomiędzy tymi znacznikami 
	Next x 

Będzie zwiększać x o 2 przy każdym przejściu. Liczba ta może być ujemna, Np.:


	For x = 0 to  -20 step 2  step -1
		‘Instrukcje  do wykonania pomiędzy tymi znacznikami 
	Next x 

Będzie zmniejszać wartość x o 1 przy każdym przejściu

2) pętla WHILE

While na nasz język można przetłumaczyć jako "W czasie gdy" lub "podczas gdy". Składnia może wyglądać następująco


x = 0
Do While x < 1000
x = x + 1
Loop

Po polsku zapisalibyśmy Rób to, co w środku dopóki x jest mniejsze niż 1000. Proponuję napisać sobie podobną pętelkę i zobaczyć ( F8) jak ona dział krok po kroku. Zrobione? (Założę się, że nie ;) ) No to ruszamy dalej. Pętla while może wyglądać nieco inaczej:


Do
	‘ instrukcje do wykonania 
Loop While x < 5

Jak widzisz while jest umieszczone nie na początku, ale na końcu pętli. Pokażę, co to oznacza w praktyce na przykładzie: Weźmy taką pętlę


x = 5
Do
    MsgBox "Wykonuję"
Loop While x < 5

Jeśli wykonasz ten fragment kodu zobaczysz okienko z napisem „Wykonuję” Jeśli natomiast wykonamy coś takiego:


Do While x < 5
    MsgBox "Wykonuję"
Loop 

Oczywiście naszym oczom nic się nie pokaże. Dlaczego? Ponieważ miejsce, w którym występuje while jest miejscem gdzie sprawdzany jest warunek. Ponieważ 5 nie jest mniejsze od 5 nie wejdziemy do pętli ani raz.

3) pętla UNTIL

Pętla Untill jest bliźniacza siostrą pętli while Ma identyczną składnie:


x = 0
Do Until x = 5
       x = x + 1
Loop 

i również można umieścić until na końcu pętli. Działanie jest jednak troszkę inne. Jak może już wywnioskować z przykładu, pętla jest wykonywana, dopóki warunek jest niespełniony. W tym wypadku dopóki x nie jest równe 5. Przetestuj działanie tej pętli. Spróbuj wykorzystać jakiś inny warunek. Ważne żebyś umiał rozróżniać pętle while od until.

4) instrukcja warunkowa IF

Jak idzie ci pisanie formuł w excelu? Dobrze? To super! Z If‑em na pewno sobie poradzisz. If to odpowiednik formuły jeżeli. Jeśli warunek jest spełniony to wykonywana jest jakaś instrukcja, lub instrukcje, jeśli nie, to jakieś inne instrukcje. Proste? A składnia? Równie prosta:


If a=b then 
	‘tu instrukcje do wykonania
End if

W powyższym przykładnie, jeżeli warunek nie zostanie spełniony to nie zostanie wykonana żadna instrukcja. Można to łatwo zmienić:


If a=b then 
	‘tu instrukcje do wykonania
Else 
	‘ tu inne instrukcje 
End if

Możemy także sprawdzać więcej niż jeden warunek


If x = 0 Then
    MsgBox "równe zero"
ElseIf x = 1 Then
    MsgBox "równe jeden"
Else
    MsgBox "ani zero ani jeden "
End If

Ponieważ jestem z natury nie ufny i podejrzliwy, myślę, że do tej pory nie zajrzałeś do edytora VBA, kiedy prosiłem żebyś to zrobił. Dostaniesz więc gotowy przykład, zabawkę, na której będziesz mógł przetestować działanie instrukcji if, a przy okazji pętli


Sub zgadula()
Randomize
x = 0
licznikq = 0
zgadywanka = Int((100 * Rnd) + 1)
Do
    x = Val(InputBox("podaj liczbę między 1 a 100", "Zgaduj Zgadula", x))
    licznikq = licznikq + 1
    If x < zgadywanka Then
        MsgBox "podana liczba jest za mała!", vbInformation, "Za Mało!"
    ElseIf x > zgadywanka Then
        MsgBox "podana liczba jest za duża!", vbInformation, "Za dużo!"
    Else
        MsgBox "BRAWO! Zgadłeś za " & licznikq & " razem!"
    End If
Loop Until x = zgadywanka
End Sub

Za którym razem udało się odgadnąć liczbę? Zostaw wiadomość w komentarzu (tylko nie podglądaj w debugerze) :)

5) Case

Case to taka alternatywa dla if. To, co wykonamy ta instrukcję dało by się uzyskać if‑em, ale za pomocą case mniej się napiszemy. Od razu przykład:


x = 1
Select Case x
    Case 1
        MsgBox 1
    Case 2
        MsgBox 2
    Case 3
        MsgBox 3
    Case Else
        MsgBox "Inna"
End Select

Jak widzisz instrukcja case wykonuje podane polecenia w zależności od wartości zmiennej. Tu jest tak mała pułapka. W innych językach zostało by wyświetlone okienko z jedynką, dwójką, trójką, i na koniec „Inna”. Normalnie, by uzyskać taki efekt jak tu, musielibyśmy użyć instrukcji break;. W VBA tak się nie dzieje. Dzięki temu instrukcja case wydaje się prostsza. W rzeczywistości jest mniej elastyczna, ale dla większości zastosowań takie działanie powinno wystarczyć. Typowym zastosowaniem jest wybór menu. Możesz spróbować napisać proste menu, które będzie wykonywać dane czynności w zależności od wybranej liczby.

Nie w poznaniu leży szczęście, lecz w dążeniu do niego (pozdrawiam przy okazji wszystkich Poznaniaków ;) )

Na tym na dzisiaj zakończymy. Ciekawe ilu uparciuchów dotrwało do końca tego wpisu :) Ważne żeby próbować. Nawet jeśli nie wszystko wam wychodzi , to starajcie się pisać w VBA. Po jakimś czasie osiągniecie wprawę. Makra są dla leniwych. Można zautomatyzować naprawdę ogrom zadań, więc jeśli jesteś leniwy to powinieneś nauczyć się wykorzystywać ten język. Jeśli nie macie dość to zapraszam do kolejnej części. Myślę, że dziś poznana wiedza pozwoli nam pomówić o obiektach i wtedy dopiero zacznie się zabawa.

Pozdrawiam!

Wybrane dla Ciebie
Komentarze (11)