Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Walczymy z Makrami w Excelu Część 2

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! 

Komentarze

0 nowych
iluzion   5 #1 13.03.2011 20:05

Wytrwałem;) Przyjemnie się czytało. Mam nadzieję, że redakcja jakoś wynagrodzi tę serię wpisów.

skandyn   9 #2 13.03.2011 20:15

Dobry, praktyczny wpis. Poza tym przydaje się opanować całego Excela, jeśli chce się mieć np. dobrze płatną pracę biurową.

Pozdrawiam.

Mantarak   3 #3 13.03.2011 23:37

Dobra robota. Czekamy na ciąg dalszy.

oprych   12 #4 14.03.2011 09:03

Taki tekstów powinno być jak najwięcej :)

Pozdrawiam

treuer25   6 #5 14.03.2011 11:08

Bardzo dobry wpis, naprawdę należą się Tobie brawa.
kurcze jeśli chodzi o Excela to jestem początkujący, a chciałbym w arkuszu zrobić coś takiego że umieszczam w Arkuszu Button i chciałbym przypisać temu przyciskowi, że po naciśnięciu na niego są losowane liczby dla całego arkusza, przypuszczam że bez VBA się nie obejdzie.

molexor   6 #6 14.03.2011 11:37

@treuer nie wiem gdzie dokładnie masz wpisać te liczby losowe.
Piszesz proste makierko. Fragment

Randomize
liczbalosowa = Int((100 * Rnd) + 1)
następnie widok->paski nrzędzi->formularze ,wybierasz przycisk i wskazujesz makro
Dziekuję za pozytywne komentarze :)

Wolfgar   7 #7 14.03.2011 20:38

@skandyn - Opanowanie excela da nam dużo wolnego czasu w pracy :D Bo zawsze można powiedzieć, że coś wpisujemy ręcznie ;)
Po za tym Boziu daj siły żebym to opanował kiedyś.

przemor25   14 #8 15.03.2011 00:12

Zmotywowałeś mnie do poznania tych makr ;)

PS. pozdro dla Poznaniaków :)

  #9 20.12.2012 19:43

Wielkie dzieki za ten caly kurs, jest mi to bardzo potrzebne na studia, a nie az tak zeby wydac majatek na podreczniki. Zgadlem za 7 razem

  #10 09.09.2014 09:34

Wszystko spoko, tylko dziewczyny też programują. Nie wiem, czy "wyrwę dziewczynę na master Excela"

molexor   6 #11 16.09.2014 22:55

@Masterka Excelka (niezalogowany): prawda :) nie wiem jak jest z chłopakami :) może nie "lecą" ale makra tak czy inaczej się przydają ;) polecam i pozdrawiam :)