Zmienne i stałe w VBA

W VBA, podobnie jak w każdym innym języku programowania, zmienne i stałe służą do przechowywania dowolnych wartości. Jak sama nazwa wskazuje, zmienne mogą się zmieniać, podczas gdy stałe przechowują stałe wartości.

Na przykład stała Pi przechowuje wartość 3,14159265… Liczba „Pi” nie zmieni się podczas wykonywania programu, ale nadal wygodniej jest przechowywać taką wartość jako stałą.

Jednocześnie możemy użyć zmiennej sVAT_Stawka do przechowywania stawki VAT od zakupionych towarów. Wartość zmienna sVAT_Stawka może się różnić w zależności od zakupionego produktu.

Typy danych

Wszystkie zmienne i stałe mają określony typ danych. Poniższa tabela zawiera listę typów danych używanych w VBA wraz z opisem i zakresem możliwych wartości:

Typ danych RozmiarOpisZakres wartości
Bajt1 bajtówLiczby naturalne; często używane do danych binarnychod 0 do 255
Boolean2 bajtówMoże być prawda lub fałszPrawda czy fałsz
Liczba całkowita2 bajtówLiczby całkowite (bez części ułamkowej)od -32 do +768
długo4 bajtówDuże liczby całkowite (bez części ułamkowej)от -2 147 483 648 до +2 147 483 647
pojedynczy4 bajtówLiczba zmiennoprzecinkowa o pojedynczej precyzjiod -3.4e38 do +3.4e38
Podwójne Geometryczne8 bajtówLiczba zmiennoprzecinkowa podwójnej precyzjiod -1.8e308 do +1.8e308
Waluta8 bajtówLiczba zmiennoprzecinkowa ze stałą liczbą miejsc po przecinkuот -922 337 203 685 477.5808 до +922 337 203 685 477.5807
Data8 bajtówData i godzina – Dane typu Data są reprezentowane przez liczbę zmiennoprzecinkową. Część całkowita tej liczby wyraża datę, a część ułamkowa wyraża czas.od 1 stycznia 100 do 31 grudnia 9999
przedmiot4 bajtówOdniesienie do obiektuDowolne odniesienie do obiektu
sznurZmienia sięZestaw znaków. Typ String może mieć stałą lub zmienną długość. Częściej używane ze zmienną długościąStała długość – do około 65 znaków. Zmienna długość – do około 500 miliardów znaków
WariantZmienia sięMoże zawierać datę, liczbę zmiennoprzecinkową lub ciąg znaków. Ten typ stosuje się w przypadkach, gdy nie wiadomo z góry, jaki rodzaj danych zostanie wprowadzony.Liczba – Double, string – String

Oczywiście, korzystając z powyższej tabeli i wybierając odpowiedni typ danych, można oszczędniej korzystać z pamięci (np. wybrać typ danych Liczba całkowita zamiast długo or pojedynczy zamiast Podwójne Geometryczne). Jednak w przypadku korzystania z bardziej kompaktowych typów danych należy uważać, aby kod nie próbował dopasować do nich nieproporcjonalnie dużych wartości.

Deklarowanie zmiennych i stałych

Uwaga tłumacza: Mówiąc o zmiennych w VBA, warto wspomnieć o jeszcze jednym bardzo ważnym punkcie. Jeśli deklarujemy zmienną, ale nie przypisujemy jej żadnej wartości, to jest ona inicjowana wartością domyślną:

• ciągi tekstowe są inicjowane pustymi ciągami;

• liczby — wartość 0;

• wpisz zmienne Boolean - Fałszywy;

• daty – 30 grudnia 1899.

Aby można było użyć zmiennej lub stałej, należy ją zadeklarować. Aby to zrobić, dodaj do makra następujący prosty wiersz kodu:

Dim Имя_Переменной As Тип_Данных

W powyższym wierszu kodu Nazwa zmiennej to nazwa zmiennej, która zostanie użyta w kodzie, oraz Typ danych to jeden z typów danych z tabeli podanej nieco wcześniej w tym artykule. Na przykład:

Dim sVAT_Rate jako pojedynczy Dim i jako liczba całkowita

Podobnie deklarowane są stałe, ale deklarując stałe, należy od razu wskazać ich wartość. Na przykład tak:

