Unikanie kolizji nazw

Konflikt nazw występuje przy próbie utworzenia lub zastosowania poprzednio zdefiniowanego identyfikatora. W niektórych przypadkach konflikty nazw powodują wygenerowanie błędów typu "Wykryto niejednoznaczną nazwę" lub "Deklaracja powtórzona w bieżącym zasięgu". Nie wykryty konflikt nazw może powodować występowanie w programie błędów, których efektem są niepoprawne wyniki, szczególnie jeśli przed pierwszym użyciem zmiennych nie są one jawnie deklarowane.

Większości konfliktów nazw można uniknąć, właściwie określając zakres identyfikatorów danych, obiektów i procedur. Język Visual Basic ma trzy poziomy zasięgów: poziom procedury, prywatny poziom modułu i publiczny poziom modułu.

Konflikt nazw może wystąpić, gdy identyfikator:

•	Jest widoczny na więcej niż jednym poziomie zasięgu.

•	Ma dwa różne znaczenia na tym samym poziomie.

Na przykład, procedury w oddzielnych modułach mogą mieć tę samą nazwę. Tak więc, możliwe jest zdefiniowanie procedur o nazwie MojaProc w modułach Mod1 i Mod2. Konflikt nie wystąpi, jeśli każda z tych procedur jest wywoływana jedynie z innych procedur znajdujących się w tym samym co ona module. Jeśli jednak procedura MojaProc jest wywoływana z trzeciego modułu, może wystąpić błąd w sytuacji, gdy nie zastosowano żadnego kwalifikatora w celu rozróżnienia między dwiema procedurami MojaProc.

Większość konfliktów nazw może zostać rozwiązana, jeżeli identyfikator zostanie poprzedzony kwalifikatorem składającym się z nazwy modułu i, jeśli jest to konieczne, nazwy projektu. Na przykład:

Projekt1.Moduł1.NazwaProc Projekt2.Moduł2.Zmienna

Powyższy fragment kodu programu wywołuje procedurę Sub o nazwie NazwaProc i przekazuje do niej jako argument zmienną Zmienna. W celu rozróżnienia identycznych identyfikatorów może być stosowana dowolna kombinacja kwalifikatorów.

Visual Basic dopasowuje każde odwołanie do identyfikatora do "najbliższej" odpowiadającej mu deklaracji identyfikatora. Na przykład, jeśli identyfikator MójID jest zadeklarowany jako Public w dwóch modułach projektu (Mod1 i Mod2), odwołania do identyfikatora MójID zadeklarowanego w module Mod2 umieszczone w module Mod2 nie wymagają kwalifikowania, jednak w module Mod1 konieczne jest kwalifikowanie odwołań jako Mod2.MójID. Jest to również prawdziwe, gdy Mod2 znajduje się w innym, ale bezpośrednio wskazywanym projekcie. Jeśli jednak moduł Mod2 znajduje się w projekcie wskazywanym pośrednio, to jest w projekcie wskazywanym przez projekt, do którego występuje bezpośrednie odwołanie z bieżącego projektu, odwołania do zmiennej o nazwie MójID zadeklarowanej w module Mod2 muszą być zawsze kwalifikowane nazwą projektu. Jeśli odwołanie do zmiennej MójID występuje w trzecim, bezpośrednio wskazywanym module, jest ono kojarzone z pierwszą deklaracją określoną podczas przeszukiwania:

•	bezpośrednio wskazywanych projektów, w kolejności ich występowania w oknie dialogowym Odwołania wywoływanym z menu Narzędzia;

•	modułów każdego projektu. Zauważmy, że brak jest konkretnego uporządkowania modułów projektu.

Powtórne użycie nazw obiektów aplikacji głównej, takich jak na przykład R1C1 w programie Microsoft Excel, na różnych poziomach zasięgów nie jest możliwe.

Wskazówka   Typowe błędy powodowane przez konflikty nazw obejmują nazwy niejednoznaczne, powtórzone deklaracje, nie zadeklarowane identyfikatory oraz procedury, których nie można odnaleźć. Rozpoczynanie każdego modułu instrukcją Option Explicit, wymuszającą jawne deklaracje zmiennych przed ich użyciem, pozwala uniknąć niektórych potencjalnych konfliktów nazw i błędów związanych z identyfikatorami.


Wywoływanie procedur o takich samych nazwach

Wywołanie procedury umieszczonej w dowolnym module tego samego projektu co moduł aktywny jest możliwe w ten sam sposób, co wywołanie procedury zawartej w module aktywnym. Jeśli jednak dwa lub więcej modułów zawiera procedury o takich samych nazwach, niezbędne jest określenie nazwy modułu w instrukcji wywołującej procedurę, jak w poniższym przykładzie:

Sub Main()

Moduł1.MojaProcedura

End Sub

Jeżeli taka sama nazwa zostanie nadana dwóm różnym procedurom w dwóch różnych projektach, w instrukcji wywołania konieczne jest określenie nazwy projektu. Na przykład, poniższa procedura wywołuje procedurę Main w module MójModuł w projekcie MójProjekt.vbp.

Sub Main()

[MójProjekt.vbp].[MójModuł].Main

End Sub

Uwaga   Różne aplikacje stosują dla projektu różne nazwy. Na przykład, w programie Microsoft Access projekt jest zwany bazą danych (.mdb); w programie Microsoft Excel jest on nazywany skoroszytem (.xls).

Wskazówki dotyczące wywoływania procedur

•	Jeśli nazwa modułu lub projektu zostanie zmieniona, należy zmienić odpowiednie nazwy modułu lub projektu występujące w instrukcji wywołania; w przeciwnym razie system Visual Basic nie będzie w stanie odnaleźć wywoływanej procedury. Polecenie Zamień z menu Edycja może służyć do wyszukiwania i wymieniania elementów tekstu w module.

•	Aby unikać konfliktów nazw między wskazywanymi projektami, należy nadawać procedurom nazwy unikatowe, tak by możliwe było wywołanie procedury bez określania projektu lub modułu.


Wywoływanie procedur Property

Poniższa tabela podaje składnię wywoływania procedur typu Property:

Procedura Property	Składnia
Property Let	[obiekt.]nazwa_właść(argumenty)] = argument
Property Get	nazwa_zm = [obiekt.]nazwa_właść(argumenty)]
Property Set	Set [obiekt.]nazwa_właść[.(argumenty)] = nazwa_zm
Jeżeli wywoływane są procedury Property Let lub Property Set, po prawej stronie znaku równości (=) zawsze występuje jeden argument.

Jeśli procedury Property Let lub Property Set są deklarowane jako procedury z wieloma argumentami, system Visual Basic przekazuje argument z prawej strony wywołania do ostatniego argumentu w deklaracji Property Let lub Property Set. Na przykład, poniższy diagram pokazuje, jak argumenty w wywołaniu procedury Property mają się do argumentów w deklaracji procedury Property Let:

W praktyce jedynym zastosowaniem procedur Property z wieloma argumentami jest tworzenie tablic właściwości.


Wywoływanie procedur Sub i Function

Aby wywołać procedurę Sub z innej procedury, należy wpisać nazwę procedury i dołączyć wartości argumentów obowiązkowych. Instrukcja Call nie jest konieczna, jeśli jednak zostanie użyta, argumenty procedury muszą być ujęte w nawiasy.

Procedura Sub może być stosowana w celu takiego zorganizowania innych procedur, aby można je było łatwiej zrozumieć i śledzić ich wykonywanie. W poniższym przykładzie procedura Sub o nazwie Main wywołuje procedurę Sub o nazwie Sygnał, przekazując wartość 56 jako jej argument. Po zakończeniu procedury Sygnał sterowanie powraca do procedury Main, po czym procedura Main wywołuje kolejną procedurę Sub o nazwie Komunikat. Procedura Komunikat wyświetla okno komunikatu; gdy użytkownik kliknie przycisk OK, sterowanie powraca do funkcji Main, a Main kończy się.

Sub Main()

Sygnał 56

Komunikat

End Sub

Sub Sygnał(ile_dźw)

For licznik = 1 To ile_dźw

Beep

Next licznik

End Sub

Sub Komunikat()

MsgBox "Czas na przerwę!"

End Sub

Wywoływanie procedur Sub z więcej niż jednym argumentem

Poniższy przykład prezentuje dwa sposoby wywoływania procedury Sub wymagającej podania więcej niż jednego argumentu. Drugie wywołanie procedury ObliczDom wymaga użycia nawiasów dla argumentów, gdyż zastosowano instrukcję Call.

Sub Main()

ObliczDom 99800, 43100

Call ObliczDom(380950, 49500)

End Sub

Sub ObliczDom(cena As Single, zarobek As Single)

If 2.5 * zarobek <= 0.8 * cena Then

MsgBox "Nie stać cię na kupno tego domu."

Else

MsgBox "Ten dom możesz kupić."

End If

End Sub

Stosowanie nawiasów przy wywoływaniu procedur Function

Aby wykorzystać wartość zwracaną przez funkcję, należy przypisać tę funkcję do zmiennej i ująć argumenty w nawiasy, jak pokazano w poniższym przykładzie.

Odpow3 = MsgBox("Czy jesteś zadowolony ze swoich zarobków?", 4, "Pytanie 3")

Jeśli wartość zwracana przez funkcję nie jest istotna, funkcję można wywołać w ten sam sposób co procedurę Sub. Wówczas można pominąć nawiasy, a jedynie umieścić listę argumentów, a funkcja nie powinna być przypisywana do zmiennej, jak pokazano w poniższym przykładzie.

MsgBox "Zadanie zakończone!", 0, "Okno zadania"

Uwaga   Jeśli w tym przykładzie argumenty zostaną ujęte w nawiasy, instrukcja ta spowoduje błąd składniowy.

Przekazywanie argumentów nazwanych

Instrukcja w procedurze Sub lub Function może przekazywać wartości do wywoływanych procedur, wykorzystując argument nazwany. Argumenty nazwane można umieszczać w dowolnej kolejności. Argument taki składa się z nazwy argumentu, po którym następuje dwukropek i znak równości (:=), a następnie wartość przypisywana do argumentu.

Poniższy przykład prezentuje wywołanie funkcji MsgBox z użyciem argumentów nazwanych, bez zwracania wartości.

MsgBox Title:="Okno zadania", Prompt:="Zadanie zakończone!"

Poniższy przykład prezentuje wywołanie funkcji MsgBox z użyciem argumentów nazwanych. Zwracana wartość jest przypisywana do zmiennej Odpow3.

Odpow3 = MsgBox(Title:="Pytanie 3", _

Prompt:="Czy jesteś zadowolony ze swoich zarobków?", Buttons:=4)


Tworzenie zmiennych obiektowych

Zmienna obiektowa może być traktowana dokładnie tak samo jak obiekt, do którego się odnosi. Możliwe jest ustawianie lub zwracanie właściwości obiektu, a także stosowanie dowolnej z jego metod.

Aby utworzyć zmienną obiektową:

1.	Zadeklaruj zmienną obiektową.

2.	Przypisz zmienną obiektową do obiektu.

Deklarowanie zmiennej obiektowej

Aby zadeklarować zmienną obiektową, należy wykorzystać instrukcję Dim lub jedną z innych instrukcji deklaracji (Public, Private lub Static). Zmienna, która odwołuje się do obiektu, musi być typu Variant, Object lub musi mieć typ zgodny z typem określonego obiektu. Poniższe przykładowe deklaracje są poprawne:

' Deklaruje MójObiekt jako typu Variant.

Dim MójObiekt

' Deklaruje MójObiekt jako typu Object.

Dim MójObiekt As Object

' Deklaruje MójObiekt jako typu Font.

Dim MójObiekt As Font

Uwaga   Jeśli zmienna obiektowa zostanie użyta bez uprzedniego zadeklarowania, typ danych zmiennej obiektowej jest domyślnie przyjmowany jako Variant.

Zmienna obiektowa może być zadeklarowana jako zmienna typu Object, gdy określony typ obiektu nie jest znany do czasu uruchomienia procedury. Typ danych Object można stosować do tworzenia ogólnego odwołania do obiektu.

Jeżeli obiektowy typ danych jest znany, zmienna obiektowa powinna być deklarowana jako zmienna tego typu. Na przykład, jeżeli aplikacja zawiera typ obiektowy Sample, zmienna obiektowa dla tego obiektu może zostać zadeklarowana przy użyciu dowolnej z poniższych instrukcji:

Dim MójObiekt As Object	' Zadeklarowana jako obiekt ogólny.

Dim MójObiekt As Sample	' Zadeklarowana jedynie jako obiekt typu Sample.

Deklarowanie określonego typu obiektowego umożliwia automatyczne sprawdzanie typów, daje w efekcie szybszy i bardziej czytelny program.

Przypisywanie zmiennej obiektowej do obiektu

W celu przypisania obiektu do zmiennej obiektowej należy zastosować instrukcję Set. Możliwe jest przypisanie wyrażenia obiektowego lub wartości Nothing. Na przykład, dopuszczalne są poniższe przypisania do zmiennych obiektowych:

Set MójObiekt = TwójObiekt	' Przypisz odwołanie do obiektu.

Set MójObiekt = Nothing	' Zerwij powiązanie zmiennej z obiektem.

Deklarację zmiennej obiektowej można łączyć z przypisaniem do niej obiektu, stosując z instrukcją Set słowo kluczowe New. Na przykład:

