1. CEL ĆWICZENIA Celem ćwiczenia jest zapoznanie się z podstawami używania makr w MS Excel oraz składni języka skryptowego VBA (Visal Basic for Application). 2. MATERIAŁ NAUCZANIA Makro w najszerszym znaczeniu jest sekwencją instrukcji automatyzujących niektóre aspekty programu Excel, dzięki czemu można korzystać z niego w bardziej wydajny sposób i ograniczyć liczbę błędów. [1] Podczas rejestrowania makra Rejestrator makr zapisuje wszystkie kroki w postaci kodu języka VBA. Język VBA jest częścią zaawansowanego języka programowania Visual Basic i jest dostępny w większości aplikacji pakietu Office. Umożliwia automatyzowanie procesów zarówno w jednej aplikacji pakietu Office, jak i w kilku różnych aplikacjach. [6] 2.1. Dodawanie karty Deweloper do Wstążki Przed przystąpieniem do pracy z makrami VBA należy dodać do Wstążki kartę o nazwie Deweloper, która zawiera przydatne narzędzia i polecenia dla użytkowników języka VBA. W celu jej wyświetlenia należy wykonać następujące kroki: 1. Kliknąć prawym przyciskiem myszy dowolną kontrolkę na Wstążce i wybrać polecenie Dostosuj Wstążkę z menu podręcznego. Na ekranie pojawi się okno dialogowe Opcje programu Excel z otwartą zakładką Dostosowywanie Wstążki. 2. Na liście z prawej strony okna należy zaznaczyć opcję obok karty Deweloper. 3. Kliknąć przycisk OK, aby powrócić do okna Excela. 2.2. Zapisywanie skoroszytów programu Excel z obsługą makr Jeśli w pliku skoroszytu umieści się co najmniej jedno makro, trzeba temu plikowi nadać rozszerzenie XLSM. Przy pierwszej próbie zapisania skoroszytu z makrami program zaproponuje domyślny format pliku XLSX, który nie obsługuje makr. Jeżeli nie zmieni się formatu pliku na XLSM, Excel wyświetli okno z ostrzeżeniem: W skoroszytach bez obsługi makr nie można zapisywać funkcji Projekt VBA. Należy wówczas kliknąć przycisk Nie, a następnie z listy Zapisz jako typ wybrać opcję Skoroszyt programu Excel z obsługą makr (*.xlsm). 2.3. Typy makr w VBA Makra VBA (zwane też procedurami) można podzielić na dwa rodzaje Sub i Function. Procedura to w uproszczeniu jednostka kodu programu realizująca określone zadanie. Procedurę Sub można traktować jak nowe polecenie, wykonywane przez użytkownika lub inne makro. W skoroszycie programu Excel może znajdować się dowolna liczba procedur Sub. Przykład procedury Sub o nazwie Test, która oblicza prostą sumę, a następnie wyświetla wynik w oknie komunikatu widoczny jest na listingu 2.1. Listing 2.1 Sub Test() Sum = 1 + 1 MsgBox "Wynik działania to: " & Sum Procedury Sub zawsze zaczynają się od słowa kluczowego Sub, nazwy makra (każde makro musi posiadać unikalną nazwę) i pary nawiasów okrągłych. Jeśli procedura nie przyjmuje żadnych argumentów, pozostają one puste. Instrukcja oznacza koniec procedury. Procedura Sub może zostać wykonana na jeden z podanych sposobów: 1
Wybranie polecenia Deweloper/Kod/Makra w celu otwarcia okna dialogowego Makro. Następnie z listy należy wybrać nazwę makra i kliknąć przycisk Uruchom. Okno dialogowe Makro można też wyświetlić za pomocą skrótu Alt+F8. Zastosowanie skrótu klawiaturowego przypisanego procedurze (jeśli taki istnieje). Kliknięcie przycisku albo kształtu, do którego przypisane zostało makro. Otwarcie okna Microsoft Visual Basic, umieszczenie kursora w dowolnym miejscu kodu źródłowego i naciśnięcie klawisza F5. Wykonanie procedury przez wywołanie jej z poziomu innej procedury języka VBA. [2] Drugim typem procedury VBA jest Function. Funkcja zawsze zwraca konkretną wartość (podobnie jest w przypadku funkcji arkusza). Funkcja języka VBA może zostać wykonana przez inne procedury lub zastosowana w formułach zdefiniowanych w arkuszach, podobnie jak w przypadku wbudowanych funkcji programu Excel. Przykład prostej funkcji o nazwie AddTwo widoczny jest na listingu 2.2. Listing 2.2 Function AddTwo(arg1, arg2) AddTwo = arg1 + arg2 End Function Funkcja o nazwie AddTwo wymaga podania dwóch argumentów i oblicza ich sumę. Procedura Function jest bardzo podobna do procedury Sub. Należy jednak zauważyć, że procedura Function zaczyna się od słowa kluczowego Function, natomiast kończy instrukcją End Function. [2] 2.4. Rejestrowanie makra Przykład 2.1. Tworzenie przykładowego makra Otwórz program MS Excel, zapisz plik w swoim katalogu pod nazwą lab7.xlsx Na karcie Deweloper w grupie Kod wybierz opcję Zarejestruj marko Zmień nazwę makra na Miasto i wybierz klawisz skrótu na Ctrl+a i zatwierdź OK rozpoczął się tryb nagrywania makra. W komórce A1 wpisz napis Miasto, potwierdź wpisany napis myszką na pasku formuły (Rys.2.2). Następnie wybierz opcję Zatrzymaj rejestrowanie Rys. 2.1. Rejestrowanie makra Ustaw kursor w komórce A2 i użyj skrótu Ctrl+a Operacje, które zostały dokonane w trakcie nagrywania makra zostały spisane w postać pewnego kodu, opisującego dane procedury. Ten kod jest elementem Visual Basic for Applications. Spójrz teraz na nagrane makro od wewnątrz, czyli na kod źródłowy. W tym celu należy przejść do konsoli VBA Rys. 2.2. Rejestrowanie makra cd. Przejdź do konsoli VBA za pomocą kombinacji klawiszy Alt+F11 i kliknij na znak + przy Modules i dwukrotnie na Module1 Zmień napis Miasto na Miasto Lublin (Rys.2.3) i ponownie uruchom makro w nowej wybranej komórce arkusza. 2
Rys. 2.3. Edycja makra w konsoli VBA Jak widać na przykładowym listingu (Rys.2.3), po Sub Miasto() znajduje się szereg zielonych komend, poprzedzonych apostrofem ( ). Znak ten stwarza komentarze w VBA. Każda komenda/zdanie poprzedzone znakiem apostrofu nie zostanie wzięte pod uwagę przy uruchamianiu makra. Komentarze można dodawać w każdej wolnej linii, ale również w tej samej linii, w której jest polecenie, ale bezpośrednio po tym poleceniu. Przykład 2.2. Napisz makro które zmienia format liczb tak, aby były wyświetlane bez miejsc dziesiętnych i używały separatora (spacji) co trzy cyfry. Dodaj nowy arkusz do skoroszytu i przepisz dane zgodnie z Rys.2.4 Jako aktywną komórkę ustaw jedną z komórek zawierających liczby wymagające sformatowania, a następnie zarejestruj makro pod nazwą Format i ustaw klawisz skrótu na Ctrl+z Sformatuj liczbę w komórce B4 - bez Rys. 2.4. Dane do Przykładu 2.2 miejsc dziesiętnych, z użyciem separatora 1000 Bezpośrednio po kliknięciu OK w oknie Formatowanie komórek, zatrzymaj rejestrowanie makra Korzystając z gotowego makra (używając skrótu klawiaturowego) zmień format w całym arkuszu w pozostałych komórkach z wartościami liczbowymi Przykład 2.3. Zarejestruj makro, które wstawia wykres kolumnowy dla danych za rok 2015 z Przykładu 2.2 (zakres komórek A3:B7), a następnie zmodyfikuj makro tak aby było uniwersalne i dawało możliwość wstawiania wykresu dla dowolnego zakresu komórek. Zarejestruj makro pod nazwą Wykres i ustaw klawisz skrótu na Ctrl+x To makro, w przeciwieństwie do poprzedniego nie jest uniwersalne korzysta z adresowania bezwzględnego zaznaczonego zakresu komórek, o czym możemy się przekonać edytując kod makra lub próbując wykorzystać makro do innego zakresu komórek niż to, dla którego makro było rejestrowane (makro wstawia wykres zawsze dla komórek z pierwotnego zakresu) Aby to zmienić należy edytować kod makra. W tym celu wybierz na karcie Deweloper polecenie Makra, a następnie wybierz nagrane przed chwilą makro i kliknij przycisk Edycja Uruchomiony został edytor VBA, w którym znajdują się kody zarejestrowanych dotychczas makr i mamy możliwość poprawienia wadliwego makra. 3
Należy wprowadzić poprawki polegające na usunięciu sztywno osadzonego zakresu komórek adresowanych bezwzględnie (zaznaczone na Rys. 2.5) Rys. 2.4. Widok kodu źródłowego makra z Przykładu 2.3. Należy zmienić parametr Source metody SetSourceData tworzonego wykresu (czyli w języku VBA obiektu ActiveChart). W to miejsce należy wstawić obiekt typu zakres, który też będzie przechowywał adresy zakresu komórek. Z tym, że zakres ten będzie ustalany dynamicznie i będzie go reprezentował obiekt Selection, który w języku VBA reprezentuje bieżące zaznaczenie. Kos źródłowy po uwzględnieniu zmian przyjmie postać: Użyj poprawionego makra do wstawienia wykresu dla komórek z zakresu A3:D7 z Przykładu 2.3. 2.5. Model obiektowy MS Excel Rys. 2.5. Widok kodu źródłowego makra z Przykładu 2.3 po uwzględnieniu zmian Excel bazuje w luźny sposób na idei programowania obiektowego. Obiekt jest pewnego rodzaju pojemnikiem odzwierciedlającym jakiś element Excela. Jest on identyfikowany przez nazwę i zawiera: atrybuty (property), metody (methods) oraz zdarzenia (events). Do obiektów odwołujemy się przez ich atrybuty i metody: Obiekt.identyfikator[.identyfikator] Identyfikator może być metodą, która wykonuje jakieś działanie (dokładnie tak jak procedura lub funkcja). Może też być atrybutem, który jest jakąś zwykłą wartością lub kolejnym obiektem. W ten sposób możemy tworzyć cały łańcuszek, na którego końcu musi być jakiś atrybut lub metoda. [7] Przykładem obiektu Excela jest obiekt Range, który służy do odwołania się w kodzie makra do komórki, zakresu komórek, kolumn i wierszy. 4
Przykład 2.2. Zastosowanie obiektu Range W konsoli VBA utwórz w Module 1 nowe makro o nazwie Dodaj: Sub Dodaj() Range("C3")= Range("A3")+ Range("B3") W arkuszu wpisz do komórek A3 i B3 dowolne wartości liczbowe i wykonaj makro Istnieje również prostsza forma zapisu zmiennej związanej z komórką arkusza kalkulacyjnego. Zamiast np. Range("C3") można też używać zapisu [C3], zatem wcześniejsze makro można zapisać w następujący sposób: Sub Dodaj() [C3] = [A3] + [B3] 2.6. Zmienne w VBA Zmienna odpowiada miejscu w pamięci operacyjnej komputera i przechowuje pewną wartość lub zestaw wartości. Każda zmienna jest identyfikowana przez swoją unikalną nazwę. Zmienna powinna być zadeklarowana. Poprzed deklarację rezerujemy w pamięci komputera miejsce i od teraz do tej części pamięci będziemy się odwoływać poprzez wskazaną przez nas nazwę. Deklaracje zmiennych rozpoczynają się od słowa kluczowego Dim: Dim NazwaZmiennej As Double Deklarując zmienną podajemy jeden z wbudowanych typów Excela. Każdy z typów zajmuje odpowiednią ilość pamięci i jest przeznaczony do przechowywania odpowiedniego typu informacji. VBA udostępnia nam typy zestawion w Tabeli 2.1. [7] Tabela 3.1. Tyby zmiennych wbudowanych w VBA. [7] Typ Rozmiar Opis Zakres wartości Byte 1 bajt Wartości dodatnie 0 do 255 Boolean zależnie Dwie wartości True lub False od systemu Integer 2 bajty wartości całkowite -32,768 do +32,767 Long 4 bajty wartości -2,147,483,648 do +2,147,483,647 całkowite Single 4 bajty Liczby rzeczywiste -3.4e38 do +3.4e38 Double 8 bajtów Liczby rzeczywiste -1.8e308 do +1.8e308 Currency 8 bajtów Liczby rzeczywiste o stałej ilości miejsc po przecinku -922,337,203,685,477.5808 do +922,337,203,685,477.5807 Date 8 bajtów Typ przeznaczony dla dat 1 styczeń 100 to 31 grudzień 9999 Object 4 bajty Wskaźnik na obiekt wskaźnik na dowolny obiekt String zależnie od Zestaw znaków o zmiennej długości Zmienny Do 2 bilionów znaków zawartości Variant 16 bajtów Może przechowywać dowolną z powyższych wartości 5
Przykład 2.3. Napisz makro o nazwie Wynik obliczające wartość wyrażenia 1 a2 ab+b 2 dla wartości a i b 1+ a 2 +ab+b2 znajdujących się odpowiednio w komórkach D1 i F1. Potęgowanie w VBA realizowane jest za pomocą operatora ^. Visual Basic zawsze przeprowadza potęgowania w typie danych Double. Funkcja VBA SQR(Liczba) to odpowiednik funkcji Excela PIERWIASTEK. Wynikiem działania fukncji SQR jest pierwiastek kwadratowy. Argumentem funkcji może być oczywiście tylko liczba nieujemna. Sub Wynik() Dim a As Double, b As Double, c As Double a = [D1] b = [E1] c = (1 - Sqr(a ^ 2 - a * b + b ^ 2)) / (1 + Sqr(a ^ 2 + a * b + b ^ 2)) [F1] = c 3. ĆWICZENIA DO SAMODZIELNEGO WYKONANIA Zadanie 1. Wypełnij komórki z zakresu A1:C10 dowolnymi liczbami. A następnie zarejestruj makro, które ustawi formatowanie liczbowe z 2 miejscami po przecinku w kolumnie A, formatowanie tekstowe w kolumnie B, a formatowanie procentowe w kolumnie C. 4. LITERATURA 1. Walkenbach J., Microsoft Excel 2013 PL, Programowanie w VBA. Vademecum Walkenbacha. Helion 2013 2. Walkenbach J., Excel 2013 PL. Biblia, Helion 2013 3. Wrotek W., VBA dla Excela 2016 PL, Helion 2016 4. Wrotek W., VBA dla Excela 2016 PL 200 praktycznych przykładów, Helion 2013 5. Ziębakowski T., Programowanie w Excelu w języku VBA, Szczecin 2013 6. https://support.office.com/ 7. http://www.123office.pl/p/kurs-vba.html 6