Visual Basic w programie Excel funkcje definiowane, składnia języka


Visual Basic w programie Excel
dla Windows
Ćwiczenie nr 2
Funkcje definiowane, składnia języka.
Zakres ćwiczenia:
Tworzenie funkcji, procedur, modułów. Zastosowanie funkcji w arkuszu. Składnia
języka. Błędy. Typy danych, zmienne, stałe, konwersje typów. Funkcje standardowe.
Tworzenie funkcji
Funkcja jest czymś zbliżonym do makra, zasadnicza różnica polega na tym, że funkcja
zwraca pewną wartość, makro zaś wykonuje działanie (akcję). Funkcja ma unikalną nazwę
i argumenty (parametry), które podajemy w nawiasie po nazwie funkcji, oddzielone jeden od
drugiego przecinkami. W rzadkich przypadkach funkcja może nie mieć argumentów np.
wbudowana funkcja Now, która zwraca bieżącą datę i czas.
Definicja funkcji wyglÄ…da np. tak:
Function VAT ( CenaBezPodatku, StawkaVAT )
VAT = CenaBezPodatku * (1+StawkaVat/100)  Stawka VAT w procentach
End Function
Po utworzeniu funkcji w module (Insert / Macro i wybrać Module - lub kliknąć na
zakładkę modułu) możemy już jej używać w arkuszu. Korzystając z przykładu powyżej,
możemy w komórce arkusza wpisać np.:
= VAT(85,22)
- 1 -
Po wciśnięciu klawisza Enter, ujrzymy w komórce obliczoną wartość: cenę towaru za
85 jednostek, po dodaniu 22 % podatku VAT.
Tworzenie procedur
Procedura oznacza w VB blok programu znajdujÄ…cy siÄ™ w module i wykonywany jako
pewna całość (zwykle wykonująca jedno konkretne zadanie).
Sub KilkakrotnyBeep(IleRazy)
For Licznik = 1 to IleRazy
Beep
Next Licznik
End Sub
Jeśli procedura Sub jest uruchamiana z arkusza Excela lub wykresu (chart), np. za
pomocą polecenia Macro z menu Tools, to możemy nazwać ją makrem, choć jest to nadal
procedura Sub. Jeśli jest ona zaś wywoływana przez inne procedury w module VB, to nie
używamy terminu makro.
Podobnie jak w przypadku funkcji, procedury mogą, lecz nie muszą, być definiowane
i wywoływane z parametrami. Jednakże, tym razem w definicji po nazwie procedury zawsze
występuje para nawiasów, nawet gdy procedura jest bezparametrowa. Inaczej przy
wywołaniu - w przypadku procedur Sub, które nie zwracają wartości, przekazywanych
parametrów nie otaczamy nawiasami.
FormatujKartkę 15,25  wywołujemy procedurę typu Sub z 2 parametrami
Moduły
Moduł jest jednostką organizacyjną w VB i zwykle składa się z kilku (-nastu) procedur.
Ich kolejność w obrębie modułu nie ma znaczenia. Na początku modułu można umieścić
(przed pierwszą procedurą) m.in. pewne stałe i zmienne. Jest to blok deklaracji.
Nowy moduł tworzymy poprzez Insert / Macro i Module. Następnie komendą Sheet
z menu Edit możemy nadać modułowi opisową nazwę.
Nazwy procedur w obrębie modułu nie mogą się powtarzać. Chcąc jednak użyć dwóch
procedur o tych samych nazwach, ale z różnych modułów, trzeba przy wywołaniu danej
procedury poprzedzić jej nazwę nazwą modułu w nawiasach kwadratowych oraz kropką.
Sub StockSale()
[Custom Formatting].SetupUpSheet
...
- 2 -
Nawiasy kwadratowe nie są konieczne, jeśli nazwa modułu jest jednym wyrazem
złożonym jedynie z liter i cyfr.
Typy danych
W zmiennych przechowujemy wartości określonego typu. Jeśli nie podamy jawnie typu
zmiennej, przyjmowany jest typ Variant, który przechowuje dane różnego rodzaju: liczby,
teksty, daty, itp. Pojedyncza zmienna typu variant może zawierać całą tablicę (zmiennych
typu variant lub innych typów), natomiast nie można pod nią podstawiać zmiennych typów
zdefiniowanych przez użytkownika (np. rekordów określonego zdefiniowanego typu) 
o których będzie jeszcze mowa.
Przykłady:
X = #04-22-1997#  zmienna X przechowuje datÄ™
X =   Hello world   zmienna X przechowuje tekst
X =  5  zmienna X przechowuje liczbę całkowitą
Co więcej, można nawet wykonywać operacje matematyczne na zmiennych typu
variant, będących w zależności od potrzeby tekstami lub liczbami.
Zmienna =   8 
Zmienna = Zmienna - 5   obecnie Zmienna ma wartość 3
Zmienna =   A  & Zmienna   dokonaliśmy konkatenacji stringów
  Zmienna ma wartość   A3 