Set MójObiekt = New Object	' Utwórz i przypisz

Ustawienie zmiennej obiektowej na Nothing powoduje zerwanie powiązania zmiennej obiektowej z określonym obiektem. Chroni to przed przypadkową zmianą obiektu w efekcie zmiany w tej zmiennej. Zmienna obiektowa jest zawsze ustawiana na Nothing po zamknięciu związanego z nią obiektu, stąd możliwe jest kontrolowanie, czy zmienna obiektowa wskazuje na właściwy obiekt. Na przykład:

If Not MójObiekt Is Nothing Then

' Zmienna odnosi się do właściwego obiektu.

. . .

End If

Naturalnie, powyższy test nie jest w stanie określić z całkowitą pewnością, czy nastąpiło zamknięcie aplikacji zawierającej obiekt, do którego odnosi się ta zmienna obiektowa.

Odwoływanie się do bieżącego wystąpienia obiektu

W celu odwołania się do bieżącego wystąpienia obiektu, którego kod jest aktualnie wykonywany, należy użyć słowa kluczowego Me. Wszystkie procedury związane z bieżącym obiektem mają dostęp do tego obiektu za pośrednictwem słowa Me. Stosowanie słowa Me jest szczególnie użyteczne przy przekazywaniu informacji o bieżącym wystąpieniu obiektu do procedury w innym module. Załóżmy na przykład, że w module znajduje się poniższa procedura:

Sub ZmieńKolorObiektu(NazwaObiektu As Object)

NazwaObiektu.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

End Sub

Wywołanie tej procedury i przekazanie bieżącego wystąpienia obiektu jako argumentu może być zrealizowane przy użyciu poniższej instrukcji:

ZmieńKolorObiektu Me


Tworzenie procedur rekursywnych

Procedury mają ograniczoną wielkość obszaru przeznaczonego na zmienną. Podczas każdego wywołania procedury przez nią samą wykorzystywany jest kolejny fragment tego obszaru. Procedura, która zawiera wywołanie siebie samej, zwana jest procedurą rekursywną. Procedura rekursywna, która w sposób ciągły wywołuje siebie samą, najprawdopodobniej spowoduje wystąpienie błędu. Na przykład:

Function Przepełnienie(Maksimum)

Przepełnienie = Przepełnienie(Maksimum)

End Function

Błąd ten może być mniej oczywisty, gdy dwie procedury wywołują siebie wzajemnie bez końca lub też pewne warunki ograniczające rekursję nie są nigdy spełnione. Rekursja ma jednak swoje zastosowania. Na przykład, poniższy przykład wykorzystuje funkcję rekursywną do obliczenia silni:

Function Silnia (N)

If N <= 1 Then	' Osiągnięto koniec wywołań.

Silnia = 1	' (N = 0), więc powróć z wywołań.

Else	' Wywołaj funkcję Silnia ponownie, jeśli N > 0.

Silnia = Silnia(N - 1) * N

End If

End Function

Procedurę rekursywną należy przetestować, aby upewnić się, że liczba wywołań nie spowoduje pojawienia się błędu braku pamięci. Jeśli błąd taki wystąpi, należy sprawdzić, czy procedura nie wywołuje siebie rekursywnie nieograniczoną liczbę razy. Jeśli poprawa kodu programu nie przyniesie skutków, w drugiej kolejności należy wykonać następujące czynności:

•	Wyeliminować zbędne zmienne.

•	Zastosować typy danych inne niż Variant.

•	Powtórnie przemyśleć algorytmy zastosowane w procedurze. Często rekursję można zastąpić zagnieżdżonymi pętlami.


Deklarowanie tablic

Tablice są deklarowane w ten sam sposób co inne zmienne, to jest z użyciem instrukcji Dim, Static, Private lub Public. Różnica pomiędzy zmiennymi skalarnymi (tymi, które nie są tablicami) i zmiennymi tablicowymi polega w zasadzie na konieczności określenia rozmiaru tablicy. Tablica, której rozmiar jest określony, jest tablicą o stałym rozmiarze. Tablica, której rozmiar może zmieniać się podczas działania programu, jest tablicą dynamiczną.

Instrukcja Option Base ustawia indeks pierwszego elementu na 0 lub 1. Jeżeli nie użyto instrukcji Option Base 1 (z argumentem równym 1), wówczas dla wszystkich tablic indeks pierwszego elementu wynosi zero.

Deklarowanie tablic o stałym rozmiarze

W poniższym wierszu kodu programu zadeklarowano tablicę o stałym rozmiarze jako tablicę o elementach typu Integer zawierającą 11 wierszy i 11 kolumn:

Dim MojaTab(10, 10) As Integer

Pierwszy argument reprezentuje wiersze; drugi argument reprezentuje kolumny.

Podobnie jak w przypadku deklaracji innych zmiennych, jeżeli dla tablicy nie zostanie określony typ danych, jako typ danych elementów deklarowanej tablicy przyjmowany jest Variant. Każdy element tablicy typu numerycznego Variant, zajmuje 16 bajtów. Każdy element tablicy będący ciągiem typu Variant, zajmuje 22 bajty. W celu napisania możliwie najbardziej zwartego kodu programu, należy jawnie deklarować elementy tablic innego typu niż Variant. Poniższe wiersze kodu pozwalają porównać rozmiary kilkunastu tablic:

' Tablica o elementach typu Integer zajmuje 22 bajty (11 elementów * 2 bajty).

ReDim MojaTabInteger(10) As Integer

' Tablica o elementach typu Double zajmuje 88 bajtów (11 elementów * 8 bajtów).

ReDim MojaTabDouble(10) As Double

' Tablica o elementach typu Variant zajmuje przynajmniej 176 bajtów (11 elementów * 16 bajtów).

ReDim MojaTabVariant(10)

' Tablica o elementach typu Integer zajmuje 100 * 100 * 2 bajty (20 000 bajtów).

ReDim MojaTabInteger (99, 99) As Integer

' Tablica o elementach typu Double zajmuje 100 * 100 * 8 bajtów (80 000 bajtów).

ReDim MojaTabDouble (99, 99) As Double

' Tablica o elementach typu Variant zajmuje przynajmniej 160 000 bajtów (100 * 100 * 16 bajtów).

ReDim MojaTabVariant(99, 99)

Maksymalny rozmiar tablicy zmienia się zależnie od systemu operacyjnego i wielkości dostępnej pamięci. Stosowanie tablic o wielkości przekraczającej dostępną w systemie wielkość pamięci RAM spowalnia działanie programu, gdyż dane muszą być odczytywane z dysku i zapisywane na dysk.

Deklarowanie tablic dynamicznych

Poprzez deklarację tablicy dynamicznej użytkownik zyskuje możliwość zmiany rozmiaru tablicy. W celu zadeklarowania takiej tablicy należy zastosować instrukcję Static, Dim, Private lub Public, pozostawiając puste nawiasy, jak w poniższym przykładzie.

Dim sngTab() As Single

Uwaga   W celu niejawnego zadeklarowania tablicy wewnątrz procedury można zastosować instrukcję ReDim. Nazwę tablicy znajdującą się po instrukcji ReDim należy wprowadzić uważnie, gdyż w przypadku błędu spowoduje to utworzenie drugiej tablicy, nawet jeśli zastosowano instrukcję Option Explicit.

W procedurze umieszczonej wewnątrz zakresu tablicy instrukcja ReDim może służyć do zmiany liczby wymiarów, definiowania liczby elementów oraz definiowania górnego i dolnego ograniczenia dla każdego z wymiarów. Instrukcja ReDim może być stosowana do zmiany tablicy dynamicznej dowolnie często. Każda jednak taka operacja powoduje utratę istniejących danych w tablicy. Aby powiększyć tablicę i zachować jej dotychczasowe dane, należy użyć polecenia ReDim Preserve. Na przykład, poniższa instrukcja powiększa tablicę varTab o 10 elementów bez utraty bieżących wartości oryginalnych elementów.

ReDim Preserve varTab(UBound(varTab) + 10)

Uwaga   Stosując słowo kluczowe Preserve dla tablicy dynamicznej można zmienić jedynie górne ograniczenie ostatniego wymiaru, nie można jednak zmienić liczby wymiarów.


Deklarowanie stałych

Poprzez zadeklarowanie stałej możliwe jest nadanie wartości sensownej nazwy. Do deklaracji stałej i nadania jej wartości służy instrukcja Const. Po zadeklarowaniu stałej nie jest możliwe jej modyfikowanie lub przypisywanie do niej innej wartości.

Stałą można zadeklarować wewnątrz procedury lub na początku modułu, w sekcji deklaracji. Stałe zadeklarowane na poziomie modułu są domyślnie prywatne. Aby zadeklarować publiczną stałą na poziomie modułu, należy poprzedzić instrukcję Const słowem kluczowym Public. Możliwe jest także jawne zadeklarowanie stałej prywatnej, przez poprzedzenie instrukcji Const słowem kluczowym Private, co ułatwia czytanie i interpretowanie kodu programu. Aby uzyskać więcej informacji, należy zapoznać się z treścią tematu Pomocy systemu Visual Basic "Understanding Scope and Visibility".

W poniższym przykładzie deklarowana jest stała publiczna o nazwie stWiek jako stała typu Integer o wartości 34.

Public Const stWiek As Integer = 34

Zadeklarowane stałe mogą być jednego z następujących typów danych: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String lub Variant. W związku z tym, że wartość stałej jest znana podczas jej definiowania, użytkownik może określić typ danych w instrukcji Const. Aby uzyskać więcej informacji o typach danych, należy zapoznać się z tematem "Data Type Summary" w Pomocy systemu Visual Basic.

W jednej instrukcji można zadeklarować kilka stałych. Aby określić typ danych, należy podać go dla każdej stałej. W poniższej instrukcji stałe stWiek i stZarobek są zadeklarowane jako, odpowiednio, Integer i Currency.

Const stWiek As Integer = 34, stZarobek As Currency = 35000


Deklarowanie zmiennych

Do deklarowania zmiennej zazwyczaj stosowana jest instrukcja Dim. Instrukcja deklaracji może być umieszczona wewnątrz procedury  wówczas zostanie utworzona zmienna na poziomie procedury. Jeżeli natomiast deklaracja zostanie umieszczona na początku modułu, w sekcji deklaracji, utworzona będzie zmienna na poziomie modułu.

Poniższy przykład tworzy zmienną strNazwa i określa typ danych String.

Dim strNazwa As String

Jeśli instrukcja ta występuje wewnątrz procedury, zmienna strNazwa może być używana tylko w tej procedurze. Jeśli natomiast instrukcja zostanie umieszczona w sekcji deklaracji modułu, zmienna strNazwa będzie dostępna dla wszystkich procedur wewnątrz modułu, lecz nie mogą korzystać z niej procedury w innych modułach projektu. Aby udostępnić tę zmienną wszystkim modułom projektu, należy poprzedzić ją instrukcją Public, tak jak w poniższym przykładzie:

Public strNazwa As String

W celu uzyskania informacji o nazewnictwie zmiennych należy zapoznać się z hasłem "Zasady nazewnictwa w języku Visual Basic" w Pomocy systemu Visual Basic.

Zmienne mogą być deklarowane w jednym z następujących typów danych: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (dla ciągów o zmiennej długości), String * długość (dla ciągów o stałej długości), Object lub Variant. Jeśli typ danych nie zostanie określony, przyjmowany jest domyślnie typ Variant. Ponadto, wykorzystując instrukcję Type, można utworzyć typ zdefiniowany przez użytkownika. W celu uzyskania dalszych informacji o typach danych należy zapoznać się z tematem "Podsumowanie informacji o typach danych" w Pomocy Visual Basic.

W jednej instrukcji można zadeklarować kilka zmiennych. Aby określić typ danych, należy dla każdej zmiennej podać określenie typu danych. W poniższej instrukcji zmienne intX, intY i intZ są zadeklarowane jako zmienne typu Integer.

Dim intX As Integer, intY As Integer, intZ As Integer

W poniższej instrukcji intX i intY są zadeklarowane jako zmienne typu Variant, a tylko zmienna intZ jest typu Integer.

Dim intX, intY, intZ As Integer

Podawanie typu danych dla zmiennej w instrukcji deklaracji nie jest konieczne. Jeśli typ danych zostanie pominięty, zmienna przyjmie typ Variant.

Stosowanie instrukcji Public

Instrukcja Public może być stosowana do deklarowania zmiennych publicznych na poziomie modułu.

Public strNazwa As String

Zmienne publiczne mogą być używane w dowolnych procedurach projektu. Jeśli zmienna publiczna jest zadeklarowana w module standardowym lub module klasy, może być także stosowana w dowolnym projekcie, który odwołuje się do projektu, w którym zadeklarowano tę zmienną publiczną.

Stosowanie instrukcji Private

Instrukcja Private może być stosowana do deklarowania zmiennych prywatnych na poziomie modułu.

Private MojaNazwa As String

Zmienne prywatne mogą być używane tylko przez procedury w tym samym module.

Uwaga   Na poziomie modułu instrukcja Dim jest równoważna instrukcji Private. Instrukcja Private może być stosowana w celu uzyskania bardziej czytelnego i łatwiejszego do interpretacji kodu programu.

Stosowanie instrukcji Static

