Access

  MS Access 2010+ i Visual Basic for Applications VBA 7.0



• Podstawowe podstawy „programowania” w VBA.

Podstawy programowanie w VBA można znaleźć na dziesiątkach stron w internecie i w takiej samej ilości książek. Sam nie wiem po co wkleiłem aż tyle obrazków i opisywałem tworzenie pierwszej funkcji MojaFunkcja() i wynajdowałem jakieś prawie wyimaginowane błędy. No może nie tak całkiem wyimaginowane, bo czasami można je zaobserwować. Odwieczny problem, czy dziesięć zmiennych nazwać kolejnymi literami alfabetu, bo tak się szybciej pisze i kod zajmuje mniej miejsca. Jeszcze szybciej pisze się kod nie używając dyrektywy Option Explicit, gdyż zmienne same się deklarują. Czy dla oszczędności miejsca nie należy stosować wcięć w kodzie. Takich pytań jest wiele, a ja nie zamierzam na nie bezpośrednio odpowiadać. Być może, od czasu do czasu, wrzucę jakąś mądrą (w moim mniemaniu) uwagę, a może w trakcie pisania skasuję tą i inne strony. Pożyjemy, zobaczymy.

• Gdzie jest edytor kodu VBA?

Uruchamiamy MS Access, tworzymy nową bazę, lub otwieramy istniejącą, a następnie wciskamy kombinację klawiszy lewy Alt+F11. Oczom naszym ukazuje się edytor VBA.

edytor vba

Klikamy prawym przyciskiem myszy nad okienkiem „Project” zazwyczaj zadokowanym po lewej stronie okna edytora. Pojawia się „Menu podręczne” w którym najeżdżamy myszką na pozycję „Insert”, a następnie pozycję podmenu „Module” i klikamy lewym przyciskiem myszy.

edytor vba moduł

Po prawej stronie, w oknie edytora VBA, oczom naszym ukazuje się okno, w którym możemy napisać sławny program (funkcję) „Hello world”.

edytor vba moduł

Aż ręce świerzbią, by uruchomić ten program (funkcję). Wciskamy więc kombinację klawiszy Ctrl+G, lub wybieramy polecenie View/Immediate Window w edytorze kodu VBA. W nowo otwartym oknie „Immediate” wpisujemy następującą instrukcję:

?MojaFunkcja

(znak ? na początku jest niezbędny) i naciskamy Enter:

edytor vba immediate

Wszystko zadziałało prawidłowo. Poniżej pojawił się napis „Hello world”. Jest super. Jesteśmy WIELCY. Takie to proste.
No dobrze, to zmieńmy funkcję tak, by obliczała sumę trzech zmiennych, którym przypiszemy jakieś wartości.
Po napisaniu funkcji otwieramy okno „Immediate”Ctrl+G) i ponownie wpisujemy tekst:

?MojaFunkcja

edytor vba suma

 

MojaFunkcja () powinna zwrócić jako wynik liczbę 1110, a zwraca tylko 10. Gdzie się podziało 1100.

Gdzie się podziało brakujące 1100?

Spróbujmy znaleźć brakujące 1100, korzystając z dyrektywy Option Explicit. W tym celu wybierzmy polecenie „Tools/Options” w edytorze kodu VBA. Pojawi się okno „Options”:

edytor vba opcje

Na zakładce „Editor” zaznaczmy (niektórzy mówią - zaptaszkujmy) pole wyboru Require Variable Declaration. Spowoduje to automatyczne wstawianie dyrektywy Option Explicit we wszystkich nowo tworzonych modułach VBA aplikacji Accessa i wymusi jawne deklarowanie zmiennych. We wcześniej utworzonych modułach, aby wymusić jawne deklarowanie zmiennych, dyrektywę Option Explicit należy ręcznie wpisać w sekcji deklaracji modułu.
Brak dyrektywy Option Explicit w sekcji deklaracji modułu powoduje, że każde wystąpienie nowego identyfikatora, powoduje utworzenie nowej zmiennej o takiej nazwie. Kod pisany bez tej dyrektywy jest bardzo podatny na trudne do wykrycia błędy spowodowane tzw. literówkami.