Const iMaxCount = 5000 Const iMaxScore = 100

Nie ma konieczności deklarowania zmiennych w Excelu. Domyślnie wszystkie wprowadzone, ale nie zadeklarowane zmienne w Excelu będą miały typ Wariant i będzie w stanie zaakceptować zarówno wartość liczbową, jak i tekstową.

Dzięki temu programista może w każdej chwili wykorzystać nową zmienną (nawet jeśli nie została zadeklarowana), a Excel potraktuje ją jako zmienną typu Wariant. Istnieje jednak kilka powodów, dla których nie należy tego robić:

  1. Wykorzystanie pamięci i szybkość obliczeniowa. Jeśli nie zadeklarujesz zmiennej ze wskazaniem typu danych, to domyślnie zostanie ona ustawiona na typ Wariant. Ten typ danych zużywa więcej pamięci niż inne typy danych. Kilka dodatkowych bajtów na zmienną może wydawać się niewiele, ale w praktyce programy mogą mieć tysiące zmiennych (zwłaszcza podczas pracy z tablicami). Dlatego dodatkowa pamięć używana przez zmienne, takie jak Wariant, w porównaniu do zmiennych typu Liczba całkowita or pojedynczy, może wzrosnąć do znacznej kwoty. Dodatkowo operacje ze zmiennymi typu Wariant są wykonywane znacznie wolniej niż w przypadku zmiennych innych typów, odpowiednio dodatkowy tysiąc zmiennych typu Wariant może znacznie spowolnić obliczenia.
  2. Zapobieganie literówkom w nazwach zmiennych. Jeśli wszystkie zmienne są zadeklarowane, można użyć instrukcji VBA − Opcja Jawna (porozmawiamy o tym później) w celu zidentyfikowania wszystkich niezadeklarowanych zmiennych. Eliminuje to pojawienie się błędu w programie w wyniku niepoprawnie zapisanej nazwy zmiennej. Na przykład używając zmiennej o nazwie sVAT_Stawka, można zrobić literówkę i przypisując wartość tej zmiennej napisać: „VATRate = 0,175”. Oczekuje się, że od teraz zmienna sVAT_Stawka powinna zawierać wartość 0,175 – ale oczywiście tak nie jest. Jeśli włączony jest tryb obowiązkowej deklaracji wszystkich używanych zmiennych, kompilator VBA natychmiast wskaże błąd, ponieważ nie znajdzie zmiennej Stawka VAT wśród ogłoszonych.
  3. Podświetlanie wartości, które nie pasują do zadeklarowanego typu zmiennej. Jeśli zadeklarujesz zmienną określonego typu i spróbujesz przypisać do niej dane innego typu, otrzymasz błąd, którego nienaprawienie może spowodować awarię programu. Na pierwszy rzut oka może się wydawać, że to dobry powód, aby nie deklarować zmiennych, ale w rzeczywistości, niż zanim okaże się, że jedna ze zmiennych otrzymała nieprawidłowe dane, które miała otrzymać – tym lepiej! W przeciwnym razie, jeśli program będzie nadal działał, wyniki mogą być nieprawidłowe i nieoczekiwane, a znalezienie przyczyny błędów będzie znacznie trudniejsze. Możliwe też, że makro zostanie wykonane „pomyślnie”. W rezultacie błąd pozostanie niezauważony, a praca będzie kontynuowana z nieprawidłowymi danymi!

W związku z tym pożądane jest jak najszybsze wykrycie nieprawidłowego typu danych i poprawienie takich błędów w kodzie. Z tych powodów zaleca się deklarowanie wszystkich zmiennych podczas pisania makra VBA.

Opcja Jawna

Operator Opcja Jawna powoduje zadeklarowanie wszystkich zmiennych, które będą używane w kodzie VBA i flaguje wszystkie niezadeklarowane zmienne jako błędy podczas kompilacji (przed rozpoczęciem wykonywania kodu). Zastosowanie tego operatora nie jest trudne – wystarczy napisać tę linię na samej górze pliku VBA:

Option Explicit

Jeśli chcesz zawsze wstawiać Opcja Jawna na górze każdego nowego utworzonego modułu VBA, można to zrobić automatycznie. Aby to zrobić, musisz włączyć opcję Wymagaj deklaracji zmiennej w ustawieniach edytora VBA.