Jeśli zamiast instrukcji Dim zostanie użyta instrukcja Static, zadeklarowana w ten sposób zmienna zachowuje swoją wartość między wywołaniami funkcji.

Stosowanie instrukcji Option Explicit

Zmienna w języku Visual Basic może być niejawnie zadeklarowana po prostu przez użycie jej w instrukcji podstawienia. Wszystkie zmienne zadeklarowane niejawnie są typu Variant. Zmienne typu Variant wymagają więcej zasobów pamięci niż większość innych zmiennych. Jeżeli zmienne deklarowane są jawnie, z określonym typem danych, aplikacja użytkownika jest bardziej efektywna. Jawne deklarowanie wszystkich zmiennych redukuje niebezpieczeństwo wystąpienia błędów wynikających z konfliktów nazw i pomyłek w pisowni.

Jeśli niejawne deklaracje zmiennych dokonywane przez system Visual Basic są niepożądane, w module przed wszystkimi procedurami należy umieścić instrukcję Option Explicit. Instrukcja ta nakłada wymóg, aby wszystkie zmienne w module były jawnie deklarowane. Jeśli w module umieszczono instrukcję Option Explicit, znalezienie przez kompilator Visual Basic w kodzie programu zmiennej, która nie została uprzednio zadeklarowana lub której nazwę napisano błędnie, powoduje wystąpienie błędu czasu kompilacji.

W celu automatycznego włączania instrukcji Option Explicit we wszystkich nowych modułach należy ustawić odpowiednią opcję środowiska programistycznego Visual Basic. Dokumentacja aplikacji zawiera informacje dotyczące zmiany opcji środowiska Visual Basic. Należy jednak zwrócić uwagę, że opcja ta nie zmienia już napisanego, istniejącego kodu programu.

Uwaga   Tablice o stałym rozmiarze i tablice dynamiczne wymagają jawnych deklaracji.

Deklarowanie zmiennej obiektowej dla automatyzacji

Jeżeli jedna aplikacja jest wykorzystywana do manipulowania obiektami innej aplikacji, należy ustawić odwołanie do biblioteki typów tej innej aplikacji. Po ustawieniu odwołania można zadeklarować zmienną obiektową o typach najbardziej odpowiadających typom obiektów. Na przykład, jeśli podczas sesji z programem Microsoft Access ustawiono odwołanie do biblioteki typów programu Microsoft Excel, możliwe jest zadeklarowanie z poziomu programu Microsoft Access zmiennej typu Worksheet, aby reprezentować nią obiekt typu Worksheet programu Microsoft Excel.

Jeżeli inna aplikacja operuje na obiektach programu Microsoft Access, w większości przypadków możliwe jest deklarowanie zmiennych obiektowych o możliwie najbardziej odpowiednich typach. Można także użyć słowa kluczowego New, aby automatycznie utworzyć nowe wystąpienie obiektu. Konieczne jednak może się okazać wskazanie, że jest to obiekt programu Microsoft Access. Na przykład, deklarując zmienną obiektową służącą do reprezentowania formularza programu Microsoft Access z poziomu systemu Microsoft Visual Basic, należy rozróżnić obiekt typu Form programu Microsoft Access od obiektu typu Form języka Visual Basic. W tym celu należy w deklaracji zmiennej dołączyć nazwę biblioteki typów, jak w poniższym przykładzie:

Dim frmZamówienia As New Access.Form

Niektóre aplikacje nie rozpoznają poszczególnych typów danych programu Microsoft Access. Dla takich aplikacji, pomimo ustawienia odwołania do biblioteki typów programu Microsoft Access, konieczne jest deklarowanie wszystkich zmiennych obiektowych programu Microsoft Access jako zmiennych typu Object. Nie można też stosować słowa kluczowego New do tworzenia nowego wystąpienia obiektu. Poniższy przykład pokazuje, w jaki sposób należy zadeklarować zmienną reprezentującą wystąpienie obiektu programu Microsoft Access typu Application z poziomu aplikacji, która nie rozpoznaje typów obiektowych programu Microsoft Access. Następnie aplikacja tworzy wystąpienie obiektu typu Application.

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

Aby określić, którą składnię udostępnia aplikacja, należy zajrzeć do dokumentacji aplikacji.


Wykonywanie kodu programu podczas ustawiania właściwości

Użytkownik może utworzyć procedury Property Let, Property Set i Property Get, które mają tę samą nazwę. W ten sposób istnieje możliwość utworzenia grupy powiązanych ze sobą procedur, które współpracują. Po zastosowaniu danej nazwy do procedury Property nazwa ta nie może być wykorzystana jako nazwa procedury Sub lub Function, zmiennej lub typu zdefiniowanego przez użytkownika.

Instrukcja Property Let pozwala na utworzenie procedury, która ustawia wartość właściwości. Jednym z przykładów jest procedura Property tworząca właściwość ”Odwrotna” mapy bitowej na formularzu. Poniżej przedstawiono składnię zastosowaną do wywołania procedury Property Let.

Form1.Odwrotna = True

Operacja odwracania mapy bitowej na formularzu jest realizowana wewnątrz procedury Property Let:

Private JestOdwrócona As Boolean

Property Let Odwrotna(X As Boolean)

JestOdwrócona = X

If JestOdwrócona Then

…

(instrukcje)

Else

(instrukcje)

End If

End Property

Zmienna JestOdwrócona zadeklarowana na poziomie formularza przechowuje ustawienie właściwości. Jeżeli zostanie ona zadeklarowana jako Private, użytkownik będzie mógł ją zmienić jedynie za pośrednictwem procedury Property Let. Wskazane jest stosowanie nazw ułatwiających rozpoznawanie, że zmienna jest wykorzystywana przez właściwość.

Poniższa procedura Property Get służy do pobrania bieżącego stanu właściwości Odwrotna:

Property Get Odwrotna() As Boolean

Odwrotna = JestOdwrócona

End Property

Procedury Property ułatwiają wykonywanie kodu programu w momencie ustawiania właściwości. Procedury właściwości można wykorzystać do wykonywania operacji:

•	określenia wartości właściwości, bazujących na nowej wartości właściwości, przed ustawieniem tej wartości.

•	określenia wartości właściwości, bazujących na nowej wartości właściwości, po ustawieniu tej wartości.


Wykonywanie pętli w kodzie programu

Stosując instrukcje warunkowe i instrukcje pętli (zwane strukturami sterowania), użytkownik może tworzyć kod programu w języku Visual Basic realizujący decyzje i powtarzający akcje. Inna użyteczna struktura sterowania, instrukcja With, pozwala na uruchamianie szeregu instrukcji bez konieczności każdorazowego kwalifikowania obiektu.

Stosowanie instrukcji warunkowych w celu realizacji decyzji

Instrukcje warunkowe sprawdzają, czy warunek ma wartość True czy False, a następnie określają jedną lub więcej instrukcji, które zostaną wykonane, zależnie od wyniku. Zazwyczaj, warunek jest wyrażeniem stosującym operator porównania w celu porównania jednej wartości lub zmiennej z drugą.

Wybór rodzaju instrukcji warunkowej

•	If...Then...Else: Wybór gałęzi programu zależnie od tego, czy warunek ma wartość True lub False.

•	Select Case: Wybór gałęzi programu zależnie od zbioru warunków.

Stosowanie pętli do powtarzania fragmentów kodu programu

Stosowanie pętli pozwala na powtarzanie wykonywania grupy instrukcji. Niektóre pętle powodują powtarzanie instrukcji, dopóki warunek ma wartość False; inne natomiast powtarzają instrukcje, dopóki warunek ma wartość True. Istnieją także pętle powtarzające instrukcje określoną liczbę razy lub dla każdego obiektu w kolekcji.

Wybór rodzaju pętli

•	Do...Loop: Wykonuje pętlę, dopóki warunek ma wartość True lub aż warunek przyjmie wartość True.

•	For...Next: Wykorzystuje licznik w celu wykonania instrukcji określoną liczbę razy.

•	For Each...Next: Powtarza grupę instrukcji dla każdego obiektu z kolekcji.

Wykonywanie kilku instrukcji dotyczących jednego obiektu

W języku Visual Basic zazwyczaj konieczne jest określenie obiektu, zanim zostanie uruchomiona dowolna z jego metod lub zmieniona jedna z jego właściwości. Instrukcja With może być stosowana w celu jednorazowego określenia obiektu dla ciągu instrukcji.

•	With: Wykonuje ciąg instrukcji dla tego samego obiektu.


Przyspieszanie pętli For...Next

Dane typu całkowitego zajmują mniej pamięci niż dane typu Variant i zmiana ich wartości jest nieco szybsza. Różnica ta jest jednak zauważalna dopiero wtedy, gdy wykonywane jest wiele tysięcy operacji. Na przykład:

Dim LicznikSzybki As Integer	' Pierwszy przypadek, typ Integer.

For LicznikSzybki = 0 to 32766

Next LicznikSzybki

Dim LicznikWolny As Variant	' Drugi przypadek, typ Variant.

For LicznikWolny = 0 to 32766

Next LicznikWolny

Pierwszy z powyższych przypadków jest wykonywany nieco szybciej niż drugi. Jeśli jednak wartość zmiennej LicznikSzybki przekroczy 32 767, wystąpi błąd. Aby tego uniknąć, można zmienić typ zmiennej LicznikSzybki na Long, który dopuszcza szerszy zakres liczb całkowitych. Ogólnie, im mniejszy typ danych, tym mniej czasu zajmuje zmiana wartości danej tego typu. Dane typu Variant są nieco wolniejsze niż równoważny im inny niż wariantowy typ danych.


Efektywne przekazywanie argumentów

Wszystkie argumenty są przekazywane do procedury przez odwołanie, chyba że zostanie to określone inaczej. Metoda ta jest efektywna, gdyż czas przekazywania w ten sposób wszystkich argumentów jest taki sam i zajmują one tę samą wielkość pamięci (4 bajty) wewnątrz procedury, niezależnie od typu danych argumentów.

Jeżeli w deklaracji procedury zostanie dodane słowo kluczowe ByVal, wskazany argument będzie przekazywany przez wartość. Argumenty przekazywane przez wartość zajmują w procedurze od 2 do 16 bajtów, zależnie od typu danych argumentów. Większe typy danych są przekazywane przez wartość nieco dłużej niż małe. W związku z tym, zmienne typu String i Variant w zasadzie nie powinny być przekazywane przez wartość.

Przekazanie argumentu przez wartość powoduje skopiowanie oryginalnej zmiennej. Zmiany dokonane w argumencie wewnątrz procedury nie są odzwierciedlane w oryginalnej zmiennej. Na przykład:

Function Silnia (ByVal MojaZm As Integer)	' Deklaracja funkcji.

MojaZm = MojaZm - 1

If MojaZm = 0 Then

Silnia = 1

Exit Function

End If

Silnia = Silnia(MojaZm) * (MojaZm + 1)

End Function

' Wywołanie funkcji Silnia dla zmiennej S.

S = 5

Print Silnia(S)	' Wyświetla 120 (5!)

Print S	' Wyświetla 5.

Gdyby nie dodano słowa ByVal w deklaracji funkcji, powyższe instrukcje Print spowodowałyby wyświetlenie wartości 1 i 0. Wynika to z tego, że wówczas zmienna MojaZm odwoływałaby się do zmiennej S, która jest zmniejszana o 1, aż osiągnie wartość 0.

Ponieważ ByVal tworzy kopię argumentu, pozwala to przekazać zmienną typu Variant do funkcji Silnia z przykładu. Nie można przekazywać zmiennej typu Variant przez odwołanie, jeśli procedura deklarująca argument przyjmuje inny typ danych.


Zwracanie ciągów przez funkcje

Niektóre funkcje mają swoje dwie wersje: jedna zwraca typ Variant, a druga zwraca typ String. Wersje zwracające typ Variant są wygodniejsze, gdyż automatycznie realizują konwersję między różnymi typami danych. Pozwalają także na propagowanie wartości Null poprzez wyrażenie. Wersje zwracające typ String są bardziej efektywne, gdyż potrzebują mniej pamięci.

Stosowanie wersji zwracającej typ String jest wskazane, gdy:

•	Program jest bardzo duży i korzysta z wielu zmiennych.

•	Dane zapisywane są bezpośrednio do plików o dostępie swobodnym.

Poniższe funkcje zwracają wartości w zmiennej typu String, jeżeli do nazwy funkcji zostanie dodany znak dolara ($). Funkcje te mają ten sam sposób wywołania i składnię co ich odpowiedniki typu Variant nie zawierające w nazwie znaku dolara.

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	Ucase$
* Może nie być dostępna we wszystkich aplikacjach.


Informacje o kompilacji warunkowej

Kompilacja warunkowa może być wykorzystywana do wybiórczego uruchamiania bloków kodu programu. W takich blokach mogą być umieszczane na przykład instrukcje śledzące służące do porównywania szybkości w różnych wersjach tego samego zadania programistycznego lub instrukcje realizujące wiele wersji językowych aplikacji.

Warunkowa stała kompilatora jest deklarowana w kodzie programu za pomocą dyrektywy #Const, natomiast bloki kodu kompilowane warunkowo są wskazywane dyrektywą #If...Then...#Else. W poniższym przykładzie uruchamiany jest kod analizujący program lub kod ostateczny, zależnie od wartości zmiennej conDebug.

