3. Podstawy programowania w MS EXCEL sz: mia Applications, struktury, MS Excel. 3.1. Wprowadzenie Kolejne edycje pakietów biurowych, aplikacji bazodanowych czy pakietów statystycznych aktualnie, Bardzo szybki zastosowanie e Dlatego jednym z istotnych kom 1 przede wszystkim aplikacj Microsoft Excel 2010. ania Basic (a konkretnie Visual Basic). W pakiecie MS 1 m.in. AutoCAD czy Statistica. 1
podpowiedzi kontekstowe interpretera). Z jednej strony s sów realizowanych w pakiecie MS ci. VBA pozwala bowiem na tworzenie nowych, niestandardowych funkcj Przedstawione w tym rozdziale omówienie zasad tworzenia programów w VBA stanowi z uwagi na ograniczon jedynie bardzo szerokiej literatury tematu (por. np. [Bovey i in. 2010; Bullen i in. 2006; Flanczewski 2012; Walkenbach 2011]). Z opisywanych wiele obszernych, zaawansowania,. 3.2. Makropolecenie makro zapisanych u skryptowym (w wypadku aplikacji MS Office w Visual Basic for Applications). Makropolecenia nie kompilowane, a poszczególne. Makropolecen przetwarzaniem danych. 2
Deweloper, z menu Plik, Opcje i Dostosowywanie e Deweloper. Rys. 3.1 zrzut ekranu programu MS Excel. Deweloper makropoleceniami, a unkt 3.5) oraz a kwestia j jedynie zasygnalizowana w punkcie 3.4.2 w [Bovey i in. 2010; ; Walkenbach 2011]). kreowanie ich od podstaw w edytorze Pierwszy z wymienionych sposobów jest funkcji automatycznego zapisywania kolejno wykonywanych polece utworzenia Deweloper przycisk Zarejestruj makro. Po potwierdzeniu formatowania, dodawanie lub modyfikacja uzyskanego programu przycisk Zatrzymaj rejestrowanie) po wybraniu przycisku Makra. Wskutek jego a rys. 3.2. 3
Rys. 3.2. zrzut ekranu programu MS Excel. przede wszystkim w autom operacji wykonywana jest w odniesieniu do kolejnych obszarów w arkuszu. Otrzymany w ten wykorzystanie automatycznego rejestratora makr jest uzyskania informacji o ich strukturze. nowym oknie po wybraniu opcji lub kombinacji klawiszy Alt-F11. Okno (po lewej stronie) oraz okna kodu (po prawej stronie). Rys. 3.3. Edytor Visual Basic for Applications zrzut ekranu programu MS Excel. 4
anym elemencie struktury projektu w oknie po lewej Makropolecenia przypisane arkuszom (np. Arkusz1- arkuszu. Makropolecenia, które maj, najlepiej definiowa Modules Module1 utworzenie Insert pozycji Module. Dodanie do arkusza kszej liczby zmiany rodzaju (rozszerzenia) pliku, w którym arkusz ten zostanie zapisany. Zapis w Skoroszycie programu Excel (plik z rozszerzeniem.xlsx utworzonego makropolecen Skoroszyt (plik z rozszerzeniem.xlsm) 2. Warto w tym miejscu o powinny one stosowane przekazywane innym osobom uzasadnionych przypadkach. 3.3. Podstawy s i wybrane funkcje wbudowane Zapis gdy zac 2 Starszy format plików (z rozszerzeniem.xls nich. 5
, formatowania komentarze, czyli dodatkowe informacje, 3.3.1. Tworzenie funkcji i procedur procedury 3 wyników. szerzej na ten temat por. punkt 3.5) lub funkcje utworzone podobnie jak procedury funkcji. Pierwsza z nich rozpoczyna Function, natomiast druga od Sub w nawiasie lista argumentów. Lista ta kilka poz 6
, Integer, por. punkt 3.3.2), przy czym deklarowanie jego oznaczone em kluczowym End i powtórzonym, odpowiednio, Function lub Sub. 3.1. Definicja funkcji i procedury Function funkcja (argument_funkcji as Integer) as Integer funkcja = argument_funkcji 'Przypisanie argumentu funkcji jako ' End Function Sub procedura (argument_procedury as Integer) MsgBox argument_procedury ' End Sub Sub procedura_nadrzedna () MsgBox funkcja (111) Call procedura (222) End Sub zasadniczo umieszczan funkcji musi do jej nazwy. W przedstawionym j argumentowi. np. zmiennych. Uruchomienie procedury procedura_nadrzedna 11 równym 222 3 7
procedura_nadrzedna zawsze taki sam. 3.3.2. Zmienne wykorzystywane do przechowywania inf wykonania programu. w programie. liczby dni przeliczeniowych w roku czy drugiej natomiast kodu. wykonywania programu. Dlatego zmienne pozwa tyce zarezerwowanie pewnego fragmentu (tylko w wypadku zmiennych). poszczególnych zmiennych, Integer -32 768 a 32 767), Long -2 147 483 648 a 2 147 483 647, Single (32-bitowa), Double -bitowa), Boolean logiczna prawda True) False), String tekst), Date inne, nieco rzadziej wykorzystywane) u Variant. to 8
zmienne uniwersalne, do których ich innych typów. zmiennej, przyjmowany wówczas jednak z pewnymi ograniczeniami zmienne takie nie pozwala na auto, a ich. kluczowe Dim 4. Zmienne definiowane poza procedurami (funkcjami) Private lub Public. W pierwszym wypadku zmienna jest np. Definicja zmiennej globalnej wyklucza natomiast nadanie tej samej nazwy zmiennej lokalnej. ych 3.2. Definicja zmiennych Option Explicit Private zmienna_globalna1 Public zminna_globalna2 as Date Sub zmienne_i_stala () 4 W ramach p Static. 9
Const stala as Integer = 1 'Definicja Dim zmienna as Double 'Definicja zmiennej rzeczywistej Dim tablica(2) as Integer 'Definicja tablicy dwuelementowej zmienna = 1.234 tablica(1) = 4 tablica(2) = 3 'Inicjacja zmiennych End Sub zmienna = zmienna ^ (stala * (tablica(1) - tablica(2))) MsgBox zmienna Dim, Static, Public lub Private zmiennej, spowoduje jej automatyczne utworzenie. Ta z pozoru bardzo wygodna forma jednak do problemów ze s Option Explicit Nowo zmiennym numerycznym 3.4 nazwie zmienna.234 (w VBA separatorem.234 podniesione [1 (4-3)]. w nawiasie a 10
7) tablicy w poszczególnych wymiarach definiowana jest liczbami naturalnymi, rozdzielonymi przecinkami. Gdy w nawiasie nie zostanie podana szersze omówienie tego przypadku oraz operacji na tablicach przedstawione zostanie w punkcie 3.3.4. G referencja do oryginalnej zmiennej. W pierwszej sytuacji przed ByVal w momencie uruchomienia nowej procedury tworzona jest nowa zmienna lokalna, a zmienna, ByRef. Ten kluczowych ByVal i ByRef ByRef. 3.3. Pr Sub przekazanie_byval (ByVal zmienna) zmienna = zmienna + 1 'zdefiniowanej tylko w procedurze 'przekazanie_byval End Sub Sub przekazanie_byref (ByRef zmienna) zmienna = zmienna + 1 'z procedury przekazanie_zmiennej End Sub Sub przekazanie_zmiennej() Dim zmienna zmienna = 1 Call przekazanie_byval(zmienna) MsgBox CStr(zmienna) 11
End Sub Call przekazanie_byref(zmienna) MsgBox CStr(zmienna) przekazanie_byval zmiennej zmienna wykonaniu procedury przekazanie_byref jej CStr, szersze m.in. w [Bovey i in. 2010, s. 66-67; Walkenbach 2011, s. 951]). 3.3.3. instrukcje warunkowe i instrukcje wyboru ie sposobu wykonania programu 4 If warune True Then. Else lub End If (gdy Else ). If Else, a End If 5 Else End If. Jako warunek (True False 5 Else ElseIf Then 3.8). 12
4 sprawdza, czy wprowadzona przez (instrukcja InputBox odpowiedz) jest równa 1. 3.4. Instrukcje warunkowe i wyboru Sub instrukcja_warunkowa() odpowiedz = InputBox("P ") If odpowiedz = 1 Then Else MsgBox "Inna w End If End Sub Sub instrukcja_wyboru() odpowiedz = InputBox("P okna", "1") Select Case odpowiedz Case 1: MsgBox " 1", vbokcancel, Case 2, 3 MsgBox (" 2 lub 3") Case 4 to 8, vbokonly Case Is >= 9, vbyesno Case Else: MsgBox " " End Select End Sub, i przypisaniu po Instrukcja wyboru Select Case 13
rozpoczy Case i przedstawiono 4 instrukcji pojedynczej ). W razie Case Case Else (blok ten jest opcjonalny, tak jak Else w instrukcji warunkowej). 4 [Walkenbach 2010, s. 408-415] lub w dokumentacji msdn.microsoft.com; ). licznikowe, 5 For wskazanie zmiennej licznikowej (w tym wypadku i Step oznacza, obiektu w pewnej kolekcji (zbiorze) petla_for_each 3.4. np. do analizy wskazanego fragmentu arkusza (np. zsumowania For oraz For Each wyznaczony jest przez Next oraz 14
3.5. Sub petla_for() Dim suma, i as Integer suma = 0 For i = 0 To 10 Step 2 ' suma = suma + i Next i MsgBox suma End Sub Sub petla_for_each() Dim komorka, zakres_komorek as Range Set zakres_komorek = Range("A1:B3") For Each komorka In zakres_komorek MsgBox komorka.value ' Next komorka End Sub Sub petla_do() Dim wartosc as Integer wartosc = 3 Do Until wartosc = 0 wartosc = wartosc 1 ' Loop Do While wartosc < 3 wartosc = wartosc + 1 ' Loop End Sub Do Until rze petla_do 5 wartosc Do While wartosc 15
Do Until i Do While Loop. 5 For skomplikowane, co znacznie 3.3.4. danych Z niektórymi typami danych opisanymi w punkcie 3.3.2 czne metody ich ularniejszych typów danych. przedstawione w p zie 3.6. Obok wyszukiwanie wskazanego porównywania vbbinarycompare oznacza porównywanie znak po ny sposób, vbtextcompare, Sposób na w funkcji Replace inny., jest Val. U ona 3.10). 3.6. Sub zmienne_tekstowe() Dim tekst As String tekst = "1234567890" MsgBox Len(tekst) 16
MsgBox Left(tekst, 2) 'Pierwsze dwa znaki MsgBox Right(tekst, 2) 'Ostatnie dwa znaki MsgBox Mid(tekst, 2, 3) ' MsgBox InStr(1, tekst, "234", vbbinarycompare) ' MsgBox Val(tekst) ' MsgBox Replace(tekst, "123", "321",,, vbtextcompare) 'Zamiana fragmentu "123" na "321" End Sub Nie w programach VBA zmienne tablicowe. S one jednym z podstawowych miejsc przechowywania danych iarowe ym ich Sposób definiowania tablic W.7 pokaz natomiast operacje na tablicach. W procedurze definicja_tablicy Procedura zmiana_rozmiaru_tablicy ilustruje natomiast wykorzystanie tablicy, której rozmiar nie zmieniany ReDim Preserve wykorzystane w tej definicji oznacza, zmiana_rozmiaru_tablicy pokazuje For Each do analizy tablicy, której rozmiar jest nieznany 3.7. Operacje na tablicach 17
Sub definicja_tablicy() Dim i, j as Integer Dim tablica(12, 12) As Integer For i = 1 To 12 For j = 1 To 12 tablica(i, j) = i * j Next j Next i MsgBox tablica(2, 8) End Sub Sub zmiana_rozmiaru_tablicy() Dim i as Integer Dim tablica() As Integer For i = 0 To 9 ReDim Preserve tablica(i) As Integer tablica(i) = i Next i Dim wartosc as Variant For Each wartosc In tablica MsgBox wartosc Next wartosc End Sub 3.3.5. Dobre praktyki w programowaniu ia instrukcje ego modyfikowania zarówno przez autora, jak i inne osoby. Podstawowy element jasnego i dobrze przygotowanego kodu sta. one opisami, 18
, (ich format, znaczenie). Opisane powinny szczególnie istotne lub skomplikowane fragmenty kodu jakie ewentualnie ograniczenia ich nie do zakresu czy typu danych). (funkcje) 6 programu MS Excel, ale ówczas poszczegól finansowych, lub gdy tekst programu jest problematyczne. nadawania nazw Nazwy te powinny lub znaczenie e). N, które nic nie p.) nazwy opisowe, wyrazów. Na nazwa_funkcji; sposób ten stosowania dodatk litery (np. NazwaFunkcji lub nazwafunkcji)., jest o kodu. tekstu (im, 6 19
3.4. Model obiektowy programu MS Excel 3.4.1. Wybrane obiekty kalkulacyjny. arówno do funkcji, jak i do danych przechowywanych w arkuszu jest zdefiniowanym w nim obiektom. klas obiektów, z zaw ojedyncza komórka jest w pewien sposób sformatowana (np. nie). Wszystkie te informacje (m.in. ) zmiennych obiektów owywane dane oraz sposób zachowania np. model obiektowy definiuje ich wyznacza klasy instancje obiektu (lub w skrócie obiekty, czyli np. poszczególne komórki w arkuszu), biektów olekcje obiekt Application kolekcja Workbooks ekty klasy Workbook, w której Workbook (czyli 20
skoroszyt Worksheets klasy Worksheet obiektu Worksheet Range komórek. Ze wzg skoncentrowana zostanie przede wszystkim na Range (szersze np. w [Walkenbach 2011, s. 192-194]). Rys. 3.4. Object Browser w edytorze VBA zrzut ekranu programu MS Excel. (Object Browser) w edytorze VBA, uruchamianej klawiszem F2. Na rys. 3.4 przedstawiony Range. przedstawione w kolejnym punkcie. 21
Rys. 3.5 zrzut ekranu programu MS Excel. na temat w vbokcancel, vbokonly oraz vbyesno kolekcji vbmsgboxstyle por. rys. liczbowa (np. vbyesno Jednak o 3.4.2. Praca ze zmiennymi obiektowymi Podstawowe obiekty (instancje obiektów),, skoroszytów, arkuszy itd., czy otwarcia pliku. instancji. N istnieje jednak zmiennych obiektowych, które wykorzystywane w konkretnym makropoleceniu 7. Tworzenie zmiennej obiektowej dokonywane Dim, co powoduje przypisanie do Set. 7 2010]. 22
3.8. Operacje na zmiennych obiektowych Sub koloruj_min_max() Dim zakres_arkusza As Range Dim maksimum, minimum As Double Set zakres_arkusza = Application.InputBox("Zaznacz zakres", _ "Wybór zakresu",,,,,, 8) maksimum = WorksheetFunction.Max(zakres_arkusza) minimum = WorksheetFunction.Min(zakres_arkusza) For Each komorka_arkusza In zakres_arkusza If komorka_arkusza.value = maksimum Then komorka_arkusza.interior.color = RGB(255, 0, 0) ElseIf komorka_arkusza.value = minimum Then komorka_arkusza.interior.color = RGB(0, 255, 0) Else komorka_arkusza.interior.color = xlnone End If Next komorka_arkusza End Sub Przedstawiona wskazanie (zaznaczenie) zakresu w arkuszu. Funkcja InputBox, wykorzystywana (w przy ) do wprowadzania danych, element. Z ona tutaj tu Application o tej samej nazwie (dlatego nazwa obiektu). Wykorzystanie metody Application.InputBox WorksheetFunction. W obiekcie tym zdefiniowane metody minimaln oraz maksymaln w zaznaczonym aksymalnej minimalnej przechowywanych w komórkach ów ych 23
do klasy Range obiektu Range Color Interior Range. Ustalenie skorzystano z funkcji RGB, która zwraca kolor na podstawie trzech odpowiednio czerwonej, zielonej i niebieskiej. funkcji (oraz innych metod ) np. w [Walkenbach 2011]. innych obiektó, Pozwala to z aplikacjami pakietu MS Office, z innymi aplikacjami umo 3.9. Wykorzystanie obiektów innych aplikacji Sub zapis_do_msword() Set objword = CreateObject("Word.Application") objword.visible = True Set objdoc = objword.documents.add() Set objselection = objword.selection objselection.font.name = "Arial" objselection.font.size = "18" objselection.typetext "!" objselection.typeparagraph ' ' ' ' objdoc.saved = True ' objword.quit 24
' End Sub Set objword = Nothing program MS Word z poziomu makropolecenia zdefiniowanego w programie MS Excel. W pierwszym kroku funkcja CreateObject, której argument wskazuje na obiektu, jaki ma Uruchomiony w ten sposób o w kolejnym kroku Visible True., objword.documents.add(), dodawany jest nowy element do kolekcji Documents. W tak utworzonym nowym dokumencie programu MS Word wpisywany jest tekst Wi ragment programu, zapisany jako komentarz,. N to blok ten czasowo 3.5. Tworzenie formularzy 3.5.1. Formularze definiowane w arkuszu ch oknach dialogowych uruchamianych z poziomu VBA. przynajmniej na podstawowym poziomie nie jest wymagane tworzenie programów w VBA., Deweloper Wstaw i odpowiedni formant (Formanty formularza Formanty ActiveX). 25
Rys. 3.6. Prz zrzut ekranu programu MS Excel. Formantów ActiveX przycisk opcji (Radio Button) do wyboru statusu klienta, pola nazwisko i adres e-mail), pole kombi (ComboBox) do wskazania preferowanego sposobu kontaktu oraz pole wyboru (CheckBox) do deklaracji zgody na przetwarzanie danych. formantami typu etykieta (Label). Formatowanie oraz formantu i wybranie przycisku (por. rys. 3.7; projektowania por. przycisk Deweloper). Rys. 3.7 zrzut ekranu programu MS Excel. 26
Caption, k, oraz LinkedCell, gdzie tej kontrolki (wprowadzony tekst, informacja o zaznaczeniu opcji itp.). przycisk wprowadzone informacje do baz e-mail. 3.5.2. Formularze (UserForms, Insert UserForm. lewej strony ekranu. Dodawanie formantów do formularza jest 8), View Toolbox. Rys. 3.8 zrzut ekranu programu MS Excel. 9. Analogicznie jak w wypadku formularzy w arkuszu, Properties. 27
Rys. 3.9. Formularz w trakcie edycji zrzut ekranu programu MS Excel. Po dodaniu formantów i ich rozplanowaniu na formularzu konieczne jest przypisanie w arkuszu formant na formularzu tworzy automatycznie. Nazwy tych procedur nazwy formantu (nazwy Name w oknie Properties) oraz nazwy zdarzenia (np. Click, Change) rozdzielonych dolnym pod Podstawowe zdarzenie, dla którego jest zmiana tekstu w tym polu. 28
Rys. 3.10 zrzut ekranu programu MS Excel. zaprezentowanym na rys. 3.10 8 OK (jego nazwa to CommandButton1). opcji (czyli wybór jednego adresu) tylko trzecie pole tekstowe, natomiast trzeci przycisk aktywuje wszystkie pola tekstowe. Zatwierdzenie formularza przyciskiem OK e-mail 9. 8 to Properties GroupName a dla wszystkich przycisków 9 np. w wypadku naczne 29
Rys. 3.11 zrzut ekranu programu MS Excel. W razie potrzeby zdefiniowan por. rys. 3.11, na którym pokazano TextBox (pole y jest obiektów utworzonych w danym projekcie w tym wypadku formularza (UserForm1) oraz formantów zdefiniowanych na tym formularzu. 3.6. pomocna jest wtedy programu w dowolnym momencie. Ustalenie miejsca, w którym wykon na zdefiniowaniu punktów przerwania (Breakpoints). W edytorze VBA n w tym celu na wybranej linii i F9 (lub z menu Debug Toggle breakpoint). W ozn e wykonania procedury, okna 30
Locals i Watches). W jednej procedurze m punktów przerwania. Ustawione punkty klawisz F9. Okno z ustawionym punktem przerwania 3.12 (w trakcie wykonywania programu, po zatrzymaniu w zdefiniowanym punkcie). Rys. 3.12 ie wykonania makropolecenia zrzut ekranu programu MS Excel. e programu po zatrzymaniu w punkcie przerwania, F5 (lub z menu Run Continue). kontynuowane do kolejnego punk wykonywanie programu z menu Run Reset. Locals oraz Watches, e pozycje z menu View wszystkich zmiennych lokalnych. Watches, odpowiednie zm poprzez uruchomienie funkcji Add Watch (lub Edit Watch) z menu Debug. 31
, strukturze programu. np. z 3.10. Dim wynik On Error Resume Next wynik = WorksheetFunction.Ln(0) On Error GoTo 0 wynik = WorksheetFunction.Power(0, 0) End Sub Dim wynik On Error GoTo blad wynik = WorksheetFunction.Power(-1, 0.5) MsgBox wynik Exit Sub blad: End Sub obsluga_bledu_1 róba 32
Druga z zaprezentowanych procedur obsluga_bledu_2 w wypadku blad. J procedury. W przeciwnym wypadku u. 3.7. Podsumowanie Przedstawione w niniejszym rozdziale bardzo ogólnie. Celem bowiem wprowadzenie c programowania w i pokazanie w zarysie lektura ma stano VBA 3.8. Pytania problemowe liczb ze wskazanego zakresu. Warunek maksymalnej). www.algorytm.org/algorytmy-sortowania/sortowanie-babelkowe-bubblesort.html). klient powinien, czy nie. 3.9. Literatura 33
Alexander M., Walkenbach J., Excel., Helion, Gliwice 2013. Bovey R., Wallentin D., Bullen S., Green J., Excel. Programowanie dla profesjonalistów, Helion, Gliwice 2010. Bullen S., Bovey R., Green J., Excel. Programowanie dla profesjonalistów: tajniki tworzenia, Helion, Gliwice 2006. Etheridge D., Programowanie w Excelu 2007 PL, Helion, Gliwice 2009. Flanczewski S., Excel. Tworzenie zaawansowanych aplikacji, Helion, Gliwice 2012. Lewandowski M., VBA dla Excela 2010. Leksykon kieszonkowy, Helion, Gliwice 2011 Visual Basic dla aplikacji w programach Word, PowerPoint i Excel. Praktyczny. McFedries P., Microsoft Office 2007PL., Helion, Gliwice 2008. Roman S., Excel. Makrodefinicje, Helion, Gliwice 2000. Tor A., Excel 2007 Visual Basic, Tortech, Warszawa 2007. Walkenbach J., Excel 2010 PL. Programowanie w VBA, Helion, Gliwice 2011. Wrotek W., VBA dla Excela 2010 PL., Helion, Gliwice 2011. Strona internetowa: http://msdn.microsoft.com (01.09.2013). 34