Jeśli chcemy jednak określić typ zmiennej, dokonujemy tego w taki sposób:
Dim zmienna As typ
Typami liczbowymi w VB są: Integer, Long (typy całkowite), Single, Double (typy
zmiennoprzecinkowe, odpowiednio pojedynczej i podwójnej precyzji) oraz Currency (typ
stałoprzecinkowy - max. 15 cyfr przed kropką dziesiętną i 4 cyfry po kropce). Innymi często
używanymi typami danych są typ łańcuchowy (String), logiczny (Boolean) i obiektowy
(Object - wskaznik do obiektu w obrębie aplikacji).
Typ łańcuchowy
Domyślnie deklaracja łańcucha oznacza ciąg znaków o zmiennej długości (tzn. łańcuch
wydłuża się lub skraca, jeśli zmieniamy jego wartość). Możemy jednakże przypisać zmiennej
- 3 -
łańcuchowej określoną długość - w razie potrzeby uzupełniana jest z przodu odpowiednią
liczbą spacji. Zbyt długi łańcuch jest obcinany na końcu.
Dim Tekst As String * 30  na zmienną Tekst rezerwujemy 30 znaków (bajtów)
Tekst =   Ala ma kota 
MsgBox Tekst  wyświetla napis w oknie dialogowym
Do konkatenacji łańcuchów służy operator  + lub  & . Operator  & jest jednak
bardziej uniwersalny, gdyż pozwala na konkatenację danych różnych typów np. łańcucha i
liczby. W przypadku operatora  + natomiast, VB spróbuje najpierw dokonać konwersji
łańcucha na liczbę i jeśli operacja się powiedzie, nastąpi zwykłe dodanie dwóch liczb.
Typ daty
Zmienne typu Date reprezentujÄ… daty od 1 stycznia 100 do 31 grudnia 9999 i czas od
0:00:00 do 23:59:59. Fizycznie zmienna typu date jest liczbą 8-bajtową, można jednak
używać napisów do określenia czasu i daty. Napisy te ograniczone muszą być z obu stron
znakiem  # , np. #January 5, 1997# lub #5-1-95 14:27# Przy wprowadzaniu danych można
używać wielu postaci daty i czasu np. skrótów nazw miesięcy, systemu 12- i 24-godzinnego
itd. Na wyjściu czas wyświetlany jest zgodnie z ustawieniami systemowymi.
Kiedy konwertujemy zmienną typu liczbowego do typu date, należy pamiętać, że
część całkowita liczby reprezentuje datę, a część ułamkowa czas. Północ to 0, zaś południe
0.5. Wartości ujemne odnoszą się do dat sprzed 30 grudnia 1899 r.
VB posiada kilka funkcji zwracających wartości typu date:
Sub DateTimeDemo ()
Dim Teraz As Date, IleMinut As Date, KtoraGodzina As Date
Teraz = Now  funkcja Now zwraca bieżącą datę i czas
IleMinut = Minute(Teraz)
KtoraGodzina = Hour(Teraz)
MsgBox IleMinut &   minut po godzinie   & KtoraGodzina
End Sub
Na danych typu date możemy wykonywać działania matematyczne. Np. dodanie do
daty liczby 7 przesuwa nas do przodu o tydzień, a odjęcie 0.5 cofa o pół doby.
Typ logiczny
Typ logiczny (Boolean) operuje jedynie na wartościach True i False. Fizycznie
natomiast zmienne typu boolean są liczbami 2-bajtowymi. Przy konwersji z innych typów
liczbowych, liczbie 0 przypisywana jest wartość False, zaś pozostałych - True. Przy
- 4 -
konwersji w drugÄ… stronÄ™, z typu logicznego na inny typ liczbowy, False staje siÄ™ zerem, zaÅ›
True jest przekonwertowane na  1. Uwaga: jeżeli porównujemy wartości logiczne z liczbami,
najpierw dokonywana jest konwersja wartości logicznych, np. wyrażanie 1 = True ma
wartość logiczną False, gdyż w miejsce True podstawiana jest liczba  1, a dopiero potem
oszacowywane jest wyrażenie; 1 =  1 jest oczywiście nieprawdą.
If ( Zysk > 1000 ) Then MsgBox   Znakomicie !  
If ( Zysk > 1000 ) = True Then MsgBox   Znakomicie !  
 dwie powyższe linie są całkowicie równoważne