' Zadeklaruj w sekcji deklaracji publiczną stałą kompilacji.

#Const conDebug = 1

Sub WykonajWybiórczo()

#If conDebug = 1 Then

.	' Wykonuj kod z instrukcjami śledzącymi.

.

.

#Else

.	' Wykonuj normalny kod.

.

.

#End If

End Sub


Informacje o cyklu życia zmiennych

Czas, w którym zmienna zachowuje swoją wartość, jest nazywany jej cyklem życia. Wartość zmiennej może zmienić się podczas jej cyklu życia, ale w dalszym ciągu zmienna przechowuje pewną wartość. Kiedy wykonanie programu opuszcza zakres zmiennej, traci ona swoją wartość.

W chwili rozpoczęcia procedury wszystkie zmienne są inicjowane. Zmienna numeryczna jest inicjowana wartością zero, ciąg znaków zmiennej długości przyjmuje wartość ciągu długości zerowej (""), natomiast ciąg znaków stałej długości jest wypełniany znakami reprezentowanymi przez kod ASCII 0 lub Chr(0). Zmienne typu Variant są inicjowane wartością Empty. Każdy element zmiennej typu zdefiniowanego przez użytkownika jest inicjowany tak, jakby był osobną zmienną.

Jeżeli deklarowana jest zmienna obiektowa, w pamięci rezerwowany jest obszar, natomiast wartość zmiennej jest ustawiana na Nothing do czasu przypisania do niej odwołania do obiektu za pomocą instrukcji Set.

Jeśli wartość zmiennej nie zmienia się podczas wykonywania programu, zmienna zachowuje swoją wartość inicjalną do czasu opuszczenia swego zasięgu.

Zmienna na poziomie procedury zadeklarowana za pomocą instrukcji Dim zachowuje swoją wartość do czasu zakończenia działania procedury. Jeśli procedura wywołuje inne procedury, zmienna zachowuje swoją wartość również podczas wykonywania tych procedur.

Jeśli zmienna na poziomie procedury jest zadeklarowana przy użyciu słowa kluczowego Static, zachowuje ona swoją wartość przez cały czas wykonywania programu w dowolnym module. Gdy cały program kończy się, zmienna traci swój zasięg i wartość. Jej cykl życia jest taki sam jak zmiennych poziomu modułu.

Zmienna na poziomie modułu różni się od zmiennej statycznej. W module standardowym lub module klasy zachowuje ona swoją wartość do czasu zatrzymania programu. W module klasy zachowuje swoją wartość tak długo, jak długo istnieje wystąpienie klasy. Zmienne na poziomie modułu zajmują zasoby pamięci do czasu zresetowania ich wartości, dlatego winny być stosowane tylko wtedy, gdy są niezbędne.

Jeśli przed instrukcją Sub lub Function zostanie umieszczone słowo kluczowe Static, wartości wszystkich zmiennych zadeklarowanych na poziomie tej procedury są zachowywane między jej wywołaniami.


Informacje o argumentach nazwanych i nieobowiązkowych

Wywołując procedurę Sub lub Function, można podawać argumenty pozycyjnie, w kolejności ich występowania w definicji procedury, lub też podawać argumenty poprzez ich nazwy, bez zachowywania ich pozycji.

Na przykład, poniższa procedura Sub pobiera trzy argumenty:

Sub PrzekażArg(strNazwa As String, intWiek As Integer, dteUrodz As Date)

Debug.Print strNazwa, intWiek, dteUrodz

End Sub

Procedura ta może zostać wywołana z argumentami podanymi we właściwej kolejności, oddzielonymi przecinkami, zgodnie z poniższym przykładem:

PrzekażArg "Maria", 26, #7-11-69#

Procedurę tę można także wywołać, podając nazwane argumenty, oddzielone od siebie przecinkami.

PrzekażArg intWiek:=26, dteUrodz:=#7/11/69#, strNazwa:="Maria"

Argument nazwany składa się z nazwy argumentu, po której następuje znak dwukropka i znak równości (:=), a następnie wartość argumentu.

Argumenty nazwane są szczególnie użyteczne, gdy wywoływana jest procedura zawierająca argumenty nieobowiązkowe. Jeżeli stosowane są argumenty nazwane, nie trzeba dodawać przecinków w celu wskazania brakujących argumentów pozycyjnych. Stosowanie argumentów nazwanych ułatwia kontrolowanie, które argumenty są przekazywane, a które pomijane.

Argumenty nieobowiązkowe są poprzedzane w definicji procedury słowem kluczowym Optional. Ponadto w definicji procedury można określić wartość domyślną argumentu nieobowiązkowego. Na przykład:

Sub ArgNieob(strWoj As String, Optional strKraj As String = "PL")

. . .

End Sub

Gdy wywoływana jest procedura z argumentem nieobowiązkowym, argument ten można, lecz nie trzeba, określić. Jeśli argument nieobowiązkowy nie zostanie określony, stosowana jest domyślna wartość, jeżeli występuje. Jeżeli nie określono wartości domyślnej, argument przyjmuje wartość dowolnej zmiennej określonego typu.

Poniższa procedura zawiera argument nieobowiązkowy, zmienną varKraj. Funkcja IsMissing określa, czy argument nieobowiązkowy został przekazany do procedury.

Sub ArgNieob(strWoj As String, Optional intRegion As Integer, _

Optional strKraj As String = "PL")

If IsMissing(intRegion) And IsMissing(strKraj) Then

Debug.Print strWoj

ElseIf IsMissing(strKraj) Then

Debug.Print strWoj, intRegion

ElseIf IsMissing(intRegion) Then

Debug.Print strWoj, strKraj

Else

Debug.Print strWoj, intRegion, strKraj

End If

End Sub

Procedura ta może być wywoływana z użyciem argumentów nazwanych, jak to przedstawiono w poniższych przykładach.

ArgNieob strKraj:="PL", strWoj:="WAW"

ArgNieob strWoj:= "WAW", intRegion:=5


Informacje o obiektach, właściwościach, metodach i zdarzeniach

Elementy aplikacji, takie jak skoroszyt, komórka, wykres, formularz lub raport, są reprezentowane jako obiekty. W kodzie programu napisanego w języku Visual Basic konieczne jest określenie obiektu przed zastosowaniem do niego jednej z metod obiektu lub zmianą wartości jednej z jego właściwości.

Kolekcja jest obiektem zawierającym inne obiekty, zazwyczaj, choć nie zawsze, tego samego typu. W programie Microsoft Excel, na przykład, obiekt Workbooks zawiera wszystkie otwarte obiekty typu Workbook. W języku Visual Basic kolekcja Forms zawiera wszystkie obiekty typu Form występujące w aplikacji.

Elementy kolekcji mogą być identyfikowane przez numer lub przez nazwę. Na przykład, w poniższej procedurze Workbooks(1) identyfikuje pierwszy otwarty obiekt typu Workbook.

Sub ZamknijPierwszy()

Workbooks(1).Close

End Sub

Poniższa procedura w celu zidentyfikowania obiektu typu Form stosuje nazwę podaną w postaci ciągu znaków.

Sub ZamknijPierwszy()

Forms("MójFormularz.frm").Close

End Sub

Użytkownik może także manipulować całą kolekcją obiektów, jeżeli obiekty mają te same metody. Na przykład, poniższa procedura zamyka wszystkie otwarte formularze.

Sub ZamknijWszystko()

Forms.Close

End Sub

Metoda jest akcją, którą może wykonać obiekt. Na przykład metoda Add jest metodą obiektu typu ComboBox, gdyż dodaje ona nową pozycję do pola kombi.

Poniższa procedura wykorzystuje metodę Add do dodania nowej pozycji w obiekcie typu ComboBox.

Sub DodajPoz(nowaPoz as String)

Combo1.Add nowaPoz

End Sub

Właściwość jest atrybutem obiektu definiującym jedną z cech obiektu, taką jak rozmiar, kolor lub położenie na ekranie, bądź pewien aspekt jego zachowania, taki jak to, czy jest on włączony lub widoczny. Aby zmieniać cechy obiektu, należy zmieniać wartości jego właściwości.

Aby ustawić wartość właściwości, należy podać odwołanie do obiektu, potem kropkę i nazwę właściwości, po której następuje znak równości (=) i nowa wartość właściwości. Na przykład poniższa procedura zmienia podpis pod formularzem systemu Visual Basic, ustawiając właściwość Caption.

Sub ZmieńNazwę(nowyPodpis)

mójForm.Caption = nowyPodpis

End Sub

Niektórych właściwości nie można ustawić. Dla każdej właściwości odpowiedni temat Pomocy wskazuje, czy właściwość tę można ustawiać i odczytywać (do odczytu i zapisu), tylko czytać (tylko do odczytu) bądź też tylko ustawiać (tylko do zapisu).

Informację o obiekcie można uzyskać, odczytując wartość jednej z jego właściwości. Poniższa procedura wykorzystuje okno komunikatu w celu wyświetlenia tytułu pojawiającego się u góry aktualnie aktywnego formularza.

Sub DajNazwęForm()

nazwaForm = Screen.ActiveForm.Caption

MsgBox nazwaForm

End Sub

Zdarzenie jest akcją rozpoznawaną przez obiekt, taką jak kliknięcie myszą lub naciśnięcie klawisza, dla której istnieje możliwość napisania reagującego na nią kodu programu. Zdarzenia mogą pojawiać się jako wynik akcji podjętej przez użytkownika lub kod programu, mogą też być wyzwalane przez system.

Zwracanie obiektów

Każda aplikacja wykorzystuje jakiś sposób zwracania obiektów, które zawiera. Nie jest to jednak zawsze ten sam sposób, stąd należy odwołać się do tematu Pomocy dotyczącego stosowanego w aplikacji obiektu lub kolekcji, aby dowiedzieć się, jak zwrócić obiekt.


Informacje o automatyzacji

Automatyzacja (dawniej: automatyzacja OLE) jest własnością modelu o nazwie Component Object Model (COM), która jest standardową technologią wykorzystywaną przez aplikacje w celu udostępniania ich obiektów narzędziom do rozwoju systemów, językom makr i innym aplikacjom umożliwiającym korzystanie z automatyzacji. Na przykład, aplikacja arkusza kalkulacyjnego może udostępniać arkusz kalkulacyjny, wykres, komórkę lub zakres komórek — każdy element jako obiekt innego typu. Edytor tekstów może udostępniać obiekty, takie jak aplikacja, dokument, akapit, zdanie, zakładkę lub zaznaczenie.

Jeżeli aplikacja obsługuje automatyzację, obiekty aplikacji stają się dostępne poprzez system Visual Basic. System Visual Basic może być wykorzystany do manipulowania tymi obiektami drogą wywoływania metod obiektów lub przez pobieranie i ustawianie właściwości obiektów. Na przykład, można utworzyć obiekt automatyzacji o nazwie MójObiekt i napisać poniższy kod programu w celu uzyskania dostępu do tego obiektu:

MójObiekt.Insert "Pozdrawiam wszystkich."	' Umieść tekst.

MójObiekt.Bold = True	' Formatuj tekst.

MójObiekt.SaveAs  "C:\WORDPROC\DOCS\TESTOBJ.DOC"	' Zapisz obiekt.

W celu uzyskiwania dostępu do obiektu automatyzacji mogą być stosowane poniższe instrukcje:

Funkcja	Opis
CreateObject	Tworzy nowy obiekt określonego typu.
GetObject	Odczytuje obiekt z pliku.
W celu uzyskania bardziej szczegółowych informacji o metodach i właściwościach udostępnianych przez aplikację należy zajrzeć do dokumentacji aplikacji. Obiekty, funkcje, właściwości i metody udostępniane przez aplikację są zazwyczaj zdefiniowane w bibliotece obiektowej aplikacji.


Informacje o tablicach parametrów

Tablica parametrów może być stosowana do przekazywania do procedury tablicy argumentów. Przy definiowaniu procedury nie jest konieczna znajomość liczby elementów tablicy.

Do oznaczenia tablicy parametrów należy używać słowa kluczowego ParamArray. Tablica musi być zadeklarowana jako tablica typu Variant i musi być ostatnim argumentem w definicji procedury.

Poniższy przykład pokazuje, w jaki sposób można zdefiniować procedurę korzystającą z tablicy parametrów:

Sub DowolnaLiczbaArg(strNazwa As String, ParamArray intPunkty() As Variant)

Dim intI As Integer

Debug.Print strNazwa; "    Punktacja"

' Zastosuj funkcję UBound, aby określić górne ograniczenie tablicy.

For intI = 0 To UBound(intPunkty())

Debug.Print "          "; intPunkty(intI)

Next intI

End Sub

Poniżej przedstawiono przykłady wywołania powyższej procedury:

DowolnaLiczbaArg "Jacek", 10, 26, 32, 15, 22, 24, 16

DowolnaLiczbaArg "Agata", "Dużo", "Mało", "Średnio", "Dużo"


Informacje o zasięgach i widzialności

Zasięg odnosi się do dostępności zmiennych, stałych lub procedur dla innej procedury. Występują trzy poziomy zasięgów: poziom procedury, prywatny poziom modułu i publiczny poziom modułu.

Zakres zmiennej jest określany podczas jej deklarowania. Dobrą praktyką jest jawne deklarowanie wszystkich zmiennych, w celu uniknięcia błędów konfliktów nazw pomiędzy zmiennymi w różnych zasięgach.

