Zmienne
Programy manipulują danymi, które są przechowywane w zmiennych. Zmienne mają różne atrubuty i mogą przechowywać różne typy danych (liczby, tekst, data i tak dalej). Stąd termin typ danych.
W Visual Basicu wszystkie zmienne są tworzone jednakowo: na przykład zmienna, która jest przechowywana w pamięci jako sekwencja bitów 01001111, reprezentuje literę O - jeżeli zmienna jest znakiem, lub liczbę 79 - jeżeli zmienna jest liczbą całkowitą. Przez zdeklarowanie zmiennej jako określonego typu danych określa się dla Visual Basic typ danych przechowywanych przez zmienną.(sposób interpretacji danej przechowywanej w pamięci).
Z punktu widzenia programisty zmienna jest elementem, którego wartość może ulegać zmianie podczas wykonywania programu. Na przykład, zmienna X może zmieniać się od 0, do -1, do 32767 i następnie znowu do 0 podczas trwania pojedynczej procedury.
Z punktu widzenia komputera zmienna jest jednym obszarem w pamięci, którego zawartość może zmieniać się podczas wykonywania programu. Pozostając przy poprzednim przykładzie zmienna X może zajmować dwa bajty (16 bitów) pamięci, podczas gdy jej zawartość może zmieniać się od 0 do -1, do 32767 i ponownie do 0.
Typy danych
Programy manipulują danymi, które są przechowywane w zmiennych. Zmienne mają różne atrubuty i mogą przechowywać różne typy danych (liczby, tekst, data i tak dalej). Stąd termin typ danych.
W Visual Basicu wszystkie zmienne są tworzone jednakowo: na przykład zmienna, która jest przechowywana w pamięci jako sekwencja bitów 01001111, reprezentuje literę O - jeżeli zmienna jest znakiem, lub liczbę 79 - jeżeli zmienna jest liczbą całkowitą. Przez zdeklarowanie zmiennej jako określonego typu danych określa się dla Visual Basic typ danych przechowywanych przez zmienną.(sposób interpretacji danej przechowywanej w pamięci).
Poniższa tabela zawiera jedenaście głównych typów danych, opisy i zakresy danych, które mogą przechowywać, wielkości pamięci, jakiej używają i przedrostki deklaracji typu.
Typ Danych |
Zawartość |
Wielkość pamięci |
Zakres |
Przedrostek deklaracji typu |
Byte |
całkowita |
1 bajt |
0 do 255 |
(żaden) |
Boolean |
całkowita |
2 bajty |
True lub False |
(żaden) |
Integer |
całkowita |
2 bajty |
-32,768 do 32,767 |
% |
Long |
całkowita |
4 bajty |
-2,147,483,648 do 2,147,483,647 |
& |
Single |
liczba zmiennopozycyjna |
4 bajty |
Ujemne:-3.402823E38 do -1.401298E-45 |
! |
Double |
liczba zmiennopozycyjna |
8 bajtów |
Ujemne:-0.79769313486232E308 do -4.94065645841247E-324 |
# |
Currency |
liczba z ustaloną kropką dziesiętną |
8 bajtów |
-922,337,203,685,477.5808 do -922,337,203,685,477.5807 |
@ |
Date |
data (miesiąc/dzień/rok) |
8 bajtów |
1/1/100 do 1/31/9999 |
(żaden) |
Object |
adres obiektu |
4 bajty |
dowolna referencja do obiektu |
(żaden) |
String |
łańcuch znaków |
10 bajtów + długość stringu (dla zmiennej długości stringu); długość stringu (dla stringów o ustalonej długości) |
0 do 2 miliardów znaków dla Windows95 (0 do 65,400 dla Windows 3.1 i wersji wcześniejszych) |
$ |
Variant |
dowolne dane (poza stringiem o ustalonej długości i typem zdefiniowanym przez użytkownika) |
16 bajtów (dla danych liczbowych); 22 bajty + długość stringu (dla stringu) |
Wartość liczbowa (dla danych liczbowych); to samo co w przypadku stringów zmiennej długości |
(żaden) |
Dwunasty typ danych zwany typem danych zdefiniowanych przez użytkownika jest hybrydą, która umożliwia łączenia różnych elementów innych typów danych. Należy samodzielnie zdefiniować typy danych definiowalne przez użytkownika.
Rozkaz Type
Instrukcja służy do definiowania typów użytkownika.
Składnia instrukcji Type:
[Private | Public] Type Nazwa
NazwaElementu1 [(Wymiary])] As Typ
[NazwaElementu2 [(Wymiary])] As Typ]
. . .
End Type
Składnia rozkazu Type składa się z następujących części:
Public |
Opcjonalne słowo kluczowe. Używane do deklarowania typów definiowanych przez użytkownika, które są dostępne we wszystkich procedurach, wszystkich modułach i wszystkich formach. |
Private |
Opcjonalne słowo kluczowe. Używane do deklarowania typów definiowanych przez użytkownika, które są dostępne tylko wewnątrz modułu gdzie wystąpiła deklaracja. |
Nazwa |
Nazwa typu definiowanego przez użytkownika, obowiązują standardowe konwencje nazywania zmiennych. |
NazwaElementu |
Nazwa elementu definiowanego przez użytkownika, obowiązują standardowe konwencje nazywania zmiennych. |
Wymiary |
Wymiary elementu typu tablica. Używane w nawiasach, przy deklaracji tablic, której rozmiar może być zmieniany. Agrument Wymiary składa się z następujących części: |
Typ |
Argument określający typ danych elementu. Mogą być użyte: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String (dla łańcuchów zmiennej długości), String* Długość (dla łańcuchów stałej długości), Object, Variant inne typy zdefiniowane przez użytkownika lub typy obiektów. |
Instrukcji Type można używać tylko na poziomie modułu. Jeżeli raz zostanie zadeklarowany typ zdefniowany przez użytkownika przy użyciu instrukcji Type, można deklarować zmienną tego typu wszędzie wewnątrz zasięgu tej deklaracji. Do deklarowania zmiennej typu zdefiniowanego przez użytkownika należy używać Dim, Private, Public, Static lub ReDim.
W standardowych modułach, typ zdefniowany przez użytkownika jest standardowo publiczny. Może być to zmienione przez użycie słowa Private. W modułach klas, typy zdefiniowane przez użytkownika mogą być tylko prywatne i ich widoczności nie można zmienić przez użycie słowa Public.
Numery linii ani etykiety linii nie są uznawane w bloku Type...End Type.
Typy zdefiniowane przez użytkownika są często używane z rekordami danych, które składają się z szeregu powiązanych ze sobą elementów różnych typów danych.
Przykład pokazuje jak używać łańcuchów stałego rozmiaru w typie definiowanym przez użytkownika:
Type typDaneMiasta
intKod (1 To 100) As Integer
'deklaruje statyczną tablicę
strRegion As String * 30
End Type
Dim typKrakow (1 To 100) As typDaneMiasta
W tym przykładzie typDaneMiasta zawiera statyczną tablicę intKod, a rekord typKrakow ma taką samą strukturę jak typDaneMiasta.
Przy deklaracji łańcucha stałych rozmiarów wewnątrz typu definiowanego przez użytkownika, jego rozmiary muszą być deklarowane przez liczby lub stałe a nie przez zmienne.
Ustawienie instrukcji Option Base określa dolną granicę dla łańcuchów wewnątrz typów definiowanych prze użytkownika.
Deklarowanie zmiennych przy użyciu Dim
Deklarując zmienną określa się typ danych jaki może przyjmować ta zmienna. Aby to zrobić, należy użyc instrukcji Dim.
Słowo Private określa deklarowanie zmiennej prywatnej a Public zmiennej publicznej.
Składnia instrukcji Dim, Private i Public:
Dim [WithEvents] NazwaZmiennej[([zakres])] [As [New] typ] [, [WithEvents] NazwaZmiennej[([zakres])] [As [New] typ]] . . .
Private [WithEvents] NazwaZmiennej[([zakres])] [As [New] typ] [, [WithEvents] NazwaZmiennej[([zakres])] [As [New] typ]] . . .
Public [WithEvents] NazwaZmiennej[([zakres])] [As [New] typ] [, [WithEvents] NazwaZmiennej[([zakres])] [As [New] typ]] . . .
Składnia instrukcji Dim, Private i Public składa się z części:
WithEvents |
(Opcjonalne). Słowo kluczowe, które określa, że zmienna NazwaZmiennej obiektowa jest używana do reagowania na zdarzenia wywołane przez obiekty ActiveX. Jest to słowo kluczowe poprawne tylko w module klasy (class module). Można zdeklarować wiele pojedynczych zmiennych używając WithEvents ale nie można stworzyć tablicy z WithEvents. Nie można stosować New z WithEvents. |
NazwaZmiennej |
nazwa zmiennej zgodna ze sposobami nazywania zmiennych |
zakres |
(Opcjonalne) Określa zakres zmiennej tablicowej, można określić do 60 zakresów (wymiarów) tablicy. Składnia zakresu: |
New |
(Opcjonalnie). Słowo kluczowe, które pozwala na ukryte stworzenie obiektu. Jeżeli zostanie użyte słowo New podczas deklarowania zmiennej obiektowej, nowy obiekt jest tworzony przy pierwszym odwołaniu do niego, nie trzeba więc używać Set aby skojarzyć odwołanie do obiektu. Słowo New nie może być używane do deklarowania zmiennych łączonych, nie może być używane do deklarowania zmiennych zależnych i nie może być używane z WithEvents. |
typ |
(Opcjonalnie) Określa typ danych zmiennej. Należy używać słowa As dla każdej deklarowanej zmiennej. |
Zmienna zadeklarowana przez Dim w module jest dostępna dla wszystkich procedur modułu. Zmienna zadeklarowana przez Dim w procedurze jest dostępna tylko wewnątrz procedury.
Zmienna zadeklarowana przez Private jest dostępna tylko w module, w którym została zadeklarowana.
Zmienna zadeklarowana jako Public jest dostępna we wszystkich procedurach i we wszystkich modułach w aplikacji, chyba że zostało użyte Option Private Module, które powoduje, że zmienne są publiczne tylko wewnątrz projektu, w którym rezydują.
Przykład użycia instrukcji Dim, Private i Public:
Dim intNumer As Integer
Public intLiczba As Integer
Private varJakasZmienna, sngLiczba As Single
Dim objNowy As New Worksheet
Powyższy przykład deklaruje zmienną intNumer jako zmienną typu Integer, zmienną publiczną intLiczba jako Integer, zmienną prywatną varJakasZmienna jako zmienną typu Variant i prywatną sngLiczba jako Single oraz zmienną objNowy jako nowy obiekt Worksheet.
Jeżeli słowo New nie zostanie użyte podczas deklarowania zmiennej, to zmienna odwołująca się do obiektu musi być skojarzona z istniejącym obiektem przez użycie słowa Set zanim zostanie ona użyta. Zanim zmienna ta zostanie skojarzona z obiektem przyjmuje ona specjalną wartość Nothing, która określa, że nie odwołuje się ona do żadnego obiektu.
Można użyć słowa Dim, Private lub Public z pustymi nawiasami do deklarowania dynamicznych tablic. Po zdeklarowaniu dyanmicznej tablicy, należy użyć ReDim aby zmienić liczbę wymiarów i elementów tablicy. Przy próbie zdeklarowania rozmiarów zmiennej tablicowej której rozmiar został określony przez Private, Public lub Dim powstanie błąd.
Jeżeli nie został określony typ danych lub typ obiektu i nie występuje słowo Deftype w module, to zmienna zostanie określona jako typu Variant (domyślny).
Jeżeli zmienna nie zostanie zainicjowana wartością, to zmiennej numerycznej nadawana jest wartość 0, zmiennej łańcuchowej o stałej długości przypisywany jest łańcuch o zerowej długości ("") a zmienna łańcuchowa o stałej długości zostanie wypełniony zerami. Zmienna typu Variant jest inicjowana jako Empty. Każdy element typu użytkownika jest inicjowany jak pojedyncza zmienna określonego typu.
Słowo Public nie może być użyte do deklarowania zmiennych łańcuchowych o zmiennej długości w modułach klas.
Jeżeli słowo Dim będzie używane w procedurze można wstawić słowo Dim na początku procedury.
Jeżeli słowo Private będzie używane w procedurze można wstawić słowo Private na początku procedury.
na górę strony...
Domyślny typ danych: Variant
Wiele języków programowania - takich jak C i Pascal - wymaga zadeklarowania każdej zmiennej, jaka jest używana w kodzie.
Visual Basic umożliwia wybór, czy zmienna musi być zdeklarowana czy nie. Jeżeli zmienna nie zostanie zdeklarowana, automatycznie zostanie ona zdeklarowana jako Variant, który jest typem domyślnym. Variant może zawierać dane Byte, Boolean, Integer, Long, Single, Double, Currency, Date, Object i String.
Zmienne Variant mogą zawierać dowolny typ danych. To oraz fakt, że nie trzeba deklarować zmiennych typu Variant, powoduje że Variant stają się wygodne w użyciu, szczególnie wtedy, gdy zamierzamy tworzyć krótki i prosty program. Wadą jest to, że Variant nie są zoptymalizowane do określonego typu danych, mogą znacznie obciążać programy, marnują pamięć i zwalniają obliczenia matematyczne.
Aby utworzyć szybki kod, efektywnie wykorzystujący pamięć, należy oszczędnie używać typu Variant. Na przykład, jeżeli zmienna będzie zawsze zawierała względnie małe wartości całkowite, należy zdeklarować zmienną jako Integer (co zużywa 2 bajty pamięci), a nie Variant (co zużywa 16 bajtów w celu reprezentowania liczby).
Tablice - Arrays
Deklarowanie tablic | Tablice wielowymiarowe | Indeksowanie tablic | Zmiana domyślnej dolnej granicy tablicy | Zasięg tablic
Tablica jest zbiorem zmiennych tego samego typu danych. Jest ona stosowana do zgrupowania razem zmiennych zależnych. Na przykład, można stworzyć tablicę 100 liczb całkowitych w celu przechowywania numerów identyfikacyjnych ID 100 urzędników jakiegoś przedsiębiorstwa, zamiast tworzenia 100 niezależnych zmiennych. Lub można stworzyć tablicę 10 stringów, aby przechować 10 różnych komunikatów, które mogą być wyświetlone za pomocą okienka dialogowego.
Deklarowanie tablic
Aby zadeklarować tablicę należy użyć słowa kluczowego Dim, Public, Private lub Static. Tablica jest deklarowana podobnie jak zwykła zmienna, tylko, że za nazwą zmiennej w deklaracji zmiennej podaje się rozmiar tablicy.
Tablice statyczne mają z góry określony rozmiar, który należy podać podczas deklaracji.
Tablice dynamiczne mają nieokreślony rozmiar, który może być wielokrotnie zmieniany w czasie wykonywania programu przy pomocy rozkazu ReDim.
Domyślą dolną wartością zakresu tablicy jest 0, jednak wartość ta może być zmieniona przy użyciu rozkazu Option Base. Górna granica tablicy statycznej musi być określona przy deklaracji tablicy. Można to zrobić podając za nazwą zmiennej w deklaracji zmiennej wymiary tablicy. Jeżeli zostanie podana tylko jedna liczba, to traktowana jest ona jako górny zakres tablicy.
Przykład deklaracji takiej tablicy:
Dim varTablica1 (10)
Przykład ten deklaruje tablicę o nazwie varTablica1. Górny zakres tablicy ma wartość 10 a dolny jest określony przez rozkaz Option Base (domyślnie 0, więc wtedy tablica ta ma 11 elementów, pierwszy o indeksie 0, 11-sty o indeksie 10).
Można również zadeklarować tablicę podając dolny i górny zakres wykorzystując składnię:
DolnyZakres To GórnyZakres
Przykładem może być deklaracja:
Dim varTablica2 (5 To 15)
Ta tablica ma 11 elementów (pierwszy o indeksie 5, 11-sty o indeksie 15).
Aby zadeklarować tablicę dynamiczną, bez podawania jej wymiarów należy za nazwą tablicy wstawić nawiasy okrągłe (). Rozmiar takiej tablicy należy ustawić później w programie przy użyciu instrukcji ReDim. Instrukcja ta pozwala na zmianę rozmiarów tablicy (również z zachowaniem jej zawartości). Rozmiar tablicy dynamicznej można wielokrotnie zmieniać w programie.
Przykład tablicy dynamicznej:
Dim varTablicaDynamiczna ()
'deklaracja tablicy dynamicznej
ReDim varTablicaDynamiczna (10)
'ustalenie rozmiarów tablicy
...
ReDim varTablicaDynamiczna (15)
'zmiana rozmiarów tablicy
W przypadku wielowymiarowych tablic dynamicznych, rozkazem ReDim można zmieniać tylko rozmiar ostatniego wymiaru.
na górę strony...
Tablice wielowymiarowe
Visual Basic umożliwia tworzenie tablic wielowymiarowych, których elementy muszą być identyfikowane przez kilka wartości indeksów (można tworzyć tablice, aż do 60-wymiarowych)
Przykładowa dwuwymiarowa tablica typu Integer o nazwie varSzachy będzie reprezentować typową szachownicę 8 na 8. Należy zadeklarować tablicę:
Dim varSzachy (1 To 8, 1 To 8) As Integer
Jeżeli Option Base będzie ustawione na 1, można użyć deklaracji:
Dim varSzachy (8, 8) As Integer
Kwadrat w lewym górnym rogu tabeli jest identyfikowany jako varSzachy(1,1), co oznacza, że pole znajduje się na przecięciu kolumny 1 i wiersza 1. Pole w prawym dolnym rogu tabeli jest identyfikowane jako varSzachy(8,8) i tak dalej.
Dwuwymiarowe tablice są używane do przechowywania danych, które mają dwa "wymiary" z nimi powiązane. Każdy element w varSzachy ma numer wiersza i kolumny.
Aby wyznaczyć liczbę elementów w dwuwymiarowej tablicy, należy pomnożyć liczbę elementów w każdym wymiarze. W varSzachy istnieją 64 elementy, 8 wierszy na 8 kolumn. Ponieważ każdy element jest typu Integer (co zajmuje dwa bajty pamięci), varSzachy zajmie 128 bajtów pamięci.
Ponieważ wielowymiarowe (i jednowymiarowe) tablice mogą zająć znaczną pojemność pamięci, należy ostrożnie je stosować. Należy być szczególnie ostrożnym z tablicami typu Variant, ponieważ każda zmienna Variant może zajmować do 65,500 bajtów.
na górę strony...
Indeksowanie tablic
Elementy tablicy są indeksowane, każdy z nich posiada swój indeks (pozycję w tablicy). Granice tablicy odnoszą się do minimalnej i maksymalnej wartości indeksu. Górną granicą tablicy varTablica1 jest 10, a varTablica2 jest 15, dolną varTablica1 jest 0 a varTablica2 jest 5. Aby odnieść się do pojedynczego elementu tablicy, należy umieścić jego numer indeksu w nawiasach na końcu nazwy tablicy. Na przykład, aby odnieść się do pierwszego, 5-go i 10-go elementu tablic varTablica1 i varTablica2 w kodzie należy użyć odpowiednio:
varTablica1 (0)
varTablica2 (5)
'pierwsze elementy tablic
varTablica1 (4)
varTablica2 (9)
'piąte elementy tablic
varTablica1 (9)
varTablica2 (14)
'dzisiąte elementy tablic
Przykład, jak można odnieść się do elementu tablicy w kodzie:
varTablica1 (3) = 28759
Ta instrukcja ustawia 4-ty element tablicy varTablica1 na wartość 28759. Aby wyczyścić zawartość tablicy należy użyć rozkazu Erase
Przy indeksowaniu tablic wielowymiarowych, indeksy kolejnych wymiarów należy oddzielić od siebie przecinkami, np:
varTablicaWielowymiarowa (2, 4, 6, 10)
na górę strony...
Zmiana domyślnej dolnej granicy tablicy
Zazwyczaj dobrze się pracuje z tablicą, której dolna granica wynosi 0 (to znaczy, którego pierwszy element ma numer indeksu 0). Lub też może być kłopotliwe odnoszenie się do pierwszego elementu jako do varTablica1(0), dziesiątego jako varTablica1(9) i tak dalej. Jeżeli tak jest, można użyć instrukcji Option Base w celu dokonania zmiany standardowej dolnej granicy dla wszystkich tablic w formularzu lub ogólnym module. Należy w częsci General Declartions formularza lub ogólnego modułu wstawić wiersz:
Option Base 1
1 jest domyślna dolną granicą (pierwszym numerem indeksu) wszystkich tablic w formularzu lub ogólnym module (może to być 0 lub 1). Można spowodować, że pierwszym elementem tablic będzie albo varTablica1(0) albo varTablica1(1).
Instrukcja Option Base ustawia domyślną dolną granicę dla wszystkich tablic formularza lub ogólnego modułu (które zostały zadeklarowane bez podania DolnegoZakresu), gdzie została użyta. Nie można użyć Option Base do zmiany dolnej granicy tylko jednej tablicy w formularzu lub ogólnym module.
na górę strony...
Zasięg tablic
Zasięg tablicy jest wyznaczony przez słowo kluczowe, które zostanie użyte w celu zadeklarowania tablicy i przez lokalizację tej deklaracji.
Zasięg |
Lokalizacja deklaracji |
Słowo kluczowe |
Procedura |
||
Część General Declarations typowego modułu lub formularza |
||
Część General Declarations typowego modułu (nie formularza) |