Pisząc kod istnieje ryzyko popełnienia literówki. Rzuć okiem na poniższy przykład:
Sub Test()
wiekosoby = Val(InputBox("Ile masz lat?", "Podaj wiek"))
If wiekosoba >= 18 Then
MsgBox "Polecam nasze drinki z minibaru", vbInformation
Else
MsgBox "Polecam świeży sok z świeżo wyciskanych pomarańczy", vbInformation
End If
End Sub
Kod jest bardzo prosty. Instrukcja InputBox prosi o podanie wieku. Następnie w zależności podanej wartości otrzymamy zachętę do konsumpcji drinka albo soku. Niestety, ale zawsze otrzymamy zachętę do konsumpcji soku (tak jakbyśmy niezależnie od podanej wartości byli osobami niepełnoletnimi).
Po dłuższej analizie kodu zauważymy, że w Instrukcji InputBox wynik przypisujemy do zmiennej wiekosoby natomiast w instrukcji If sprawdzamy zawartość zmiennej wiekosoba. Popełniłem drobną literówkę w nazwie zmiennej a że domyślnie VBA nie wymaga deklarowania nazw zmiennych to po prostu instrukcja IF odwołuje się do innej zmiennej o podobnej nazwie (zmienne, które nie były używane mają wartość 0).
Czasami, szczególnie w dłuższych programach ciężko jest wyłapać tego typu błędy. Jak temu zapobiec?
Deklarowanie nazw zmiennych za pomocą słowa kluczowego Dim
Zawsze każdą zmienną deklaruję za pomocą słowa kluczowego Dim. Oto nieznacznie poprawiony przykład:
Sub Test()
Dim WiekOsoby As Long
WiekOsoby = Val(InputBox("Ile masz lat?", "Podaj wiek"))
If wiekosoba >= 18 Then
MsgBox "Polecam nasze drinki z minibaru", vbInformation
Else
MsgBox "Polecam świeży sok z świeżo wyciskanych pomarańczy", vbInformation
End If
End Sub
Zadeklarowałem zmienną WiekOsoby jako zmienną typu Long (pozwala ona na przyjmowanie wartości całkowitych). Tutaj można się kłócić, czemu nie Byte (bo raczej nikt nie żyje dłużej niż 255 lat) albo czemu nie zmienna np. Single lub Double (wtedy można by było wpisywać wiek z wartościami ułamkowymi np. 35.5), ale skupmy się na czymś innym.
Zawsze jak deklaruję zmienne, to pierwsza litera jest u mnie wielka (a jak nazwa się składa z kilku wyrazów to każda litera wyrazu jest wielka np. WiekOsoby, KolorOczu itp.) Jedyny wyjątek to krótkie jednoliterowe nazwy zmiennych będących np. licznikami w pętlach for, wtedy pisze np. Dim a as Long czy Dim i as Long.
I tak – ilekroć wpisuję nazwę zmiennej w kodzie to edytor VBA zmienia wielkość liter, aby zmienna wyglądała tak jak przy jej deklaracji. Czyli jeśli mam taką deklarację: Dim WiekOsoby as Long a następnie pisząc jakąś instrukcję specjalnie pisze nazwę zmiennej małymi literami. Jeśli edytor VBA zmieni mi wiekosoby na WiekOsoby to wiem, że poprawnie użyłem nazwy zmiennej. Jeśli po naciśnięciu np. spacji nazwa zmiennej jest dalej napisana małymi literami to znaczy, że pewnie zrobiłem jakąś literówkę.
Option Explicit to Twój przyjaciel
W powyższym przykładzie mieliśmy dwie zmienne: wiekosoby i błędnie użytą zmienną wiekosoba.
Możemy wymusić aby deklaracja zmiennych była wymagana. W tym celu na początku każdego modułu dodajmy dyrektywę Option Explicit. Nasz kod będzie wyglądał następująco:
Option Explicit
Sub Test()
Dim WiekOsoby As Long
WiekOsoby = Val(InputBox("Ile masz lat?", "Podaj wiek"))
If wiekosoba >= 18 Then
MsgBox "Polecam nasze drinki z minibaru", vbInformation
Else
MsgBox "Polecam świeży sok z świeżo wyciskanych pomarańczy", vbInformation
End If
End Sub
Wtedy podczas próby użycia zmiennej, która nie była zadeklarowana pojawi się błąd Variable not defined. Od razu wychwyciliśmy błąd (zmienna wiekosoba nie została zadeklarowana).
Osobiście ja domyślnie w ustawieniach edytora VBA wymuszam, aby to środowisko VBA do każdego nowo tworzonego modułu dodawało tę dyrektywę (to ustawienie nie dodaje tej dyrektywy w modułach, które wcześniej były utworzone więc nie musisz się obawiać, że do projektów, które edytujesz zostanie ona dodana). Aby wymusić takie dodawanie tej dyrektywy należy w środowisku VBA wybrać z menu Tools polecenie Options. Następnie w zakładce Editor upewnij się, że została wybrana opcja Require Variable Declaration.
Od tej pory w każdym nowym module będzie dodawana ta dyrektywa (czyli niech Twoje stare projekty żyją swoim życiem, ale w nowych już będziesz musiał „po bożemu” deklarować wszystkie zmienne).
Ja osobiście nie używam dyrektywy Option Explicit jak rozwijam po kimś jakiś projekt (chcę na szybko coś komuś poprawić, ale nie mam czasu/chęci/ochoty poprawiać starych naleciałości w kodzie. Przykładowo nie mam czasu np. analizować i poprawiać kilkuset linii kodu mającego tylko dlatego, że mam dopisać raptem kilka nowych linijek kodu).
Option Explicit + Kompilacja
Od kiedy używam dyrektywy Option Explicit to dodatkowo co jakiś czas (szczególnie gdy wprowadzam większe zmiany i np. wyedytowałem kod w kilku różnych procedurach) wybieram polecenie Debug Compile. Dlaczego? Otóż błąd Variable not defined pojawia się tylko wtedy gdy zostaje uruchomiona procedura/funkcja w której jest niezadeklarowana zmienna.
W większych projektach (gdzie jest dużo IFów i wywoływanie wielu różnych funkcji następuje tylko wtedy, gdy kod wpadnie do danego IFa) błąd może się ujawnić dopiero po jakimś czasie (w skrajnych przypadkach nawet po kilku miesiącach – jak dana funkcja jest wywoływana tylko wtedy gdy spełniony jest jakiś mało popularny warunek). Dlatego warto jest wybrać tę opcję a edytor VBA analizuje cały kod we wszystkich modułach szukając różnego rodzaju błędów kompilacji (np. używanie niezadeklarowanych zmiennych, wywoływanie funkcji o nazwach które nie istnieją itp.)
Ogólnie dobrze wyrobić taki nawyk, aby np. raz na godzinę starać się kompilować projekt (albo za każdym razem gdy skaczesz po kodzie i w wielu funkcjach poprawiasz jakieś drobiazgi).
Autouzupełnianie nazw zmiennych za pomocą skrótu klawiszowego Ctrl + spacja
Czasami niektóre zmienne mają długie nazwy. Pisząc długą nazwę istotnie wzrasta ryzyko popełnienia literówki (aczkolwiek jeśli używasz dyrektywy Option Explicit i często kompilujesz kod to szybko wyłapiesz takie literówki).
Ale jest fajny trik. Otóż mogę napisać tak z 4-5 pierwszych liter nazwy zmiennej (albo funkcji którą wywołuję) a następnie nacisnąć Ctrl+Spacja. Wtedy wyskoczy podpowiadacz. Oto przykład ilustrujący to zagadnienie:
Napisałem początek nazwy zmiennej czyli nazw. Po naciśnięciu Ctrl+Spacja mam podpowiadacz. Jeśli chciałbym wpisać NazwiskoKierownika to wystarczy, że nacisnę klawisz Tab. Reszta nazwy zmiennej zostanie za mnie wpisana.
A co jeśli chciałbym wpisać NazwiskoSzefa? Wtedy wystarczy nacisnąć raz strzałkę w dół, aby zaznaczyć odpowiednią pozycje w podpowiadaczu a następnie nacisnąć klawisz Tab.