Definiowanie zasięgu poziomu procedury

Zmienna lub stała zdefiniowana wewnątrz procedury nie jest widziana poza tą procedurą. Jedynie procedura zawierająca deklarację zmiennej może korzystać z tej zmiennej. W poniższym przykładzie pierwsza procedura wyświetla okno komunikatu zawierające ciąg znaków. Druga procedura wyświetla puste okno komunikatu, gdyż zmienna strKom jest lokalna w pierwszej procedurze.

Sub ZmLokalna()

Dim strKom As String

strKom = "Ta zmienna nie może być użyta poza tą procedurą."

MsgBox strKom

End Sub

Sub PozaZasięgiem()

MsgBox strKom

End Sub

Definiowanie zasięgu prywatnego poziomu modułu

Zmienne i stałe na poziomie modułu można definiować w sekcji deklaracji modułu. Zmienne na poziomie modułu mogą być publiczne lub prywatne. Zmienne publiczne są dostępne we wszystkich procedurach wszystkich modułów projektu; zmienne prywatne są dostępne tylko dla procedur w tym module. Domyślnie, zmienne zadeklarowane za pomocą instrukcji Dim w sekcji deklaracji modułu są traktowane jako prywatne. Jeśli jednak zmienna zostanie poprzedzona słowem kluczowym Private, wówczas jej zasięg w kodzie programu staje się bardziej oczywisty.

W poniższym przykładzie zmienna znakowa strKom jest dostępna we wszystkich procedurach zdefiniowanych w module. Wywołanie drugiej procedury powoduje wyświetlenie w oknie dialogowym na ekranie zawartości zmiennej znakowej strKom.

' Dodaj poniższą deklarację do sekcji deklaracji modułu.

Private strKom sAs String

Sub InicjujZmPrywatną()

strKom = "Ta zmienna nie jest dostępna poza tym modułem."

End Sub

Sub UżyjZmPrywatnej()

MsgBox strKom

End Sub

Uwaga   Procedury publiczne w module standardowym lub module klasy są dostępne w każdym projekcie wskazującym. Aby ograniczyć zasięg wszystkich procedur w module do bieżącego projektu, należy w sekcji deklaracji modułu umieścić instrukcję Option Private Module. Zmienne i procedury publiczne pozostają dostępne dla innych procedur w bieżącym projekcie, natomiast nie są dostępne dla projektów odwołujących się do tego projektu.

Definiowanie zasięgu publicznego poziomu modułu

Jeśli zmienna na poziomie modułu zostanie zadeklarowana jako publiczna, jest ona dostępna we wszystkich procedurach projektu. W poniższym przykładzie zmienna znakowa strKom może być użyta w każdej procedurze każdego modułu projektu.

' Dołącz do sekcji deklaracji modułu.

Public strKom As String

Domyślnie, wszystkie procedury są publiczne, z wyjątkiem procedur obsługi zdarzeń. Kiedy w języku Visual Basic tworzona jest procedura obsługi zdarzenia, przed deklaracją procedury umieszczane jest automatycznie słowo kluczowe Private. W przypadku wszystkich innych procedur, jeżeli procedura nie ma być publiczna, należy jawnie zadeklarować ją ze słowem kluczowym Private.

Procedury, zmienne i stałe publiczne zdefiniowane w modułach standardowych lub modułach klas mogą być wykorzystywane przez projekty wskazujące. W pierwszym jednak rzędzie należy ustawić odwołanie do projektu, w którym są one zdefiniowane.

Procedury, zmienne i stałe publiczne zdefiniowane w innych modułach niż moduły standardowe lub moduły klas, to jest w takich jak moduły formularza lub moduły raportów, nie są dostępne dla projektów wskazujących, gdyż moduły te są prywatne w stosunku do projektu, w którym występują.


Informacje o typie danych Variant

Typ danych Variant jest nadawany automatycznie, jeżeli podczas deklarowania stałej, zmiennej lub argumentu nie zostanie określony typ danych. Zmienne zadeklarowane jako typu Variant mogą zawierać ciąg znaków, datę, czas, wartość Boolean lub numeryczną i mogą automatycznie poddawać te wartości konwersji. Wartości numeryczne typu Variant wymagają 16 bajtów pamięci (co jest istotne jedynie dla dużych procedur lub złożonych modułów) i są wolniejsze w dostępie niż zmienne o jawnie zadeklarowanych innych typach danych. Typ danych Variant jest rzadko stosowany dla stałych. Wartość będąca ciągiem typu Variant wymaga 22 bajtów pamięci.

Poniższe instrukcje tworzą zmienne typu Variant:

Dim mojaZm

Dim twojaZm As Variant

taZm = "To jest pewien tekst."

Ostatnia instrukcja nie deklaruje jawnie zmiennej taZm, lecz wykorzystuje deklarację niejawną (automatyczną). Zmienne zadeklarowane nie jawnie są określane jako zmienne typu Variant.

Wskazówka   Jeśli dla zmiennej lub argumentu zostanie określony typ danych, a potem nastąpi próba użycia niewłaściwego typu danych, zostanie wygenerowany błąd. W celu uniknięcia błędów związanych z typami danych należy stosować jedynie niejawne zmienne (typu Variant) lub jawnie deklarować wszystkie zmienne i określać typ danych. Zalecana jest druga z tych metod.


Informacje o składni języka Visual Basic

Opis składni zawarty w temacie Pomocy języka Visual Basic dotyczącym konkretnej metody, instrukcji lub procedury typu Function prezentuje wszystkie elementy niezbędne do poprawnego zastosowania metody, instrukcji lub funkcji. Przykłady przedstawione poniżej wyjaśniają, jak należy interpretować najistotniejsze elementy składni.

Składnia metody Activate

obiekt.Activate

W składni metody Activate słowo "obiekt" pisane kursywą jest wskazaniem miejsca na podanie informacji — w tym przypadku jest to fragment kodu programu zwracający obiekt. Słowa pisane czcionką pogrubioną powinny być wprowadzane dokładnie w przedstawionej postaci. Na przykład, poniższa procedura uaktywnia drugie okno aktywnego dokumentu.

Sub Uaktywnij()

Windows(2).Activate

End Sub

Składnia funkcji MsgBox

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

W składni funkcji MsgBox słowa pisane czcionką pogrubioną i pochyloną oznaczają nazwane argumenty tej funkcji. Argumenty zawarte w nawiasach prostokątnych są nieobowiązkowe. (Samych nawiasów prostokątnych nie należy umieszczać w kodzie programu pisanego w języku Visual Basic.) Dla funkcji MsgBox jedynym argumentem, który trzeba podać, jest tekst wyświetlany w oknie (argument prompt).

Argumenty funkcji i metod mogą być określane pozycyjnie lub przez nazwę. Aby określić argumenty pozycyjnie, należy wymienić wszystkie argumenty w kolejności takiej, jak w składni, oddzielając od siebie argumenty przecinkami, na przykład:

MsgBox "Odpowiedź jest poprawna!",0,"Okno odpowiedzi"

Aby określić argument przez nazwę, należy podać nazwę argumentu, a po niej znak dwukropka, znak równości (:=) i wartość argumentu. Argumenty nazwane mogą być określane w dowolnej kolejności, na przykład:

MsgBox Title:="Okno odpowiedzi", Prompt:="Odpowiedź jest poprawna!"

W składni funkcji i niektórych metod występują argumenty w nawiasach. Te funkcje i metody zwracają wartości, stąd aby można było przypisywać te wartości do zmiennych konieczne jest umieszczenie argumentów w nawiasach. Jeśli zwracana wartość zostanie zignorowana lub jeśli nie zostaną podane żadne argumenty, nawiasy nie powinny być umieszczane. Metody, które nie zwracają wartości, nie wymagają umieszczania argumentów w nawiasach. Wskazówki te odnoszą się zarówno do argumentów pozycyjnych, jak i nazwanych.

W poniższym przykładzie wartością zwracaną przez funkcję MsgBox jest numer wskazujący wybrany przycisk, zapamiętywany w zmiennej mojaZm. Nawiasy są niezbędne, gdyż wykorzystywana jest zwracana przez funkcję wartość. Drugie okno komunikatu wyświetla wartość tej zmiennej.

Sub Pytanie()

mojaZm = MsgBox(Prompt:="Jestem zadowolony z mojej pracy.", _

Title:="Okno odpowiedzi", Buttons:="4")

MsgBox mojaZm

End Sub

Składnia instrukcji Option

Option Compare {Binary | Text | Database}

W składni instrukcji Option Compare nawiasy klamrowe i pionowe kreski wskazują na konieczność wyboru jednego z trzech elementów. (Nawiasów klamrowych nie należy umieszczać w instrukcji języka Visual Basic). Na przykład poniższa instrukcja określa, że wewnątrz modułu ciągi znaków będą porównywane w porządku sortowania, który nie zależy od wielkości liter.

Option Compare Text

Składnia instrukcji Dim

Dim nazwa_zmiennej[([indeksy])] [As typ] [, nazwa_zmiennej[([indeksy])] [As typ]] . . .

W składni instrukcji Dim słowo Dim jest wymaganym słowem kluczowym. Jedynym obowiązkowym elementem jest nazwa_zmiennej. Na przykład poniższa instrukcja tworzy trzy zmienne: Zm1, Zm2 i Zm3. Są one automatycznie deklarowane jako zmienne typu Variant.

Dim Zm1, Zm2, Zm3

Poniższy przykład deklaruje zmienną typu String. Dodanie typu danych pozwala na zaoszczędzenie pamięci i ułatwia lokalizację błędów w kodzie programu.

Dim Odpow1 As String

Aby w jednej instrukcji zadeklarować kilka zmiennych należy dla każdej zmiennej podać typ danych. Zmienne zadeklarowane bez określenia typu danych są automatycznie deklarowane jako zmienne typu Variant.

Dim x As Integer, y As Integer, z As Integer

W poniższej instrukcji zmiennym x i y jest przypisywany typ Variant. Jedynie zmiennej z jest nadawany typ Integer.

Dim x, y, z As Integer

Jeśli deklarowana jest zmienna tablica, konieczne jest umieszczenie nawiasów. Podanie indeksów jest nieobowiązkowe. W poniższej instrukcji deklarowana jest tablica dynamiczna o nazwie mojaTablica.

Dim mojaTablica()


Stosowanie tablic

Do pracy ze zbiorem wartości o tym samym typie danych można zadeklarować tablicę. Tablica jest pojedynczą zmienną zawierającą wiele komórek przeznaczonych do przechowywania wartości, podczas gdy typowa zmienna ma jedynie jedną komórkę, w której można przechowywać tylko jedną wartość. Do tablicy można odwoływać się w całości, jeżeli konieczne jest odwołanie się do wszystkich wartości, które ona przechowuje, lub też można odwoływać się do jej pojedynczych elementów.

Na przykład, w celu przechowywania dziennych wydatków na każdy dzień roku lepiej jest zadeklarować jedną zmienną tablicową o 365 elementach niż 365 zmiennych. Każdy element tablicy zawiera jedną wartość. Poniższa instrukcja deklaruje zmienną tablicową curWydatki o 365 elementach. Domyślnie, tablica jest indeksowana od zera, stąd górnym ograniczeniem tablicy jest 364, a nie 365.

Dim curWydatki(364) As Currency

Aby ustawić wartość pojedynczego elementu, należy określić indeks tego elementu. Poniższy przykład przypisuje inicjalną wartość 20 do każdego elementu tablicy.

Sub WypełnijTablicę()

Dim curWydatki(364) As Currency

Dim intI As Integer

For intI = 0 to 364

curWydatki(intI) = 20

Next

End Sub

Zmiana dolnego ograniczenia

W celu zmiany domyślnego indeksu pierwszego elementu z 0 na 1 należy na początku modułu użyć instrukcji Option Base. W poniższym przykładzie instrukcja Option Base zmienia indeks pierwszego elementu, natomiast kolejna instrukcja Dim deklaruje zmienną tablicową curWydatki zawierającą 365 elementów.

Option Base 1

Dim curWydatki(365) As Currency

Istnieje także możliwość jawnego ustawienia dolnej granicy indeksów przy użyciu klauzuli To, tak jak w poniższym przykładzie.

Dim curWydatki(1 To 365) As Currency

Dim strDzień(7 To 13) As String

Przechowywanie danych typu Variant w tablicach

Tablice wartości typu Variant można tworzyć na dwa sposoby. Jednym sposobem jest zadeklarowanie tablicy typu Variant, tak jak w poniższym przykładzie:

Dim varDane(3) As Variant

varDane(0) = "Anna Kowalska"

varDane(1) = "ul. Portowa 42/2"

varDane(2) = 38

varDane(3) = Format("06-09-1952", "General Date")

Drugim sposobem jest przypisanie tablicy zwracanej przez funkcję Array do zmiennej typu Variant, tak jak w poniższym przykładzie:

Dim varDane As Variant

varDane = Array("Jan Kowalski", "ul. Portowa 42/2", 38, _

Format("06-09-1952", "General Date"))

Elementy tablicy o wartościach typu Variant identyfikowane są za pomocą indeksów, niezależnie od techniki zastosowanej do utworzenia tablicy. Na przykład, poniższa instrukcja może być dodana do dowolnego z poprzednich przykładów:

MsgBox "Dane dla " & varDane(0) & " zostały zarejestrowane."

Stosowanie tablic wielowymiarowych

W języku Visual Basic można zadeklarować tablice o maksymalnie 60 wymiarach. Na przykład, poniższa instrukcja powoduje zadeklarowanie tablicy 2-wymiarowej o rozmiarze 5 na 10 elementów.

Dim sngMulti(1 To 5, 1 To 10) As Single

Jeżeli tablicę wyobrazimy sobie jako macierz, pierwszy z argumentów reprezentuje wiersze, a drugi argument reprezentuje kolumny.

Do przetwarzania tablic wielowymiarowych należy stosować zagnieżdżone instrukcje For...Next. Poniższa procedura wypełnia tablicę dwuwymiarową wartościami typu Single.

Sub WypełnijTablicęMulti()

Dim intI As Integer, intJ As Integer

Dim sngMulti(1 To 5, 1 To 10) As Single

' Wypełnij tablicę wartościami.

For intI = 1 To 5

For intJ = 1 To 10

sngMulti(intI, intJ) = intI * intJ

Debug.Print sngMulti(intI, intJ)

Next intJ

Next intI

End Sub


Stosowanie stałych

Kod programu może zawierać często występujące wartości stałe, lub też może zależeć od pewnych liczb, trudnych do zapamiętania i nie mających oczywistego znaczenia. Można jednak kod programu uczynić łatwiejszym do czytania i modyfikowania, wykorzystując stałe. Stała jest nazwą o określonym znaczeniu, która zastępuje niezmienną w kodzie programu wartość liczbową lub ciąg znaków. Nie można zmodyfikować stałej lub przypisać do niej nowej wartości, tak jak to jest możliwe w przypadku zmiennej.

Dostępne są trzy typy stałych:

•	Stałe wewnętrzne lub stałe zdefiniowane przez system są udostępniane przez aplikacje i formanty. Inne aplikacje dostarczające bibliotek obiektowych, takie jak Microsoft Access, Microsoft Excel i Microsoft Project, również udostępniają listę stałych, których można używać z ich obiektami, metodami i właściwościami. Listę dostępnych stałych dostarczanych przez poszczególne biblioteki obiektów można uzyskać w oknie Przeglądarka obiektów.

Stałe języka Visual Basic są umieszczone w bibliotece Visual Basic (VB), bibliotece Visual Basic for Applications (VBA) i bibliotece obiektów dostępu do danych (Data Access Objects, DAO).

1.	Uwaga   Język Visual Basic w obecnej wersji w dalszym ciągu rozpoznaje stałe w aplikacjach utworzonych we wcześniejszych wersjach systemu Visual Basic lub Visual Basic for Applications. Stałe można uaktualnić na te, które wyświetla Przeglądarka obiektów. Stałe pokazane w oknie Przeglądarki obiektów nie muszą być deklarowane w aplikacji.

•	Stałe symboliczne lub zdefiniowane przez użytkownika są deklarowane przy użyciu instrukcji Const.

•	Warunkowe stałe kompilatora są deklarowane przy użyciu instrukcji #Const.

We wcześniejszych wersjach języka Visual Basic nazwy stałych były zazwyczaj pisane wielkimi literami i zawierały znak podkreślenia. Na przykład:

TILE_HORIZONTAL

Stałe wewnętrzne są obecnie kwalifikowane w celu uniknięcia problemów w sytuacji, gdy stałe o takiej samej nazwie istnieją w więcej niż jednej bibliotece obiektów. Mogą one mieć nawet przypisane inne wartości. Istnieją dwa sposoby kwalifikowania nazw stałych:

•	Przez przedrostek

•	Przez odwołanie do biblioteki

Kwalifikowanie stałych przez przedrostek

Stałe wewnętrzne, które są udostępniane przez wszystkie obiekty, występują w formacie z literami różnej wielkości, z dwuznakowym przedrostkiem wskazującym bibliotekę obiektów, która definiuje stałą. Stałe zawarte w bibliotekach systemów Visual Basic i Visual Basic for Applications są uzupełniane z przodu symbolem "vb"; stałe pochodzące z biblioteki obiektów dostępu do danych (DAO) są poprzedzane symbolem "db"; natomiast stałe z biblioteki obiektów programu Microsoft Excel są poprzedzane symbolem "xl". Poniższe przykłady ilustrują, jak dla formantów użytkownika zmieniają się przedrostki w bibliotece typów.

•	vbTileHorizontal

•	dbAppendOnly

•	xlDialogBorder

•	grdAlignCenter

Kwalifikowanie stałych przez odwołanie do biblioteki

Możliwe jest kwalifikowanie przez odwołanie do biblioteki, z wykorzystaniem poniższej składni:

[nazwa_bibl.] [nazwa_mod.]nazwa_stałej

Składnia kwalifikowania stałych zawiera następujące elementy:

Element	Opis
nazwa_bibl	Element nieobowiązkowy. Nazwa biblioteki typów definiującej stałą. Dla większości formantów użytkownika jest to także nazwa klasy formantu. Jeśli nazwa klasy formantu nie jest znana, należy ustawić wskaźnik myszy w przyborniku nad formantem. Nazwa klasy zostanie wyświetlona w etykietce narzędzia.
nazwa_mod	Element nieobowiązkowy. Nazwa modułu wewnątrz biblioteki typów, w którym zdefiniowano stałą. Nazwa modułu może zostać określona za pomocą Przeglądarki obiektów.
nazwa_stałej	Nazwa stałej zdefiniowana w bibliotece typów.
Na przykład:

Moduł3.DoLewej


Efektywne stosowanie typów danych

Jeżeli nie zostanie to określone inaczej, nie zadeklarowanym zmiennym jest przypisywany typ danych Variant. Typ ten ułatwia pisanie programów, nie jest on jednak zawsze najbardziej efektywnym typem danych.

Wskazane jest stosowanie innych typów danych, jeśli:

•	Program jest bardzo duży i używa wielu zmiennych.

•	Program musi być wykonywany możliwie najszybciej.

•	W programie realizowany jest zapis danych bezpośrednio do plików o dostępie swobodnym.

Poza typem Variant, obsługiwane typy danych obejmują Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object i String. Do zadeklarowania zmiennej określonego typu służy instrukcja Dim, na przykład:

Dim X As Integer

Instrukcja ta deklaruje zmienną X jako daną typu całkowitego — czyli jako liczbę całkowitą o wartości z przedziału od -32 768 do 32 767. Próba przypisania do zmiennej X liczby spoza tego zakresu spowoduje wystąpienie błędu. Jeśli nastąpi próba przypisania do zmiennej X liczby ułamkowej, liczba jest zaokrąglana. Na przykład:

X = 32768	' Błąd

X = 5.9	' Ustawia x na 6.


Stosowanie instrukcji Do...Loop

W celu wykonania bloku instrukcji nieokreśloną liczbę razy należy użyć instrukcji Do...Loop. Instrukcje są powtarzane albo dopóki warunek ma wartość True, albo aż warunek przyjmie wartość True.

Powtarzanie instrukcji, dopóki warunek ma wartość True

Są dwa sposoby zastosowania słowa kluczowego While do sprawdzenia warunku w instrukcji Do...Loop. Warunek można sprawdzać przed wejściem do pętli lub po wykonaniu pętli przynajmniej jeden raz.

W poniższej procedurze WhileNajpierw warunek jest sprawdzany przed wejściem do pętli. Jeśli wartość Liczba będzie ustawiona na 9 zamiast na 20, instrukcje wewnątrz pętli nie zostaną w ogóle wykonane. W procedurze WhilePotem instrukcje wewnątrz pętli zostaną wykonane jeden raz, zanim warunek przyjmie wartość False.

Sub WhileNajpierw()

licznik = 0

Liczba = 20

Do While Liczba > 10

Liczba = Liczba - 1

licznik = licznik + 1

Loop

MsgBox "Pętla wykonała " & licznik & " powtórzeń."

End Sub

Sub WhilePotem()

licznik = 0

Liczba = 9

Do

Liczba = Liczba - 1

licznik = licznik + 1

Loop While Liczba > 10

MsgBox "Pętla wykonała " & licznik & " powtórzeń."

End Sub

Powtarzanie instrukcji, aż warunek przyjmie wartość True

Są dwa sposoby zastosowania słowa kluczowego Until do sprawdzenia warunku w instrukcji Do...Loop. Warunek można sprawdzać przed wejściem do pętli (tak jak pokazano w procedurze UntilNajpierw) lub po wykonaniu pętli przynajmniej jeden raz (tak jak pokazano w procedurze UntilPotem). Pętla powtarzana jest tak długo, jak długo warunek ma wartość False.

Sub UntilNajpierw()

licznik = 0

Liczba = 20

Do Until Liczba = 10

Liczba = Liczba - 1

licznik = licznik + 1

Loop

MsgBox "Pętla wykonała " & licznik & " powtórzeń."

End Sub

Sub UntilPotem()

licznik = 0

Liczba = 1

Do

Liczba = Liczba + 1

licznik = licznik + 1

Loop Until Liczba = 10

MsgBox " Pętla wykonała " & licznik & " powtórzeń."

End Sub

Wychodzenie z instrukcji Do...Loop z wnętrza pętli

Opuszczenie pętli Do...Loop jest możliwe przy użyciu instrukcji Exit Do. Na przykład, aby wyjść z pętli nieskończonej, należy użyć instrukcji Exit Do w bloku instrukcji wykonywanych po przyjęciu przez pewien warunek wartości True w instrukcji If...Then...Else lub w instrukcji Select Case. Jeżeli warunek ma wartość False, pętla jest powtarzana jak zwykle.

W poniższym przykładzie zmiennej Liczba jest przypisana wartość powodująca wykonywanie pętli nieskończonej. Instrukcja If...Then...Else sprawdza ten warunek, a następnie realizuje wyjście z pętli, uniemożliwiając w ten sposób nieskończone wykonywanie się pętli.

Sub PrzykładExit()

licznik = 0

Liczba = 9

Do Until Liczba = 10

Liczba = Liczba - 1

licznik = licznik + 1

If Liczba < 10 Then Exit Do

Loop

MsgBox "Pętla wykonała " & licznik & " powtórzeń."

End Sub

Uwaga   Aby przerwać pętlę nieskończoną, należy nacisnąć klawisze ESC lub CTRL+BREAK.


Stosowanie instrukcji For...Next

Instrukcje For...Next można stosować w celu powtarzania bloku instrukcji określoną liczbę razy. Pętle For wykorzystują zmienną licznikową, której wartość jest zwiększana lub zmniejszana przy każdym powtórzeniu pętli.

Poniższa procedura powoduje, że komputer wyda dźwięk 50 razy. Instrukcja For określa zmienną licznikową x i jej początkową oraz końcową wartość. Instrukcja Next powoduje zwiększenie zmiennej licznikowej o 1.

Sub Dźwięki()

For x = 1 To 50

Beep

Next x

End Sub

Stosując słowo kluczowe Step, można zwiększać lub zmniejszać zmienną licznikową o określoną wartość. W poniższym przykładzie zmienna licznikowa j jest przy każdym obiegu pętli zwiększana o 2. Kiedy pętla kończy się, suma jest sumą liczb 2, 4, 6, 8 i 10.

Sub SumaParz()

For j = 2 To 10 Step 2

suma = suma + j

Next j

MsgBox "Suma całkowita jest równa " & suma

End Sub

Aby zmniejszać zmienną licznikową, należy zastosować ujemną wartość Step i określić wartość końcową mniejszą od wartości początkowej. W poniższym przykładzie zmienna licznikowa Liczba jest przy każdym obiegu pętli zmniejszana o 2. Kiedy pętla kończy się, suma jest sumą liczb 16, 14, 12, 10, 8, 6, 4 i 2.

Sub NowaSuma()

For Liczba = 16 To 2 Step -2

suma = suma + Liczba

Next Liczba

MsgBox " Suma całkowita jest równa " & suma

End Sub

Uwaga   Umieszczanie nazwy zmiennej licznikowej po instrukcji Next nie jest konieczne. W powyższych przykładach nazwa zmiennej licznikowej została dodana w celu poprawy czytelności.

Wyjście z instrukcji For...Next przed osiągnięciem przez licznik wartości końcowej jest możliwe przy użyciu instrukcji Exit For. Na przykład, gdy pojawia się błąd, instrukcja Exit For może wystąpić w bloku instrukcji wykonywanych wtedy, gdy warunek przyjmuje wartość True w instrukcji If...Then...Else lub w instrukcji Select Case, która sprawdza wystąpienie tego właśnie błędu. Jeżeli błąd nie występuje, warunek instrukcji If…Then…Else ma wartość False, więc pętla jest powtarzana dalej.


Stosowanie instrukcji For Each...Next

Instrukcje For Each...Next powodują powtarzanie bloku instrukcji dla każdego obiektu w kolekcji lub każdego elementu w tablicy. System Visual Basic automatycznie ustawia zmienne przy każdym obiegu pętli. Na przykład, poniższa procedura zamyka wszystkie formularze z wyjątkiem formularza zawierającego wykonywaną procedurę.

Sub ZamknijForms()

For Each frm In Application.Forms

If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

Next

End Sub