Po dopisaniu w sekcji deklaracji modułu dyrektywy Option Explicit i po uruchomieniu polecenia „Debug/Compile” w edytorze kodu VBA, kompilator wyświetla komunikat:

edytor vba debug

że zmienna nie jest zadeklarowana i podświetla w oknie modułu zmienną liczba1. Po jawnym zadeklarowaniu trzech zmiennych liczba1, liczba2, liczba3 za pomocą instrukcji deklaracji z użyciem słowa kluczowego Dim i ponownym skompilowaniu kodu, kompilator ponownie nas się czepia wyświetlając komunikat

edytor vba compile

informując o braku deklaracji zmiennej i podświetla „liczbę” l00, która w wyniku tzw. „literówki” nie jest liczbą, gdyż pierwszy znak to litera "l". Po zamianie litery „l” na cyfrę „1” i ponownym skompilowaniu kodu, kompilator ponownie wyświetla komunikat

edytor vba Dim

informując o braku deklaracji zmiennej i podświetla zmienną „liczbal”. I rzeczywiście, nie jest to wcześniej zadeklarowana zmienna liczba1. Ponowna literówka, ostatnim znakiem w nazwie tej nowej zmiennej jest litera „l”. Poprawiamy nazwę zmiennej i ponownie uruchamiamy funkcję.

edytor vba sukces

Pełny sukces. Znaleźliśmy brakujące 1100. Czy jest już SUPER i wszystko OK. Potestujmy dalej i przypiszmy do pierwszej zmiennej „liczba1” liczbę 1000 ujętą w cudzysłów.

edytor vba string

Jest dobrze. Próbujmy dalej. Do drugiej zmiennej „liczba2” także przypiszmy liczbę wziętą w cudzysłów.

edytor vba variant

No i ZONK! No to weźmy wszystkie liczby w cudzysłów.

edytor vba konkatenacja

No i jeszcze większy ZONK! No to ... przestańmy cokolwiek robić, bo nic nam nie wychodzi.
Może najlepiej będzie uruchomić Windowsowego Painta i policzyć wszystko w słupku.

suma Paint

Teraz wszystko jest w jak najlepszym porządku ! Miało być 1110 i jest 1110.
Żarty, żartami, ale poniżej zamieszczam listing funkcji MojaFunkcja () obliczająca sumę trzech liczb.

Option Compare Database
Option Explicit

Public Function MojaFunkcja() As Long
Dim lngLiczba1 As Long
Dim lngLiczba2 As Long
Dim lngLiczba3 As Long

  lngLiczba1 = 1000
  lngLiczba2 = 100
  lngLiczba3 = 10

  MojaFunkcja = lngLiczba1 + lngLiczba2 + lngLiczba3

End Function

Dlaczego ma taką postać i czy funkcja taka ma sens, będzie (a raczej, chyba będzie) na następnych stronach.
A może poniższa funkcja jest lepsza ?

nowa funkcja MojaFunkcja
Mechanizm IntelliSense - podpowiadanie właściwości, metod i słów kluczowych.

Korzyści wynikające z zastosowania dyrektywy Option Explicit

  • Po zadeklarowaniu zmiennych możemy korzystać z mechanizmu IntelliSense - podpowiadanie właściwości, metod i słów kluczowych, przez co łatwiej można pisać kod.
  • Unikniemy tzw. literówek (błędnie wpisanych nazw zmiennych)
  • Ułatwimy sobie wychwytywanie błędów wynikających np. z niezgodność typu zmiennych.
  • Poprawiamy czytelność kodu, przez co łatwiej będzie można dokonać analizy kodu.
  • Po jawnym zadeklarowaniu zmiennych i ich typów, wykonywanie kodu jest szybsze i wykorzystanie pamięci jest efektywniejsze. Domyślny typ Variant powoduje, że VBA wielokrotnie wykonuje sprawdzenie typu danych i zużywa więcej pamięci i czasu, niż jest to konieczne. Jeżeli jawnie zadeklarujemy typ danych, VBA nie musi określać typu danych i może od razu zarezerwować taką ilość pamięci, która będzie optymalna do przechowywania zmiennej danego typu.