W wyrażeniach logicznych często używamy operatorów. And, Or i Xor nie wymagają
tłumaczenia, Eqv to operator równoważności (wyrażenie jest True, jeśli obie strony mają taką
samą wartość logiczną), zaś Imp to operator implikacji (czyli wyrażenie jest False tylko
wtedy, gdy pierwszy argument jest True, a drugi False).
Konwersje typów
Nierzadko w praktyce zachodzi potrzeba użycia specyficznej reprezentacji danej.
Przykładowo jeśli chcemy zmienną typu variant przechować jako liczbę typu currency,
użyjemy funkcji CCur:
Tygodniowka = CCur ( Godziny * StawkaGodzinowa)
Do konwersji tekstu na datę (i czas) użyjemy funkcji CDate. Uprzednio jednak musimy
sprawdzić, czy dany tekst da się przekonwertować na datę. Służy do tego funkcja
IsDate(pewna_data) zwracająca wartość logiczną.
Widoczność zmiennych
Zmienne mogą być dostępne (widoczne) w obrębie tylko danej procedury lub w całym
module, albo też we wszystkich modułach. Zasięg ustalamy przy jej deklaracji.
Zasięg Deklaracja
Lokalny Dim lub Static w obrębie procedury
W obrębie modułu Dim, Static lub Private na początku danego modułu
Publiczny Public na początku modułu
Public Nr_Klienta As Integer  Zmienna dostępna we wszystkich modułach
Jeżeli dwie zmienne mają takie same nazwy, dostępna jest bardziej lokalna z nich
(bliższego zasięgu). W przypadku dwóch zmiennych z różnych modułów, można się do nich
odnieść używając kwalifikatora modułu np. CostMod.TotalCosts oznacza zmienną TotalCosts
z modułu CostMod.
- 5 -
Tworzenie własnych typów danych
Użytkownik może zadeklarować własne rekordowe typy danych. Tworzone typy są
zawsze publiczne i ich definicje umieszcza się na początku modułu.
Type Komputer
Procesor As Variant
RAM As Long
LiczbaKolorow As Long
Cena As Currency
DataZakupu As Date
End Type
Możemy teraz zadeklarować zmienne tego typu, przy czym mogą one być lokalne,
dostępne w obrębie modułu lub publiczne.
Dim MojKomputer As Komputer, KomputerCioci As Komputer
Do składowych rekordu typu Komputer odnosimy się, podobnie jak do właściwości
(properties) obiektów, za pomocą kropki.
KomputerCioci.Procesor =   Pentium 
If MojKomputer.LiczbaKolorow > 65536 Then MsgBox   Chyba TrueColor... 
Własne typy mogą być zagnieżdżone, tzn. składowe nowo definiowanego typu mogą
być innego typu wcześniej zdefiniowanego przez użytkownika.
Stałe
Stała różni się od zmiennej tym, że jej wartość nie zmienia się (np. w stałej będziemy
przechowywać wartość liczby pi). Wiele stałych jest już w Visual Basic u wbudowanych.
Stałe używane przy obiektach Excela zwykle zaczynają się od liter xl np.
xlCurrencyCode. Większość pozostałych predefiniowanych stałych zaczyna się od vb np.
vbYesNo.
Tworzenie stałych najlepiej wyjaśnić na przykładzie.
Const CONSTANTNAME = wyrazenie
Wyrażenie jest np. liczbą lub łańcuchem znaków; można też w nim użyć wbudowanych
funkcji lub operatorów. Godną polecenia praktyką jest pisanie stałych wielkimi literami.
Przy deklaracji stałej można podać jest typ np. w celu zwiększenia dokładności
wykonywania pewnych obliczeń.
- 6 -
Const CONSTANTNAME As typ = wyrazenie
Przykłady:
Const PI = 3.14159
Const DATA_EMISJI = #1/1/94#
Const NAZWISKO =   Jan Kowalski 
Const PI2 = PI * 2
Jak pokazuje ostatni przykład, w stałej można odwołać się też do innej, uprzednio
zdefiniowanej stałej.
Elementy składni języka
Większość instrukcji VB można przypisać do jednej z poniższych kategorii:
" przypisanie wartości do zmiennej
TwojWiek = InputBox (  Ile masz lat ?  )
" wbudowana instrukcja wykonująca jakieś działanie np.
Name   Autoexec.bat  As   Autoexec.old   zmiana nazwy pliku
" sterowanie w programie (oparte na warunkach) np.
Do
Liczba = InputBox(  Podaj liczbÄ™   )
Loop Until IsNumeric(Liczba)
MsgBox   Pierwiastek kwadratowy z   & Liczba   wynosi   & Sqrt(Liczba)
" ustawienie własności obiektu
ActiveCell.Font.Italic = True  ustawia pismo pochyłe w bieżącej komórce
" wykonanie metody obiektu
Application.Checkspelling word :=   norepinephrine 
Poznaliśmy już instrukcję przypisania, czas przedstawić instrukcje sterujące.
If...Then to podstawowa instrukcja warunkowa. Po słowie kluczowym If następuje
warunek (wyrażenie logiczne) i jeżeli warunek jest spełniony, to wykonywany jest zestawów
instrukcji podanych po słowie Then (przy czym zestaw ten może zawierać tylko jedną
instrukcjÄ™).
If PewnaData < Now Then
X = X+1  zwiększamy pewną bliżej nieznaną zmienną
MsgBox   Data z przeszłości 
End If
lub:
- 7 -
If PewnaData < Now Then MsgBox   Data z przeszłości 
Widzimy, że w przypadku większej liczby instrukcji do wykonania przy spełnionym
warunku, należy konstrukcję zakończyć przez End If.
If...Then...Else to uogólnienie poprzedniej konstrukcji; jeżeli warunek nie jest
spełniony, to wykonywana jest instrukcja (instrukcje) po słowie Else.
If Wiek < 18 Then
MsgBox   Przykro mi, ale nie możesz obejrzeć tego filmu. 
Else MsgBox   Zapraszamy do kina ! 
End If
W przypadku zagnieżdżonych  if -ów, używamy słowa ElseIf.
If RokStudiow = 2 Then
Stypendium = 130
ElseIf RokStudiow = 3 Then
Stypendium = 150
ElseIf RokStudiow = 4 Then
Stypendium = 170
Else
Stypendium = 200
End If
Select Case to alternatywna wobec If...Then...Else wersja przyrównywania wyrażenia
do kilku różnych wartości. Select Case daje bardziej przejrzysty i efektywny kod.
Select Case Ocena
Case 1
MsgBox   Cyfra mówi sama za siebie... 
MsgBox   Popraw siÄ™ !! 
Case 2
MsgBox   Miernie 
Case 3
MsgBox   Mogło być lepiej... 
Case 4,5
MsgBox   Dobrze - albo i bardzo dobrze 
Case Is > 5
MsgBox   Wprost trudno uwierzyć ! 
Case Else
MsgBox   Ejże, chyba nie ma takiej oceny ! 
End Select
- 8 -
Do...Loop jest pętlą o nieokreślonej liczbie powtórzeń. Istnieje kilka wariantów
Do...Loop, wszystkie jednak wiążą się ze sprawdzaniem pewnego warunku, którego
w pewnych wariantach spełnienie, lub w innych niespełnienie kończy pętlę.
Do While...Loop to pętla sprawdzająca warunek na początku. Jeśli nie jest on
spełniony, nie wykonujemy instrukcji wewnątrz pętli. Widzimy więc, że w skrajnym
przypadku pętla może nie wykonać się ani razu.
Składnia: Do While warunek
instrukcje
Loop
X = InputBox (  Podaj liczbÄ™ naturalnÄ…  )
Do While X>1
If X mod 2 = 0 Then  X parzyste
X = X / 2  bierzemy połówkę liczby
Else
X = 3*X + 1
Loop
MsgBox(  Doszliśmy do jedynki  )
Pętla Do... Loop While działa niemal tak samo, jedyną różnicą jest to, że warunek
sprawdzany jest na końcu pętli, a więc instrukcje wewnątrz pętli zostaną wykonane
przynajmniej raz.
Składnia: Do
instrukcje
Loop While warunek
Niektóre pętle wykonują się, dopóki warunek jest fałszywy. Gdy staje się on
prawdziwy, pętla się kończy.
W pętli Do Until...Loop warunek sprawdzany jest na początku, zaś w Do...Loop Until
- na końcu.
Składnia: Do Until warunek
instrukcje
Loop
oraz
Do
instrukcje
- 9 -
Loop Until warunek
Pętli For...Next używamy, gdy znamy liczbę powtórzeń pętli (jest to pętla z licznikiem,
który z każdym przejściem zwiększa się lub zmniejsza o stałą wartość - domyślnie o 1).
Składnia: For licznik = start To end [Step przyrost]
instrukcje
Next [ licznik ]
Przyrost, podawany po słowie kluczowym Step, może być ujemny. Jeżeli start > end,
zaś przyrost dodatni, albo też start < end, zaś przyrost ujemny, to pętla nie wykona się.
Oczywiście warunek jest sprawdzany na początku pętli.
For Each...Next jest b. użyteczną wersją pętli For. Tym razem instrukcje w pętli
wykonujemy dla każdego elementu z pewnej kolekcji obiektów lub w tablicy - jest to bardzo
wygodne, gdy nie znamy liczby elementów tej kolekcji.
Sub InkrementujKażdąWybranąKomórkę( )
Set Wybrane = Selection
 C reprezentuje pojedyńczą komórkę w każdym przejściu pętli