Poniższy kod programu wykonuje pętlę dla każdego elementu tablicy i ustawia wartość każdego z nich na wartość zmiennej indeksowej I.

Dim Tablica(10) As Integer, I As Variant

For Each I In Tablica

Tablica(I) = I

Next I

Wykonywanie pętli dla zakresu komórek

Instrukcja For Each...Next może być stosowana do realizacji pętli wykonującej operacje dla wszystkich komórek podanego zakresu. Poniższa procedura wykonuje pętlę dla zakresu A1:D10 na arkuszu i ustawia wartość każdej liczby na 0 (zero), jeżeli jej wartość bezwzględna jest mniejsza od 0.01.

Sub DoZera()

For Each mójObiekt in mojaKolekcja

If Abs(mójObiekt.Value) < 0.01 Then mójObiekt.Value = 0

Next

End Sub

Wyjście z pętli For Each...Next przed jej zakończeniem

Wyjście z pętli For Each...Next jest możliwe przy użyciu instrukcji Exit For. Na przykład, gdy pojawia się błąd, instrukcja Exit For może wystąpić w bloku instrukcji wykonywanych wtedy, gdy warunek przyjmuje wartość True w instrukcji If...Then...Else lub w instrukcji Select Case, która sprawdza wystąpienie tego właśnie błędu. Jeżeli błąd nie występuje, warunek instrukcji If…Then…Else ma wartość False, więc pętla jest powtarzana dalej.

Poniższy przykład wyszukuje pierwszą komórkę z zakresu A1:B5, która nie zawiera liczby. Znalezienie takiej komórki powoduje wyświetlenie komunikatu i opuszczenie pętli przy użyciu instrukcji Exit For.

Sub SprawdźLiczbę()

For Each mójObiekt In MojaKolekcja

If IsNumeric(mójObiekt.Value) = False Then

MsgBox "Obiekt zawiera wartość inną niż numeryczna."

Exit For

End If

Next

End Sub


Stosowanie instrukcji If...Then...Else

Instrukcja If...Then...Else służy do wykonywania określonej instrukcji lub bloku instrukcji, zależnie od wartości warunku. Instrukcje If...Then...Else mogą być zagnieżdżane na dowolną liczbę poziomów. Jednak w celu poprawy czytelności, zamiast wielu poziomów zagnieżdżonych instrukcji If...Then...Else wygodniejsze jest stosowanie instrukcji Select Case.

Wykonywanie instrukcji, gdy warunek jest równy True

W celu wykonania tylko jednej instrukcji w przypadku, gdy warunek ma wartość True, należy zastosować jednowierszową składnię instrukcji If...Then...Else. Poniższy przykład pokazuje składnię jednowierszową, bez słowa kluczowego Else:

Sub UstalDatę()

mojaData = #2/13/95#

If mojaData < Now Then mojaData = Now

End Sub

Aby wykonać więcej niż jeden wiersz kodu programu, konieczne jest zastosowanie składni wielowierszowej. Składnia ta zawiera instrukcję End If, tak jak w poniższym przykładzie:

Sub Alarmuj(wartość as Long)

If wartość = 0 Then

AlertLabel.ForeColor = "Red"

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

End If

End Sub

Wykonywanie pewnych instrukcji, gdy warunek ma wartość True, i wykonywanie innych, gdy ma wartość False

Aby zdefiniować dwa bloki wykonywalnych instrukcji, należy zastosować instrukcję If...Then...Else. Jeden blok jest wykonywany wtedy, gdy warunek ma wartość True, drugi natomiast, gdy warunek ma wartość False.

Sub Alarmuj(wartość as Long)

If wartość = 0 Then

AlertLabel.ForeColor = vbRed

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

Else

AlertLabel.Forecolor = vbBlack

AlertLabel.Font.Bold = False

AlertLabel.Font.Italic = False

End If

End Sub

Testowanie drugiego warunku, gdy pierwszy ma wartość False

Instrukcja ElseIf dodana do instrukcji If...Then...Else pozwala na sprawdzanie drugiego warunku, jeżeli pierwszy ma wartość False. Na przykład, poniższa funkcja oblicza premię w oparciu o klasyfikację stanowisk. Instrukcja następująca po instrukcji Else jest wykonywana, jeżeli warunki we wszystkich instrukcjach If i ElseIf są równe False.

Function Premia(stanowisko, pensja)

If stanowisko = 1 Then

Premia = pensja * 0.1

ElseIf stanowisko = 2 Then

Premia = pensja * 0.09

ElseIf stanowisko = 3 Then

Premia = pensja * 0.07

Else

Premia = 0

End If

End Function


Stosowanie nawiasów w kodzie programu

Procedury Sub, instrukcje wbudowane i niektóre metody nie zwracają wartości, stąd ich argumenty nie są umieszczane w nawiasach. Na przykład:

Proc1 "stringArgument", integerArgument

Procedury Function, funkcje wbudowane i niektóre metody zwracają wartości, można jednak te wartości ignorować. Jeśli zwracana wartość zostanie zignorowana, nie należy umieszczać nawiasów. Funkcję należy wywołać tak, jak procedurę Sub. Należy pominąć nawiasy, podać listę argumentów i nie przypisywać wyniku funkcji do zmiennej. Na przykład:

MsgBox "Zakończono zadanie!", 0, "Okno zadania"

Aby wykorzystać wartość zwracaną przez funkcję, należy umieścić argumenty w nawiasach, tak jak w przykładzie poniżej.

Odpow3 = MsgBox("Czy jesteś zadowolony ze swoich zarobków?", 4, "Pytanie 3")

Instrukcja w procedurze Sub lub Function może przekazywać wartości do wywoływanej procedury, wykorzystując nazwane argumenty. Wskazówki dotyczące stosowania nawiasów są aktualne, niezależnie od tego, czy stosowane są argumenty nazwane, czy nie. Jeżeli argumenty nazwane są stosowane, można podać je w dowolnej kolejności, ponadto można pominąć argumenty nieobowiązkowe. Po argumentach nazwanych są zawsze umieszczane znaki dwukropka i równości (:=), a następnie wartość argumentu.

Poniższy przykład wywołuje funkcję MsgBox, wykorzystując argumenty nazwane, ignoruje jednak zwracaną wartość:

MsgBox Title:="Okno zadania", Prompt:="Zadanie zostało zakończone!"

Poniższy przykład wywołuje funkcję MsgBox, wykorzystując argumenty nazwane, i przypisuje zwracaną wartość do zmiennej Odpow3:

Odpow3 = MsgBox(Title:="Pytanie 3", _

Prompt:=" Czy jesteś zadowolony ze swoich zarobków?", Buttons:=4)


Stosowanie instrukcji Select Case

Użycie instrukcji Select Case jest alternatywą do zastosowania instrukcji ElseIf w instrukcji If...Then...Else w przypadku, gdy zachodzi potrzeba porównania jednego wyrażenia z kilku różnymi wartościami. Podczas gdy instrukcje If...Then...Else mogą obliczać różne wyrażenia dla każdej instrukcji ElseIf, instrukcja Select Case oblicza wyrażenie tylko raz, na początku struktury sterowania.

W poniższym przykładzie instrukcja Select Case oblicza argument stanowisko, przekazywany do procedury. Każda instrukcja Case może zawierać więcej niż jedną wartość, zakres wartości lub kombinację wartości i operatorów porównania. Nieobowiązkowa instrukcja Case Else jest wykonywana wówczas, gdy w instrukcji Select Case w żadnej z instrukcji Case nie występuje wartość równa argumentowi.

Function Premia(stanowisko, pensja)

Select Case stanowisko

Case 1

Premia = pensja * 0.1

Case 2, 3

Premia = pensja * 0.09

Case 4 To 6

Premia = pensja * 0.07

Case Is > 8

Premia = 100

Case Else

Premia = 0

End Select

End Function


Stosowanie instrukcji With

Instrukcja With pozwala na określenie obiektu lub typu zdefiniowanego przez użytkownika jednorazowo dla całego ciągu instrukcji. Instrukcje With przyspieszają wykonywanie procedur i pomagają uniknąć wielokrotnego pisania.

Poniższy przykład wypełnia zakres komórek liczbą 30, stosuje czcionkę pogrubioną i ustawia wewnętrzny kolor komórek na żółty.

Sub FormatujZakres()

With Worksheets("Arkusz1").Range("A1:C10")

.Value = 30

.Font.Bold = True

.Interior.Color = RGB(255, 255, 0)

End With

End Sub

Instrukcje With można zagnieżdżać w celu uzyskania większej efektywności. Poniższy przykład wstawia do komórki A1 formułę, a następnie formatuje czcionkę.

Sub MojeDane()

With Workbooks("Skoroszyt1").Worksheets("Arkusz1").Cells(1, 1)

.Formula = "=SQRT(50)"

With .Font

.Name = "Arial"

.Bold = True

.Size = 8

End With

End With

End Sub


Zasady nazewnictwa w języku Visual Basic

Przy nadawaniu nazw procedurom, stałym, zmiennym i argumentom w module programu pisanego w języku Visual Basic należy stosować następujące zasady:

•	Pierwszym znakiem nazwy musi być litera.

•	Nie należy używać w nazwie znaków spacji, kropki (.), wykrzyknika (!) i znaków @, &, $, #.

•	Długość nazwy nie może przekroczyć 255 znaków.

•	Ogólnie, nie należy stosować nazw takich samych jak nazwy procedur typu Function, instrukcji i metod języka Visual Basic. Powoduje to bowiem przesłanianie odpowiadających im słów kluczowych języka. Aby wykorzystać wbudowaną funkcję, instrukcję lub metodę języka, która jest w konflikcie z nadaną nazwą, należy ją jawnie zidentyfikować. Nazwę wbudowanej funkcji, instrukcji lub metody należy poprzedzić nazwą związanej z nią biblioteki typów. Na przykład, jeśli w kodzie programu zadeklarowano zmienną o nazwie Left, funkcja Left może być wywołana tylko z wykorzystaniem konstrukcji VBA.Left.

•	Nie można powtarzać nazw wewnątrz tego samego poziomu zakresu. Na przykład, nie można zadeklarować dwóch zmiennych o nazwie wiek w tej samej procedurze. Można jednak zadeklarować zmienną prywatną o nazwie wiek oraz zmienną o nazwie wiek na poziomie procedury w tym samym module.

Uwaga   Język Visual Basic nie uwzględnia wielkości liter, jednak zachowuje ich wielkość występującą w instrukcji, w której deklarowana jest nazwa.


Praca z wieloma aplikacjami

System Visual Basic może tworzyć nowe obiekty i odczytywać istniejące obiekty z wielu aplikacji firmy Microsoft. Inne aplikacje mogą także dostarczać obiektów utworzonych za pomocą systemu Visual Basic. Więcej informacji na ten temat można znaleźć w dokumentacji aplikacji.

Aby utworzyć nowy obiekt lub pobrać istniejący obiekt z innej aplikacji, należy zastosować funkcję CreateObject lub GetObject:

' Uruchom program Microsoft Excel i utwórz nowy obiekt typu Worksheet.

Set ExcelWorksheet = CreateObject("Excel.Sheet")

' Uruchom program Microsoft Excel i otwórz istniejący obiekt typu Worksheet.

Set ExcelWorksheet = GetObject("SHEET1.XLS")

' Uruchom program Microsoft Word.

Set WordBasic = CreateObject("Word.Basic")

Większość aplikacji udostępnia metody Exit lub Quit, zamykające aplikacje niezależnie od tego, czy jest ona widoczna, czy nie. Więcej informacji na temat obiektów, metod i właściwości udostępnianych przez aplikacje można znaleźć w dokumentacji aplikacji.

Niektóre aplikacje pozwalają na stosowanie słowa kluczowego New w celu utworzenia obiektu dowolnej klasy istniejącej w bibliotece typów. Na przykład:

Dim X As New Field

W tym przypadku obiekt Field jest przykładem klasy z biblioteki typów dostępu do danych. Przy zastosowaniu tej składni tworzone jest nowe wystąpienie obiektu typu Field. Więcej informacji o tym, które klasy obiektów mogą być w ten sposób tworzone, można znaleźć w dokumentacji aplikacji.


Tworzenie procedury Function

Procedura Function (czyli funkcja) jest ciągiem instrukcji języka Visual Basic zamkniętych instrukcjami Function i End Function. Procedura Function jest podobna do procedury Sub, funkcja może jednak także zwracać wartość. Procedura Function może pobierać argumenty, takie jak stałe, zmienne i wyrażenia, które są do niej przekazywane przez procedurę wywołującą. Jeśli procedura Function nie ma argumentów, jej instrukcja Function musi zawierać pustą parę nawiasów. Funkcja zwraca wartość, przypisując tę wartość do nazwy funkcji w jednej lub wielu instrukcjach funkcji.

W poniższym przykładzie funkcja Celsius przelicza stopnie Fahrenheita na stopnie Celsjusza. Kiedy ta funkcja jest wywoływana z procedury Main, przekazywana jest do niej zmienna zawierająca wartość argumentu. Wynik obliczeń jest zwracany do procedury wywołującej i wyświetlany w oknie komunikatów.

Sub Main()

temp = Application.InputBox(Prompt:= _

"Wprowadź temperaturę w stopniach F.", Type:=1)

MsgBox "Temperatura wynosi " & Celsius(temp) & " stopni C."

