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

(225 KB) Pobierz
Microsoft Word - VB2.doc
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 - wskaźnik 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ą.
‘ 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 -
If ( Zysk > 1000 ) Then MsgBox ‘’Znakomicie ! ‘’
If ( Zysk > 1000 ) = True Then MsgBox ‘’Znakomicie ! ‘’
Zgłoś jeśli naruszono regulamin