Metody numeryczne w matematyce nansowej 1 Notatki do wykªadu Mariusz Niew gªowski Faculty of Mathematics and Information Science, Warsaw University of Technology, ul. Koszykowa 75, 00-662 Warszawa, Poland m.nieweglowski@mini.pw.edu.pl March 3, 2016
Chapter 1 VBA 1.1 Excel 2007 Z menu w lewym górnym rogu (Przycisk Pakietu Oce) wybieramy (na dole) Opcje programu Excel i zaznaczamy Poka» kart Deweloper na Wst»ce. Pojawia si wtedy zakªadka Deweloper na której jest przycisk Visual Basic który umo»liwia przej±cie z Excela do VBA. Makra - umo»liwia uruchomienie makra tzn. procedury (niestety tylko takiej która nie ma parametrów) 1.2 Excel 98-2003 Do VB przechodzimy wybieraj c z menu Narzedzia / Makra / Edytor Visual Basic 1.3 Od czego zaczynamy W edytorze VBA po lewej stronie jest okno VBA Project, naciskamy PPM(Prawy Przycisk Myszy) i z menu wybieramy Insert / Module. Na drzewku VBA Project pojawiª si Nowy Pusty Moduª nazwany Module1. Takich Moduªów mo»na doda dowoln ilo± i nada im odpowiednie nazwy stosowanie do zawarto±ci kodu który w nim umie±cimy. W module piszemy kod VB tzn. Funkcje i procedury. Funkcji mo»na u»ywa w innych funkcjach lub bezpo±rednio w Arkuszu (pod warunkiem»e konwersja danych przebiegnie gªadko), natomiast procedury bez argumentów mo»na uruchamia jak programy wciskaj c przycisk Makra na zakªadce Deweloper. Powinni±my zawsze zacz pisa kod w module od Option Explicit bardzo wa»nej dyrektywy dla kompilatora!!! 1
2 1.4 Typy danych 1.4.1 Proste W j zyku VBA s nast puj ce proste typy danych: Byte znak, rozmiar 1B, Boolean zmienna boolowska, rozmiar 2B, Integer liczba caªkowita, rozmiar 2B, Long liczba caªkowita, rozmiar 4B, Single liczba zmiennoprzecinkowa, pojedyncza precyzja, rozmiar 4B, Double liczba zmiennoprzecinkowa, podwójna precyzja, rozmiar 8B. 1.4.2 Zªo»one Date data, rozmiar 8B, String tablica znakow. Operacje na tablicach znaków Š czenie tablic znaków odbywa si za pomoc operatora & Dªugo± tablicy znaków zwraca funkcja Len Funkcje wycinaj ce stringi z innych stringów Mid, Left, Right. Zmienne okre±lonego typu deklarujemy zaczynaj c od sªowa kluczowego Dim nast pnie podajemy nazw zmiennej oraz nazw typu danych poprzedzon sªowem As. Deklaracja zmiennej ma wi c nast puj c posta : Dim nazwa_zmiennej as typ_danych UWAGA!! nazwa_zmiennej nie mo»e sie zaczyna od liczby i nie mo»e zawiera znaków! @ # $ % ^ & * ( )? / \ ' ; : < >,. Przykªad 1. Dim i as Long i jest zmienn calkowita Dim x as Double x jest zmienn zmiennoprzecinkowa
3 1.4.3 Typ wyliczeniowy W VB jest równie» typ wyliczeniowy który denujemy w module zaczynaj c od sªowa kluczowego Enum a ko«czymy End Enum. Przykªad: Enum Dzien_tygodnia Poniedzialek = 1 Wtorek Sroda Czwartek Piatek Sobota Niedziela End Enum Zmienn typu wyliczeniowego deklarujemy nast puj co dim Dzien as Dzien_tygodnia UWAGA: Przed Enum mo»na u»y sªów Public lub Private które okre±laj widoczno± deniowanego typu. Typ Public jest widoczny w innych moduªach, natomiast Private jest widoczny tylko module w którym zostaª zdenowany. 1.4.4 Tablice Tablice w VB mog mie staªy rozmiar lub zmienny (dynamiczny). Tablice o staªej wielko±ci deklarujemy nast puj co: dim Tablica(1 to 10) as typ_danych Tablica jest tutaj tablic zawieraj c 10 elementów o indeksach od 1 do 10. Do elementów tablic odwoªujemy si u»ywaj c () i indeksów np. Tablica(1). UWAGA: Odwoªanie Tablica(0) wygeneruje oczywi±cie bª d w VB. Tablice dynamiczne deklarujemy nast puj co dim Tablica() as typ_danych Nazw tablicy nale»y wtedy traktowa jak wska¹nik do tablicy. Wymiar tablicy nadajemy u»ywaj c sªowa kluczowego redim. Przykªadowo polecenie Redim Tablica(1 to 10)
4 Alokuje pamie dla tablicy zawieraj cej 10 elementów, indeksowanych od 1 do 10. Je»eli typ danych jest liczbowy to Tablica zawiera warto±ci 0. Ponowne u»ycie Redim kasuje zawarto± tablicy. Aby zachowa zawarto± tablicy trzeba u»y sªowa kluczowego Preserve. polecenie Redim Preserve Tablica(1 to 20) Przyªadowo Zwi ksza rozmiar tablicy do 20 elementów zachowuj c warto±ci 10 pierwszych elementów. Tablice mog oczywi±cie by wielowymiarowe. Przykªadowo kod Dim Tablica(1 to 10, 1 to 20) jest deklaracj tablicy dwuwymiarowej. Sprawdzanie wymiarów tablicy: W przypadku tablic dynamicznych cz sto zachodzi potrzeba okre±lenia wymiarów tablicy. Indeksy dolne i górne dla tablicy mo»na sprawdzi u»ywaj c funkcji LBound i UBound. Przykªadowo je»eli zmienili±my rozmiary Tablicy nast puj co ReDim Tablica(1 to 10) to LBound(Tablica) zwróci 1, a UBound(Tablica) zwróci 10. Je»eli tablica jest dwuwymiarowa to trzeba koniecznie okre±li wymiar którego indeksy górne i dolne chcemy pozna. Przykªadowo dla tablicy ReDim Tablica(1 to 10, 1 to 20) LBound(Tablica,1) zwróci 1, a UBound(Tablica,1) zwróci 10, natomiast LBound(Tablica,2) zwróci 1, a UBound(Tablica,2) zwróci 20. UWAGA: W przypdku pomini cia drugiego argumentu funkcje Ubound, Lbound zwróc indeksy górny i dolne dla pierwszego wymiaru czyli np. wywoªuj c funkcj UBound(Tablica) otrzymamy 10, 1.4.5 Struktury Struktury znane z C lub Pascala mo»na w VB zdenowa u»ywaj c sªów kluczowych Type.. End Type nast puj co Type Nazwa_typu Element_1 as nazwa_typu Element_2 as nazwa_typu... End Type Przykªadowo je»eli w module (poza funkcj lub procedur ) napiszemy
5 Type Dane_personalne Imie as String Nazwisko as String Data_ur as Date PESEL as String End Type To b dziemy mogli zadeklarowa zmienn dim MOJE_DANE as Dane_personalne W której polach mo»na zapisa swoje dane personalne. Do elementów struktury odwoªujemy si u»ywaj. i nazwy elementu (pola) struktury. Przykªadowo kod MOJE_DANE.Imie = "Jan" MOJE_DANE.Nazwisko = "Kowalski" MOJE_DANE.Data_ur = #03/03/2010# MOJE_DANE.PESEL = "000000000" Wypeªni elementy struktury Dane_personalne odpowiednimi danymi. UWAGA: W VB jest operator With.. End With który pozwala skróci powy»szy kod, oto przykªad: With MOJE_DANE.Imie = "Jan".Nazwisko = "Kowalski".Data\_ur = #03/03/2010#.PESEL = "000000000" End With 1.4.6 Variant Variant jest bardzo dziwnym typem danych, mo»e by wszystkim. Jego stosowanie jest niezalecane poniewa» dla tego typu jest zajmowane du»o pami ci. Czasami jest jednak bardzo przydatny. 1.5 Funkcje i procedury Programowanie to gªównie pisanie procedur i funkcji. Funkcje mog ale nie musz zwraca warto±ci natomiast Procedury nie mog. Funkcje oparte na typach prostych moga byc wywoªywane/uruchomiane w arkuszu w taki sposób»e zwróc odpowiednie wyniki do arkusza. Pocedury nie mog byc wywoªywane w arkuszu przerz wpisanie nazwy w odowiednie komórki
6 i w ten sposób zwraca wyniki obliczen. Je»eli procedura nie ma argumentów i jest upubliczniona to jest widoczna jako Makro i moze by w ten sposób uruchomiona w arkuszu (Alt+F8 pokazuje list makr). Procedura/Makro mo»e pobra parametry z arkusza i zwróci wyniki do akrusza poprzez obiekt Range. Funkcje denujemy za pomoc sªowa kluczowego function nast puj co (wyra»enia w nawiasach [] s opcjonalne ) [Public Private Friend] [Static] Function name [(arglist)] [As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function Public Private Friend deklaruje zakres widoczno±ci funkcji (opcjonalna). Public widoczne poza moduªem w którym s zdeniowane, Private widoczne tylko w module w którym s zdeniowane, Friend jest u»ywane tylko w klasach. name Nazwa funkcji (obowi zkowe). UWAGA: nazwa_zmiennej nie mo»e sie zaczyna od liczby i nie mo»e zawiera znaków! @ # $ % ^ & * ( )? / \ ' ; : < >,. arglist lista argumentów funkcji (opcjonalne). Argumenty funkcji oddzielamy, tzn. przecinkami. Pojedy«czy argument funkcji ma (w uproszczeniu) posta [ByVal ByRef] varname[( )] As type gdzie ByVal ByRef okre±la sposób przekazywania argumentu (opcjonalne) ByVal oznacza»e argument jest przekazywany przez warto±. ByRef oznacza»e argument jest przekazywany przez referencje. ByRef jest domy±lnym sposobem przkazywania. Tablice mog by tylko przekazywane ByRef. varname nazwa zmiennej (obowi zkowe). ( ) oznaczaj»e argumentem b dzie tablica (opcjonalne). As type okre±la typ argumentu (opcjonalne). type zwracany typ danych (opcjonalne) statements tre± funkcji (opcjonalne) UWAGA: Tre± funkcji jest opcjonalna, ale nie zaleca si pisania funkcji bez tre±ci :).
7 name = expression Tak si zwraca w VB warto±ci funkcji (opcjonalne). UWAGA: Wyra»enie name = expression nie powoduje przerwania dziaªania funkcji, je»eli w dalszej cz ±ci kodu b dzie name = another_expression to zwrócona zostanie warto± wyra»enia another_expression. Powoduje to»e name mo»na traktowa jako zmienn takiej typu jak zwracany typ. Exit Function Powoduje natychmiastowe przerwanie dziaªania funkcji (opcjonalne) Przykªadowa deklaracja funkcji Public function suma(byval a as Double, ByVal b as Double) as Double suma = a + b end function Funkcj wywoªujemy w kodzie nast puj co dim c as Double dim x_1 as Double dim x_2 as Double... x_1 = 1.0 x_2 = 2.0 c = suma(x_1,x_2) Funkcja musi wi c znale¹ si po prawej stronie operatora przypisania, którym jest w VB =. Wyj tek stanowi funkcje które nie zwracaj argumentów np. Public function suma(byval a as Double, _ c = a + b end function ByVal b as Double, _ ByRef c as double) as Double wywoªamy suma (x_1,x_2, c) lub suma x_1,x_2, c
8 Procedury deniujemy przy pomocy sªowa kluczowe Sub. nast puj ca. Deklaracja procedury jest [Private Public Friend] [Static] Sub name [(arglist)] [statements] [Exit Sub] [statements] End Sub Przykªadow procedur Public sub suma(byval a as Double, _ ByVal b as Double, _ ByRef c as double) c = a + b end sub wywoªujemy w kodzie nast puj co suma x_1,x_2, c 1.5.1 Zwracanie Tablic Tablice w VB mo»na zwraca na dwa sposoby przez typ tablicowy: tzn. trzeba zadeklarowac nast puj co. Public function suma_vektorow(byref a() as Double, ByRef b() as Double, _ N as long ) as Double() dim i as long dim wynik() as double Redim wynik(1 to N) for i=1 to N wynik(i) = a(i) + b(i) next i suma_vektorow = wynik end function przez typ Variant: tzn. trzeba zadeklarowac ze funkcja zwraca Variant czyli typ nieokre±lony.
9 Public function suma_vektorow(byref a() as Double, ByRef b() as Double, _ N as long ) as Variant dim i as long dim wynik() as double Redim wynik(1 to N) for i=1 to N wynik(i) = a(i) + b(i) next i suma_vektorow = wynik end function ByRef: deklarujac w parametrach funkcji pewien parametr typu tablica niekreslonych wymiarow. Przykªadow procedur Public sub suma_vektorow(byref a() as Double, ByRef b() as Double, _ dim i as long ByRef c() as Double, ByVal N as long) redim c(1 to N) for i=1 to N c(i) = a(i) + b(i) next i end sub 1.6 Klasy 1.6.1 Dodawanie nowej klasy a. W VBA now klas dodajemy wybieraj c w oknie Projektu z menu pod prawym przyciskiem myszy Insert / Class Module. b. Nazw klasy zmieniamy klikaj c Name w oknie Properties. c. Klasy wykorzystujemy w innych klasach lub w procedurach/funkcjach w moduªach kodu. Pierwszym krokiem jest deklaracja zmiennej typu obiektowego (referencji na obiekt), drugim konstrukcja obiektu danej klasy. Ilustruje to nast puj cy fragment kodu dim mode as codesolver Set mode = New codesolver
10 U»yli±my operatora Set poniewa» tak si w VBA przypisuje zmienne typy obiektowego tzn. sie u»ywuj c operatora Set oraz operatora przypisania. d. U»ycie New powoduje tutaj wywoªanie konstruktor obiektu danej klasy. Programista ma mo»liwo± oprogramowania konstruktora. Dost p do konstruktora i destruktora jest mo»liwy w oknie moduªu klasy. Na górze okna moduªu klasy s dwie listy rozwijane (jedna po lewej a druga po prawej). Zawarto± listy po prawej zale»y od tego co si wybraªo po lewej stronie. Aby pojawiª si nagªówek funkcji konstruktora i destruktora trzeba klasy trzeba z listy rozwijanej po lewej stronie wybra nazw klasy, a nast pnie z listy po prawej Initialize(konstruktor) lub Terminate (destruktor). e. Mo»na te» krócej zadeklarowa referencje Dim mode as New codesolver ale wbrew temu co sie wydaje nie wywoªa si tutaj konstruktor obiektu! Czyli obiekt nie zostanie utworzony. Obiekt zostanie utworzony dopiero w momencie proby pierwszego odwoªania do mode np u»ycia metody, zmiany/odczytania atrybutu. f. Zarz dzanie pami ci : W VBA tzw. Garbage Collector zajmuje sie sprz taniem pami ci po obiektach z którymi stracili±my kontakt. Garbage Collector prowadzi rejestr liczby wskaza«na ka»dy obiekt. Je»eli liczba wskaza«na dany obiekt jest równa zero (tzn. program nie ma kontaktu z obiektem) to wywoªywany jest destruktor i pami zajmowana przez obiekt jako bezu»yteczna jest automatycznie zwalniana. Licznik wskaza«mo»emy zmniejszy czyszcz c referencj na obiekt. Oto przykªad Set mode = Nothing Intrukcja powy»ej nie zawsze wywoªa destruktora obiektu. Jest to zwi zane z tym»e referencja na obiekt mogªa by przekazywana wielokrotnie wi c licznik wskaza«po wykonaniu powy»szej instrukcji mo»e by niezerowy! Ilustracja (troch sztuczna): dim mode as codesolver dim mode_2 as codesolver `Nie zostaje wywoªany konstruktor Set mode = New codesolver `Zostaje wywoªany konstruktor `licznik wskaza«na stworzony obiekt jest = 1 Set mode_2 = mode `tutaj przekazali±my referencje na obiekt `mode i mode_2 s referencjami na ten sam obiekt `licznik wskaza«na obiekt jest = 2
11 Set mode = Nothing `licznik wskaza«na obiekt jest zmniejszony `a wiec = 1. Destruktor obiektu nie zostaje wywoªany Set mode_2 = Nothing `licznik wskaza«na obiekt jest zmniejszony Inny przykªad `a wiec = 0. Destruktor obiektu zostaje wywoªany Public Sub Przyklad() dim mode as codesolver For i=1 to 10000000 Set mode = New codesolver Next i End Sub W tym przykªadzie nie zostanie zaj ta pami na 10000000 obiektów typu codesolver. Jest tak dzieki Garbage Collector'owi który przy ka»dym kolejnym konstruktorze b dzie czy±ciª pamie po uprzednio skonstruowanym obiekcie, gdyz po przypisaniu nie bedzie juz referencji na uprzednio skonstruowany obiekt. Pozostanie tylko jeden obiekt utworzony jako ostatni, który i tak zostanie zniszczony w momencie zako«czenia dzialania procedury 1.6.2 Dodawanie i u»ywanie Metod a. W module klasy mo»emy deklarowa Funkcje i procedury w analogiczny sposób jak w module kodu. b. Funkcje i procedury w module klasy nazywamy metodami klasy. c. Funkcje i procedury (tzn. Metody) mog by publiczne, prywatne i zaprzyja¹nione (Friend). Zaprzyjazione s widoczne we wszystkich modulach klas i kodów w obr bie Projektu, Publiczne udost pniane równie» w innych projektach. Funkcje prywatne nie s udost pniane u»ytkownikom klas (programistom którzy u»ywaj klasy w sensie tworzenia obiektów tej klasy i wywoªywania metod). S natomiast udost pniane programi±cie klasy tzn. programi±cie który zajmuje si zaprogramowaniem klasy jej metod i atrybutów. Przykªadowo je»eli klasa codesolver miaªa Publiczn metode SOLVE_IT, to wywoªuje si j uzywaj c nazwy obiektu, kropki i nazwy metody. Oczywi±cie najpierw dany obiekt musi by stworzony. Oto przykªad kodu
12 Dim mode as New codesolver mode.solve_it 0,1,1,1000, Sol Je»eli klasa codesolver miaªa prywatn metode SOLVE_EULER. To taki fragment kodu nie zadziaªa Dim mode as New codesolver mode.solve_euler 0,1,1,1000, Sol Jest tak dlatego,»e metoda SOLVE_EULER jako prywatna nie jest udost pniana u»ytkownikom klasy codesolver. Czyli metoda SOLVE_EULER jest dost pna w module klasy codesolver. Nale»y wi c deklarowa jako prywatne metody które s pomocniczymi procedurami u»ywanymi wewn trz klasy. 1.6.3 Dodawanie zmiennych i atrybutów a. W kodzie klasy, przed deklaracj pierwszej metody mo»na zadeklarowa zmienne publiczne lub prywatne. Przykªadowo w modelu klasy codesolver mo»na doda nast pujace zmienne Public a as Double Public b as Double Public ya as Double Private ln as Long Private lsol() as Double Wtedy uzytkownik klasy mo»e odczyta /Zmieni tylko warto±ci a,b,ya. Ilustruje to przykªad kodu mode.a = 0 mode.b = 0 mode.ya = 1 Uzytkownik klasy nie mo»e odczyta /zmieni tylko ln czy lsol poniewa» jako przywatne nie s one udost pniane!. b. W kodzie klasy mo»na ponadto dodawa tzw. atrybuty ( Properties). Atrybuty umo»liwiaj zakodowanie akcji wykonywanej przy odczytywaniu i zmianie jego warto±ci. A tak»e zablokowanie mo»liwo±ci zmian pewnej zmiennej. Deklaracja atrybutu jest nast puj ca
13 Public Property Get N() As Long `akcja wykonywana przy odczytywaniu N N = ln End Property Public Property Let N(ByVal vnewvalue As Long) `akcja wykonywana przy zapisie N ln = vnewvalue Redim lsol(1 to N+1) End Property Z punktu widzenia uzytkownika klasy atrybut jest widoczny jak zmienna N typu Long. Oto dwa przykªady ilustruj ce wywoªania atrybutów Get/Let W pierwszym przykªadzie w momencie przypisywania wywoªa si atrybut Get poniewa» atrybut N jest odczytywany (N jest po prawej stronie operatora przypisania) Dim mn as Long mn = mode.n W przykªadzie poni»ej wywoªa si atrybyt Let poniewa» nast puje próba zmiany warto±ci atrybutu N (N jest po lewej stronie operatora przypisania). W trakcie dziaªania Property Let N w zmienna vnewvalue zawiera wyra»enie której jest po prawej stronie operatora przypisania tj. 1000 w przykªadzie poni»ej. mode.n = 1000 Jak wida w kodzie Property Let N instrukcja taka spowoduje»e zostanie zmieniona wartosc zmiennej ln na 1000, oraz zostanie zostanie zaalokowana odpowiednio pamiec dla tablicy lsol. c. Atrybuty mog by Publiczne, Prywatne i Zaprzyja¹nione. d. Brak denicji Property Let N spowoduje»e atrybut N b dzie atrybutem tylko do odczytu. Proba jego zmiany instrukcj mode.n = 1000 wywoªa Bª d (na poziomie kompilacji kodu). e. Atrybutem mo»e by obiekt innej klasy. W takim przypadku zamiast Property Let trzeba napisa Property Set. Poniewa» zmienne typy obiektowego przypisuje sie u»ywuj c nie tylko operatora przypisania ale tak»e operatora Set.
14 1.6.4 Interfejsy w VBA a. Interfejsem klasy nazywamy wszystkie publiczne metody, zmienne i atrybuty jakie udost pnia klasa u»ytkownikowi klasy. b. Przy programowaniu obiektowym, pracuj c jako programista klas, bardzo cz sto zda»a si zaimplementowali±my ró»ne klasy które maj bardzo podobny lub identyczny interfejs (lub taki który by mo»na ªatwo uzgodni ). Zaimplementowane klasy s wi c bardzo podobne ale s obiektami ró»nego typu. Mo»na my±le o takich obiektach jako o moduªach algorytmu które wykonuj to samo zadanie inn metod. Chcieliby±my jako programi±ci mie ªatw metod wymiany moduªów algorytmu - klocków z których zostaª on zbudowany. Gdyby±my chcieli to zrobi na piechot to musieliby±my pozamieniac we wszystkich funkcjach które u»ywaj danej klasy nazwy na nazwy nowej klasy o takim samym interfejsie jak stara. VBA umo»liwia bardziej eleganck metod poprzez tzw. implementacj interfejsów. c. Pierwszym krokiem w tym kierunku jest dodanie nowej klasy do projektu która b dzie zawieraªa tylko denicje wspólnego interfejsu tzn. b d tam tylko puste denicje metod, zmiennych i atrybutów które s wspólne dla klas które napisali±my lub mamy zamiar napisa. Taka klas mo»emy nazywa tak»e klas abstrakcyjn. d. Je»eli mamy ju» zaprogramowane jakie± klasy o takim samym interfejsie jak dodana powy»ej klasa abstrakcyjna to 1) Na pocz tku kodu klasy dodajemy Implements ifun (ifun to przykªadowa nazwa klasy abstrakcyjnej ) 3) Na górze okna moduªu klasy s dwie listy rozwijane (jedna po lewej a druga po prawej). Zawarto± listy po prawej zale»y od tego co si wybraªo po lewej stronie. Po dopisaniu Implements ifun na rozwijanej li±cie po lewej stronie pojawia si nam nazwa klasy abstrakcyjnej ifun. Klikamy t nazw i wtedy na rozwijanej li±cie z prawej stronu okna kodu klasy mamy nazwy wszystkich metod/atrybutów interfejsu. 4) Trzeba klikn wszystkie po koleji elementy z tej listy. 5) Ka»de klikni cie spowoduje»e w oknie kodu klasy pojawi si odpowiednia denicja metody/atrybutu ze wspólnego interfejsu zdenowanego w klasie abstrakcyjnej ifun. 6) W denicjach metod/atrybutów które si pojawi musimy wywoªa odpowiadaj c jej metod /atrybut który mamy ju» napisany (je»eli nie to trzeba j napisa ) e. Je»eli nie mamy zaprogramowanej klasy o podobnym interfejsie do tego zdeniowanego w klasie abstrakcyjnej ifun to (a) Dodajemy nowy moduª klasy, nadajemy jemu odpowiedni nazw. (b) Post pujemy dalej wg. kroków (1)-(6) opisanych powy»ej
15 1.7 Instrukcje warunkowe Najpierw zaczniemy od wyra»e«logicznych. Dla wyra»e«logicznych w VB istniej nast puj ce operatory Not Negacja logiczna: Not wyrazenie, Or Suma logiczna: wyrazenie_1 Or wyrazenie_2, And Iloczyn logiczny: wyrazenie_1 And wyrazenie_2. Przy warto±ciach liczbowych cz sto stosuje si operatory porównania które w VB s nast puj ce = < > <= >= 1.7.1 If... Then W VB najprostsza instrukcja warunkowa ma posta If wyrazenie Then Else... End if mo»e jednak by bardziej rozbudowana If wyrazenie Then... Elseif wyrazenie_2 Then... Elseif wyrazenie_3 Then... Else... End if Instrukcje warunkowe mo»na zagnie»d»a. 1.7.2 Select case Drugi rodzaj instrukcji warunkowej to Select Select Case Wyrazenie_do_sprawdzenia Case wartosc_1 Case wartosc_2
16 Case Else End Select Wyrazenie_do_sprawdzenia mo»e by nazw zmiennej lub odwoªaniem do funkcji. Instrukcja Select Case sprawdzi po koleji czy wyra»enie pasuje do jednej z wylistowanych warto±ci, wykona instrukcje wyst puj ce do nast pnego sªowa Case i dziaªanie programu zostanie przekazane do End Select. Je»eli warto± wyra»enia pasuje do dwóch warto±ci to instrukcja wykona tylko kod zwi zany z pierwszym pasuj cym przypadkiem. Instrukcje Select Case mo»na zagnie»d»a. Uwaga 1. Warto±ci po Case mo»na grupowa, oddzielaj c je przecinkami np. Case 1,2,3 Uwaga 2. Nie ma potrzeby wypisywania wszystkich warto±ci mo»na u»y To np. Case 1 To 10 Uwaga 3. Mo»na tak»e u»y Is np. Case Is > 10 Uwaga 4. Warto±ci mo»e by tak»e nazwa innej zmiennej np Case Inna_Zmienna 1.8 P telki 1.8.1 FOR Typowa p tla w gór For i = 1 To 10.. Next i i mniej typowa p telka w dóª For i = 10 To 1 step -1.. Next i
17 Pojawiªo si tutaj wyra»enie step -1 który powoduje,»e w kolejnych obrotach p tli licznik jest zmniejszany o -1. Jeszcze mniej typowa p tla z przerwaniem For i = 10 To 100 step 2.. Exit For.. Next i Exit For u»yty w ±rodku For powoduje przerwanie dziaªania p tli. 1.8.2 Do..Loop Taka p telka obraca si dopóki warunek Blad > 0.0001 jest speªniony Do While Blad > 0.0001 Loop Czyli warunek Blad > 0.0001 jest warunkiem obracania si p telki. Je»eli przestanie by prawdziwy to p telka przestanie si kr ci. Natomiast taka p telka b dzie si obraca dopóki warunek Blad < 0.0001 nie zostanie speªniony Do until Blad < 0.0001 Loop Czyli warunek Blad < 0.0001 jest warunkiem przerwania dziaªania p telki. Je»eli ten warunek stanie si prawdziwy to p telka przestanie si kr ci. UWAGA: w powy»szych przykªadach warunki byªy sprawdzane na pocz tku obracania si p telki. Oto wersje p telek z warunkiem sprawdzanym na ko«cu Do Loop While Blad > 0.0001 Do Loop until Blad < 0.0001 UWAGA: Je»eli chcemy z pewnych powodów przerwa dziaª nie p tli to stosujemy intrukcj Exit Do.
18 Do until Blad < 0.0001 If warunek Then Exit Do Loop 1.9 Komunikacja z arkuszem 1.9.1 Komunikacja poprzez funkcje Funkcja mo»e zwraca dane do arkusza je»eli j wywoªamy w Arkuszu. Je»eli chcemy zwraca jedn warto± to w zasadzie zwykªa funkcja napisana VB mo»e by wywoªywana w arkuszu. Wyj tek stanowi funkcje które pobieraj argumenty w postaci tablicy oraz funkcje które zwracaj tablice. Je»eli funkcj pobieraj argumenty w postaci tablicy to musimy obsªu»y konwersj danych z Zakresu na Tablice VB (Patrz obiekt Range). Je»eli funkcje maj zwraca tablic to musimy zadeklarowa zwracany typ jako Double(), Long() lub Variant. Wtedy w kodzie mo»emy u»ywa zwykªej tablicy VB a przy zwracaniu u»y wyra»enia nazwa_funkcji = nazwa_tablicy i nasza funkcja zwróci tablic do Arkusza. Oczywi±cie musimy pami ta»e funkcje zwracaj ce tablice zatwierdzamy w arkuszu Shift+Ctrl+Enter. 1.9.2 Komunikacja poprzez obiekt Range Drugi sposób komunikacji z arkuszem to obiekt Range który reprezentuje zakres komórek. Wska¹niki na Obiekt range mo»na pobra w VBA korzystaj c obiektu Worksheets poprzez nazw arkusza i adresy komórek np. Worksheets("Arkusz1").Range("C1:D2") lub w bardziej profesjonalnej wersji dim MojZakres as Range set MojZakres = Worksheets("Arkusz1").Range("C1:D2") Referencje do obiektu Range mo»na równie» pobra wywoªuj c wªasn funkcj która jako jeden z argumentów pobierze zaznaczony zakres komórek. Obiekt typu Range posiada wiele wªa±ciwo±ci np MojZakres.Columns.Count - liczba kolumn zakresu MojZakres (tylko do odczytu) MojZakres.Rows.Count - liczba wierszy zakresu MojZakres(tylko do odczytu) MojZakres.Cells(i,j) - zawarto± komórki o indeksie i, j w zakresie MojZakres (do odczytu i zmiany)
19 MojZakres(i,j) - zawarto± komórki o indeksie i, j w zakresie MojZakres (do odczytu i zmiany) Oczywi±cie mo»na równie» za ka»dym razem pobiera referencje do obiektu range przez nazw np Worksheets("Arkusz1").Range("C1:D2").Columns.Count Worksheets("Arkusz1").Range("C1:D2").Rows.Count Worksheets("Arkusz1").Range("C1:D2").Cells(i,j) Worksheets("Arkusz1").Range("C1:D2")(i,j) lub u»y instrukcji wi» cej With With Worksheets("Arkusz1").Range("C1:D2").Columns.Count.Rows.Count.Cells(i,j) End With Powy»szy kod oczywi±ci nic nie robi, ma tylko zaprezentowa jak si odwoªywa do elementów obiektu Range Odwoªywanie sie do komórek przez Cells jest bardzo niefektywne. Du»o szybszym rozwi zaniem jest odczytanie zawarto±ci zakresu do tablicy, wykonania operacji i zapisanie zmodykowanych danych spowrotem. dim MyArray() as Variant MyArray = Worksheets("Arkusz1").Range("C1:D3").Value `lub MyArray = Worksheets("Arkusz1").Range("C1:D3") `Cos robimy... `zwracamy wyniki Worksheets("Arkusz1").Range("C1:D3").Value = MyArray ` Worksheets("Arkusz1").Range("C1:D3")= MyArray Przy zwracaniu wyników warto stosowa metod Resize: dim MyArray() as Double dim OutRange as Range set OutRange = Worksheets("Arkusz1").Range("C1").Resize(m,n) `m,n to rozmiar tablicy OutRange.Value = MyArray `lub OutRange = MyArray
20 1.10 Komunikacja z czªowiekiem Instrukcja MsgBox sªu»y do przekazania informacji u»ytkownikowi. Dziaªanie programu zostaje przerwane do momentu kiedy u»ytkownik wci±nie jeden z przycisków które s na okienku z informacj. Przykªad: MsgBox "Wyst piª BŠ D",,"BŠ D" MsgBox jest wªa±ciwie funkcj która zwraca informacj o wci±ni tym przycisku. Jakie przyciski maj si pojawi okre±la si w drugim argumencie funkcji. Przykªadowo dim TakNie as Integer TakNie = MsgBox ("Przerwa dziaªanie?", vbyesno + vbquestion,"pytanie") If TakNie = vbyes then... Else... end if U»ycie staªych vbyesno i vbquestion spowodowaªo,»e pojawiªy si przyciski Yes i No oraz ikonka ze znakiem zapytania. Przykªadowe inne staªe okre±laj ce przyciski to vbokonly, vbokcancel, vbabortretryignore, vbyesnocancel, vbyesno, vbretrycancel, Staªe okre±laj ce Ikonki vbcritical, vbquestion, vbexclamation, vbinformation S jeszcze inne staªe (Patrz Plik pomocy w VBA). Funkcja MsgBox mo»e zwróci warto±ci vbok, vbcancel, vbabort, vbretry, vbignore, vbyes, vbno Instrukcja InputBox pozwala u»ytkownikowi przekaza jak ± informacj do programu. Do dopisania 1.11 Obsªuga bª dów W VB mo»na samemu oprogramowa dziaªanie programu w przypadku wyst pienia bª du. Sªu»y do tego instrukcja On Error On Error Resume Next Powoduje»e w przypadku wyst pienia bª du program zignoruje bª d. On Error Goto Etykieta Powoduje»e w przypadku wyst pienia bª du program przeskoczy do fragmentu kodu okre±lonego przez Etykieta. Jak si wstawia etykiety pokazuje przykªad poni»ej.
21 On Error Exit function Powoduje»e w przypadku wyst pienia bª du nast pi przerwanie dziaªania funkcji. Przykªad wªasnej obsªugi bª du Public function Moja() as Double On error Goto Obsluga_bledow 'Tutaj twój kod funkcji Exit Function Obsluga_bledow: 'Tutaj twoja obsªuga bª du Resume 'to spowoduje,»e program End function 1.11.1 Obiekt Err 'przeskoczy do lini w której pojawiª si bª d W VB jest w ka»dym momencie dziaªania dost pny obiekt Err, który zawiera informacj o ostatnim bª dzie. Obiekt Err ma m.in. wªa±ciwo±ci Err.Number Numer Bª du, Err.Description String zawieraj cy Opis bª du. Przykªadowo mo»na u»y instrukcji warunkowej Select Case opisanej wcze±niej Select case Err.Number Case 1 Case 2 Case Else End Select 1.12 Debugowanie kodu Warto wspomnie o dwóch instrukcjach Debug.Print Tekst Umo»liwia wypisanie tekstu do okna Immediate. Debug.Assert warunek Umo»liwia zatrzymanie dziaªania programu gdy speªniony jest warunek.
22 1.13 Ró»no±ci i ciekawostki Skracanie deklaracji zmiennych Kod dim i,j,k as Long nie zadeklaruje (niestety) trzech zmiennych typu long. Zmienne i,j b d typu Variant natomiast tylko zmienna k b dzie typu Long. Komentarze Aby napisa komentarz w kodzie VB trzeba u»y znaku ' wszystko co jest za ' jest nie jest traktowane jako kod VB. Nie zaznacza si w»aden sposób ko«ca komentarza bo znak komentarza obowi zuje do ko«ca linii, tzn.»e aby napisa komentarz w drugiej linii trzeba w drugiej linii u»y '. Komentarz jest kodzie oznaczony kolorem zielonym. Przykªad: Dim i as Long ' i to jest jakas zmienna Kompilacja kodu Poprawno± skªadniow kodu mo»na sprawdzi wybieraj c z menu Debug\CompileV BAP roject. Option Explicit jest bardzo wa»n dyrektyw dla Kompilatora. Option Explicit umieszczamy w pierwszej linijce moduªu, wymusza ona deklarowanie wszystkich zmiennych w module. UWAGA: To jest bardzo wa»ne!!! Bez tej dyrektywy VB w momencie kiedy napotka zmienna nie zadeklarowan zadeklaruje j automatycznie jako zmienna typu Variant i nie zgªosi bª du. W przypadku pomyªki literowej w nazwie pewnej zmiennej spowoduje to»e program nie b dzie dziaªaª tak jak miaª dziaªa. Szukanie bª du w kodzie mo»e wtedy zaj du»o czasu. Dªuga deklaracja parametrów funkcji jest cz stym przypadkiem. mo»na przeªama u»ywaj c znaku podkre±lenia _. Oto przykªad Deklaracje funkcji Public function suma(byval a as Double, _ ByVal b as Double, _ ByRef c as double) as Double