End Sub

Function Celsius(fStopnie)

Celsius = (fStopnie - 32) * 5 / 9

End Function


Tworzenie procedury Property

Procedura Property jest ciągiem instrukcji języka Visual Basic pozwalającym programiście na tworzenie i manipulowanie właściwościami utworzonymi przez użytkownika.

•	Procedury Property mogą być stosowane do tworzenia właściwości przeznaczonych tylko do odczytu dla formularzy, modułów standardowych i modułów klasy.

•	Procedury Property powinny być wykorzystywane zamiast zmiennych Public w kodzie programu, który musi być wykonany, gdy ustawiana jest wartość właściwości.

•	W odróżnieniu od zmiennych Public, procedurom Property można przypisywać tekst Pomocy ukazujący się w oknie Przeglądarka obiektów.

Po utworzeniu procedury Property staje się ona właściwością modułu zawierającego tę procedurę. Język Visual Basic udostępnia następujące trzy typy procedur Property:

Procedura	Opis
Property Let	Procedura, która ustawia wartość właściwości.
Property Get	Procedura, która zwraca wartość właściwości.
Property Set	Procedura, która ustawia odwołanie do obiektu.
Składnia deklaracji procedury Property wygląda następująco:

[Public | Private] [Static] Property {Get | Let | Set} nazwa_właściwości_ [(argumenty)] [As typ]

instrukcje

End Property

Procedury Property są zazwyczaj stosowane w parach: Property Let razem z Property Get i Property Set razem z Property Get. Deklarowanie jedynie procedury Property Get jest podobne do deklarowania właściwości przeznaczonej tylko do odczytu. Stosowanie wszystkich trzech typów procedur Property jest przydatne jedynie dla zmiennych typu Variant, gdyż tylko zmienne typu Variant mogą zawierać informacje zarówno o obiektach, jak i o innych typach danych. Procedura Property Set jest przewidziana do użytku z obiektami; Property Let natomiast nie.

Argumenty obowiązkowe w deklaracji procedury Property przedstawia poniższa tabela:

Procedura	Składnia deklaracji
Property Get	Property Get nazwa_właściwości(1, …, n) As typ
Property Let	Property Let nazwa_właściwości(1, …,,,, n, n+1)
Property Set	Property Set nazwa_właściwości(1, …, n, n+1)
Pierwszy argument i wszystkie następne aż do ostatniego (1, …, n) muszą mieć te same nazwy i typy danych we wszystkich procedurach Property o takiej samej nazwie.

Deklaracja procedury Property Get wymaga o jeden mniej argumentów, niż powiązane z nią deklaracje Property Let i Property Set. Typ danych procedury Property Get musi być taki sam jak typ danych ostatniego argumentu (n+1) w odpowiadających deklaracjach Property Let i Property Set. Na przykład, jeśli zostanie zadeklarowana poniższa procedura Property Let, deklaracja Property Get musi stosować argumenty o takiej samej nazwie i typach danych, co argumenty procedury Property Let.

Property Let Nazwy(intX As Integer, intY As Integer, varZ As Variant)

‘ Tutaj występują instrukcje.

End Property

Property Get Nazwy(intX As Integer, intY As Integer) As Variant

‘ Tutaj występują instrukcje.

End Property

Typ danych ostatniego argumentu w deklaracji Property Set musi być albo typem obiektu, albo typem Variant.


Tworzenie procedury Sub

Procedura Sub jest ciągiem instrukcji języka Visual Basic zawartych między instrukcjami Sub i End Sub. Instrukcje procedury tego typu wykonują akcje, lecz nie zwracają wartości. Procedura Sub może pobierać argumenty, takie jak stałe, zmienne i wyrażenia, które są przekazywane przez procedurę wywołującą. Jeśli procedura Sub nie ma argumentów, instrukcja Sub musi zawierać pustą parę nawiasów.

Poniższa procedura Sub zawiera komentarze objaśniające każdy wiersz:

' Przykład deklaruje procedurę o nazwie Informacje.

' Ta Procedura Sub nie wymaga argumentów.

Sub Informacje()

' Deklaruje zmienną znakową o nazwie odpowiedź

Dim odpowiedź As String

' Przypisuje wartość zwracaną przez funkcję InputBox do zmiennej odpowiedź

odpowiedź = InputBox(Prompt:="Jak masz na imię?")

' Instrukcja warunkowa If...Then...Else

If odpowiedź = Empty Then

' Wywołuje funkcję MsgBox

MsgBox Prompt:="Nie wprowadzono imienia."

Else

' Funkcja MsgBox złączona ze zmienną odpowiedź

MsgBox Prompt:="Masz na imię " & odpowiedź

' Koniec instrukcji If...Then...Else

End If

' Koniec procedury Sub

End Sub


Tworzenie instrukcji przypisania

Instrukcje przypisania przypisują wartość lub wyrażenie do zmiennej lub stałej. Instrukcje przypisania zawsze zawierają znak równości (=). W poniższym przykładzie przypisano wartość zwróconą przez funkcję InputBox do zmiennej Imię.

Sub Pytanie()

Dim Imię As String

Imię = InputBox("Jak masz na imię?")

MsgBox "Masz na imię " & Imię

End Sub

Instrukcja Let jest nieobowiązkowa, i zazwyczaj jest pomijana. Na przykład, poprzednia instrukcja przypisania mogłaby mieć postać

Let Imię = InputBox("Jak masz na imię?").

W celu przypisania obiektu do zmiennej zadeklarowanej jako obiekt należy zastosować instrukcję Set. Słowo kluczowe Set jest obowiązkowe. W poniższym przykładzie instrukcja Set powoduje przypisanie zakresu komórek na arkuszu Arkusz1 do zmiennej obiektowej Komórki:

Sub Formatuj()

Dim Komórki As Range

Set Komórki = Worksheets("Arkusz1").Range("A1")

With Komórki.Font

.Bold = True

.Italic = True

End With

End Sub

Instrukcje, które ustawiają wartości właściwości, są również instrukcjami przypisania. Poniższy przykład ustawia właściwość Bold obiektu Font aktywnej komórki:

ActiveCell.Font.Bold = True


Tworzenie instrukcji deklaracji

Instrukcje deklaracji służą do nadawania nazw i definiowania procedur, zmiennych, tablic i stałych. Kiedy deklarowana jest procedura, zmienna lub stała, definiowany jest również jej zakres zależnie od miejsca wystąpienia deklaracji i rodzaju słów kluczowych zastosowanych w deklaracji.

Poniższy przykład zawiera trzy deklaracje:

Sub Formatuj()

Const limit As Integer = 33

Dim Komórki As Range

' Dalsze instrukcje

End Sub

Instrukcja Sub (wraz z odpowiadającą jej instrukcją End Sub) deklaruje procedurę o nazwie Formatuj. Gdy procedura Formatuj jest wywoływana lub uruchamiana, wykonywane są wszystkie instrukcje umieszczone między instrukcjami Sub i End Sub.

•	Tworzenie procedury Sub

Instrukcja Const deklaruje stałą limit, o określonym typie danych Integer i wartości 33.

•	Deklarowanie stałych

Instrukcja Dim deklaruje zmienną Komórki. Typem danych jest obiekt, w tym przypadku obiekt programu Microsoft Excel typu Range. Zmienna może być zadeklarowana jako obiekt dowolnego typu udostępnianego przez wykorzystywaną aplikację. Instrukcje Dim są jednym z typów instrukcji stosowanych do deklarowania zmiennych. Inne słowa kluczowe stosowane w takich deklaracjach to ReDim, Static, Public, Private i Const.

•	Deklarowanie zmiennych


Tworzenie instrukcji wykonywalnych

Instrukcja wykonywalna inicjuje akcję. Może ona wykonać metodę lub funkcję, a może nią być pętla lub rozgałęzienie w obrębie bloku kodu programu. Instrukcje wykonywalne często zawierają operatory matematyczne lub warunkowe.

Poniższy przykład wykorzystuje instrukcję For Each...Next w celu wykonania operacji dla każdej komórki z zakresu o nazwie Zakres, znajdującego się w arkuszu Arkusz1 aktywnego skoroszytu programu Microsoft Excel. Zmienna c jest bieżącą komórką kolekcji komórek zawartych w zakresie Zakres.

Sub Formatuj()

Const limit As Integer = 33

For Each c In Worksheets("Arkusz1").Range("Zakres").Cells

If c.Value > limit Then

With c.Font

.Bold = True

.Italic = True

End With

End If

Next c

MsgBox "Gotowe!"

End Sub

Instrukcja If...Then...Else w tym przykładzie sprawdza wartość komórki. Jeżeli wartość ta jest większa od 33, instrukcja With ustawia właściwości Bold i Italic obiektu Font tej komórki. Instrukcje If...Then...Else kończą się instrukcją End If.

Instrukcja With może uprościć pisanie programu, gdyż instrukcje zawarte w niej są automatycznie wykonywane na obiekcie, którego nazwa jest umieszczona za słowem kluczowym With.

Instrukcja Next wywołuje następną komórkę kolekcji komórek zawartych w zakresie Zakres.

Funkcja MsgBox (wyświetlająca okno dialogowe środowiska Visual Basic) wyświetla komunikat wskazujący, że procedura Sub zakończyła się.


Zapisywanie danych do plików

Pracując z wielką ilością danych, często wygodnie jest zapisywać lub odczytywać dane z pliku. Instrukcja Open pozwala na utworzenie i realizację dostępu do pliku w sposób bezpośredni. Operacja Open udostępnia trzy typy dostępu do pliku:

•	Dostęp sekwencyjny (tryby Input, Output i Append) jest stosowany do zapisu plików tekstowych, takich jak rejestry błędów i raporty.

•	Dostęp swobodny (tryb Random) jest stosowany do odczytu i zapisu danych z pliku bez jego zamykania. Pliki o dostępie swobodnym organizują dane w rekordy co ułatwia szybkie odnajdywanie informacji.

•	Dostęp binarny (tryb Binary) jest stosowany do odczytu i zapisu na dowolnej pozycji bajtowej w pliku, co ma miejsce na przykład przy przechowywaniu i wyświetlaniu obrazu mapy bitowej.

Uwaga   Instrukcja Open nie powinna być stosowana do otwierania plików typów specyficznych dla aplikacji. Na przykład, nie należy stosować instrukcji Open, aby otworzyć dokument programu Word, arkusz kalkulacyjny programu Microsoft Excel lub bazę danych programu Microsoft Access. Wykonanie tej operacji grozi utratą spójności pliku i jego uszkodzeniem.

Poniższa tablica pokazuje instrukcje najczęściej stosowane do zapisu i odczytu danych z plików.

Typ dostępu	Zapis danych	Odczyt danych
Sekwencyjny	Print #, Write #	Input #
Swobodny	Put	Get
Binarny	Put	Get


Tworzenie instrukcji języka Visual Basic

Instrukcja w języku Visual Basic jest kompletnym poleceniem wykonania pewnej czynności. Może ona zawierać słowa kluczowe, operatory, zmienne, stałe i wyrażenia. Każda instrukcja należy do jednej z poniższych trzech kategorii:

•	Instrukcje deklaracji, które nadają nazwy zmiennym, stałym i procedurom oraz określają typ danych.

Tworzenie instrukcji deklaracji

•	Instrukcje przypisania, które przypisują wartość lub wyrażenie do zmiennej lub stałej.

Tworzenie instrukcji przypisania

•	Instrukcje wykonywalne, które inicjują akcje. Instrukcje te mogą wykonywać metody lub funkcje, mogą także realizować pętle i rozgałęzienia w blokach kodu programu. Instrukcje wykonywalne często zawierają operatory matematyczne lub warunkowe.

Tworzenie instrukcji wykonywalnych

Kontynuowanie instrukcji w wielu wierszach

Instrukcja zazwyczaj mieści się w jednym wierszu kodu, można jednak przy użyciu znaku kontynuacji wiersza kontynuować instrukcję w następnym wierszu. W poniższym przykładzie instrukcja wykonywalna MsgBox jest kontynuowana przez trzy wiersze:

Sub PoleDemo()  'Procedura deklaruje zmienną znakową,

' przypisuje do niej wartość Jerzy, a następnie wyświetla

' złączony komunikat.

Dim mojaZm As String

mojaZm = "Jan"

MsgBox Prompt:="Cześć " & mojaZm, _

Title:="Okno pozdrowień", _

Buttons:=vbExclamation

End Sub

Komentowanie kodu programu

Komentarze mogą objaśniać procedurę lub konkretną instrukcję każdemu czytającemu kod programu. Podczas wykonywania procedur Visual Basic ignoruje komentarze. Wiersze komentarza rozpoczynają się znakiem apostrofu (') lub słowem Rem, po którym następuje spacja, i mogą być wstawiane w dowolnym miejscu procedury. Aby dodać komentarz w wierszu instrukcji, należy po instrukcji wstawić znak apostrofu, a za nim umieścić tekst komentarza. Domyślnie, komentarze są wyświetlane w kolorze zielonym.

Sprawdzanie błędów składniowych

Jeżeli po wpisaniu wiersza kodu programu i naciśnięciu klawisza ENTER wiersz ten jest wyświetlany w kolorze czerwonym (może pojawić się również komunikat o błędzie), należy określić przyczynę błędu w instrukcji i poprawić tę instrukcję.