For Each C in Wybrane
If IsNumeric(C.Value) Then
C.Value = C.Value + 1
End If
Next C
End Sub
Z pętli można wyjść (np. awaryjnie)  przed czasem . Służy do tego instrukcja Exit For
- dla pętli For lub Exit Do - dla pętli Do. Instrukcje te niemal zawsze wykonywane są
w instrukcji warunkowej, po zajściu jakichś specyficznych warunków.
Podobnie  przed czasem można wyjść z procedury, za pomocą znanych nam już
instrukcji Exit Sub i Exit Function. Instrukcje Exit For, Exit Do (Exit Sub, Exit Function)
mogą pojawić się wielokrotnie w obrębie pętli (procedury).
Obsługa błędów
Podczas wykonywania programu mogą pojawić się błędy (ang. run-time errors) np.
dzielenie przez zero, czy brak na dysku potrzebnego pliku. VB dostarcza mechanizmów
obsługujących takie sytuacje.
- 10 -
Wyrażenie On Error GoTo etykieta sprawia, że w wypadku błędu skoczymy do
bloku zaczynajÄ…cego siÄ™ od etykieta:
Kod błędu zwraca funkcja Err, zaś komunikat wyjaśniający, co się stało, zwraca
funkcja Error.
MsgBox   Wystąpił właśnie błąd nr   & Err &   . Jego komunikat:   & Error(Err)
Function Dziel(dzielna, dzielnik)
Const ERR_DIV0 = 11
On Error GoTo Obsługa
Dziel = dzielna / dzielnik
Exit Function
Obsługa:
If Err = ERR_DIV0 Then
MsgBox   Dzielenie przez zero ! 
Dziel = Null
Else MsgBox   BÅ‚Ä…d o kodzie   & Err
Dziel = Null
End If
Resume Next
End Function
Null jest specjalną wartością typu variant. Jest ona zwykle używana w bazach danych
do wskazywania nieznanych lub brakujących danych. Aby sprawdzić, czy określona zmienna
typu variant ma wartość Null, użyj funkcji logicznej IsNull.
Resume powraca do instrukcji, w której wystąpił błąd np. w sytuacji, gdy program
próbuje coś odczytać z dysku A:, a w stacji dysków brakuje dyskietki może ukazać się
stosowny komunikat - po włożeniu dyskietki naturalny jest powrót do linii, w której wystąpił
błąd.
Resume Next przechodzi do następnej linii. W przykładzie powyżej zostanie
wykonana instrukcja Exit Function.
Resume linia skacze do linii o numerze linia (lub etykiety o tej nazwie) w obrębie tej
samej procedury. linia nie może być zerem.
Wyłączenie obsługi błędów następuje po On Error GoTo 0.
- 11 -
Zadania:
1. Napisać 2 funkcje: cels2fahr i fahr2cels, które będą zamieniały temperaturę w skali
Celsjusza na Fahrenheita i odwrotnie. Uwaga: 0 °C = 32 °F, 1 °C = 33.8 °F. Wykorzystać
tÄ™ w funkcjÄ™ w arkuszu.
2. Wpłacamy pewną sumę do banku. Napisać funkcję obliczającą, ile pieniędzy będziemy
mieli na koncie po n miesiącach, przy kapitalizacji miesięcznej. Potęgowanie zrealizować
poprzez wielokrotne mnożenie (użyć pętli). Funkcja powinna mieć 3 parametry: wpłacaną
kwotę, liczbę miesięcy i wysokość stopy procentowej.
3. Trudniejsza (nieco) wersja poprzedniego zadania. Wpłacamy teraz co miesiąc pewną stałą
sumę pieniędzy, a ponadto co kwartał pobieramy inną stałą sumę. Obliczyć, ile będziemy
mieli po n miesiącach. Cztery parametry: wpłacana miesięcznie kwota, pobierana
kwartalnie kwota, liczba miesięcy i stopa procentowa. Uwaga: jeśli w trakcie pętli
otrzymamy ujemną sumę na koncie (tzn., że nie możemy pobrać kwartalnej kwoty), to
wychodzimy z funkcji zwracając wartość  1.
Zastosować funkcje z zadań w komórkach arkusza.
3. Niech funkcja z zad. 3 nazywa się tak samo, jak funkcja z zad. 2. Trzeba je zatem umieścić
w różnych modułach. Następnie z innej procedury wywołać obie te funkcje.
4. Sytuacja z zadania 3. Napisać procedurę, która obliczy i wypisze, po ilu miesiącach stan
konta przekroczy pewną ustaloną i przechowywaną w stałej wartość, np. 20000.
Gdybyśmy po długim czasie (np. 20 lat) nie otrzymali jeszcze tej sumy, to procedura ma
wypisać stosowny komunikat. Dane wprowadzić w procedurze, przy pomocy InputBox
(np. InputBox(  Podaj kwotę   ), itd.). Jeżeli któraś z wprowadzanych danych nie jest
liczbą (użyć funkcji logicznej IsNumeric), to wypisać stosowny komunikat i przerwać
procedurÄ™.
5. Napisać procedurę obliczającą różnicę w dniach między dwoma datami (np. żeby policzyć,
ile dni trwała II wojna światowa). Pierwsza data powinna być wcześniejsza; jeśli tak nie
jest, wypisać stosowny komunikat.
- 12 -
6. Procedura ma dwa parametry. Może zajść jedna z sytuacji: pierwszy parametr > drugi,
pierwszy = drugi i pierwszy < drugi. Stwierdzić zaistniałą sytuację komunikatem na
ekranie.
- 13 -


Wyszukiwarka

Podobne podstrony:
Visual Basic 2005 Zapiski programisty
Programowanie Obiektowe W Visual Basic Net Dla Ka dego
Visual Basic 2005 Programowanie
17 Zestawienie funkcji programu Excel
Mastering Visual Basic NET Database Programming
VB NET Programming with Microsoft Visual Basic NET?livery Guide
Makra programowanie w Visual Basic
Microsoft Serial, Key, Crack for all versions of 95, 98, 98 SE, 2000, XP, Corp, Visual C , Visual B
Visual C 6 0 Podstawy programowania
Visual Basic Net Szybki start

więcej podobnych podstron