Odbywa się to w ten sposób:

  • W menu Edytor Visual Basic kliknij narzędzia > Opcje
  • W wyświetlonym oknie dialogowym otwórz kartę redaktor
  • Sprawdź pudełko Wymagaj deklaracji zmiennej i naciśnij OK

Po włączeniu ciąg Opcja Jawna zostanie automatycznie wstawiony na początku każdego nowo utworzonego modułu.

Zakres zmiennych i stałych

Każda zadeklarowana zmienna lub stała ma swój ograniczony zakres, czyli ograniczoną część programu, w której ta zmienna istnieje. Zakres zależy od tego, gdzie dokonano deklaracji zmiennej lub stałej. Weźmy na przykład zmienną sVAT_Stawka, który jest używany w funkcji Całkowity koszt. W poniższej tabeli omówiono dwie opcje zmiennego zakresu sVAT_Stawkazadeklarowane na dwóch różnych pozycjach w module:

Opcja Jawne Dim sVAT_Rate jako pojedyncza funkcja Total_Cost() jako Double ... Zakończ funkcję
Jeśli zmienna sVAT_Stawka zadeklarowana na samym początku modułu, wtedy zakresem tej zmiennej będzie cały moduł (czyli zmienna sVAT_Stawka zostaną rozpoznane przez wszystkie procedury w tym module).

Dlatego jeśli w funkcji Całkowity koszt zmienna sVAT_Stawka zostanie przypisana jakaś wartość, to następna funkcja wykonywana w tym samym module użyje tej zmiennej sVAT_Stawka w tym samym znaczeniu.

Jeśli jednak zostanie wywołana jakaś funkcja znajdująca się w innym module, to dla niej zmienna sVAT_Stawka nie będą znane.

Opcja Funkcja jawna Total_Cost() As Double Dim sVAT_Rate As Single ... End Function
Jeśli zmienna sVAT_Stawka zadeklarowana na początku funkcji Całkowity koszt, to jego zakres będzie ograniczony tylko do tej funkcji (tj. w ramach funkcji Całkowity koszt, możesz użyć zmiennej sVAT_Stawka, ale nie na zewnątrz).

Podczas próby użycia sVAT_Stawka w innej procedurze kompilator VBA zgłosi błąd, ponieważ ta zmienna nie została zadeklarowana poza funkcją Całkowity koszt (pod warunkiem, że używany jest operator Opcja Jawna).

W powyższym przykładzie zmienna jest zadeklarowana na poziomie modułu za pomocą słowa kluczowego Ściemniać. Jednak może być konieczne, aby zadeklarowane zmienne mogły być używane w innych modułach. W takich przypadkach zadeklarować zmienną zamiast słowa kluczowego Ściemniać słowo kluczowe musi być użyte Publiczne.

Przy okazji, żeby zadeklarować zmienną na poziomie modułu, zamiast słowa kluczowego Ściemniać można użyć słowa kluczowego Sprawy Prywatne, co wskazuje, że ta zmienna jest przeznaczona do użycia tylko w bieżącym module.

Do deklarowania stałych można również używać słów kluczowych. Publiczne и Sprawy Prywatne, ale nie zamiast słowa kluczowego const, razem z tym.

Poniższe przykłady pokazują użycie słów kluczowych Publiczne и Sprawy Prywatne stosowane do zmiennych i stałych.

Opcja Explicit Public sVAT_Rate As Single Public Const iMax_Count = 5000 ...    
W tym przykładzie słowo kluczowe Publiczne używany do deklarowania zmiennej sVAT_Stawka i stałe iMax_Count. Zadeklarowany w ten sposób zakres elementów będzie stanowić cały bieżący projekt.

Oznacza to, że sVAT_Stawka и iMax_Count będą dostępne w dowolnym module projektu.

Opcja Explicit Private sVAT_Rate As Single Private Const iMax_Count = 5000 ...    
W tym przykładzie, aby zadeklarować zmienną sVAT_Stawka i stałe iMax_Count użyte słowo kluczowe Sprawy Prywatne. Zakres tych elementów jest aktualnym modułem.

Oznacza to, że sVAT_Stawka и iMax_Count będą dostępne we wszystkich procedurach bieżącego modułu, ale nie będą dostępne dla procedur w innych modułach.

Dodaj komentarz