Programowanie VBA . Poznaj najlepsze praktyki programowania w języku VBA
Wszystkich tych z Państwa, którzy chcą przyspieszyć swoją pracę oraz optymalizować zadania wykonywane w programie Excel zapraszamy do lektury krótkiego poradnika, który przedstawi 5 najlepszych praktyk w stosowaniu języka VBA w Excelu.
Programowanie VBA: Stosuj wcięcia!
Proszę spojrzeć na poniższy kod realizujący dokładnie to samo zadanie, jednak w inny sposób napisany
Rys. 1. Przykładowe kody
Kod nr 1 (rys. 1) jest znacznie bardziej czytelny od kodu nr 2, ponieważ widać kiedy otwierane są instrukcje a także kiedy i czy są zamknięte, dzięki czemu programista jest w stanie na pierwszy „rzut” oka ocenić, gdzie może powstać potencjalny błąd.
Zasadą którą powinni stosować początkujący programiści, to wstawianie odstępu dla elementów podrzędnych.
Analizując kod nr 1 można powiedzieć, że nadrzędną instrukcją jest to, co jest w pierwszej linii (For i = 1 To 10). Zamknięcie tej instrukcji następuje w ostatniej linii (Next). Instrukcja w drugiej linii (For j = 1 To 10) jest podrzędna dla instrukcji w pierwszej linii oraz jednocześnie jest nadrzędną w stosunku do tej z trzeciej linii (If i = j Then). Oczywiście analogiczna analiza pozwoli na określenie hierarchii instrukcji języka VBA w powyższym kodzie. Warto tutaj podkreślić fakt, że odstępy nie wpływają na hierarchię wykonywanych poleceń, ale mają na celu ułatwienie analizy kodu. Przykładem niech będzie kod przedstawiony na rys. 2. Kod jest nie wskazuje prawidłowej hierarchii pomiędzy instrukcjami, ponieważ wg tego zapisu elementem nadrzędnym jest instrukcja If, co nie jest prawdą.
Rys. 2. Nieuporządkowany kod
Programowanie VBA: Używaj zmiennych lokalnych
Wykorzystanie zmiennych globalnych zarówno w projekcie jak i w module może prowadzić do nieoczekiwanych sytuacji. Przykładem niech będzie kod przedstawiony poniżej (rys. 3).
Rys. 3. Zmienne lokalne i globalne
Oto wyniki wyświetlane po pierwszym uruchomieniu makra:
Na początku tworzona jest zmienna o nazwie x. Zadeklarowana zmienna jest typu Variant. Procedura polacz_makra zawiera odwołanie do trzech makr co oznacza, że po jej uruchomieniu najpierw zostanie wywołane Makro1, później Makro2 a na końcu Makro3. W procedurze Makro1 zostanie wyświetlony komunikat Makro1 (start). W związku z tym, że zmienna x nie ma przypisanej wartości i jest zmienną typu Variant, Excel przypisuje jej domyślną wartość dla zmiennych typu Variant (czyli pusty ciąg znaków. Linia x = 5 oznacza przypisanie wartości pięć do zmiennej x, czego dowodem jest wyświetlenie komunikatu Makro1 (koniec): 5. Po zakończeniu tego makra interpreter wraca do procedury o nazwie polacz_makra, a następnie przechodzi do wykonania Makro2. W tym makrze następuje deklaracja zmiennej o nazwie x typu Long.
Uwaga!To nie jest ta sama zmienna co zmienna x w procedurze Makro1. Zmienna x typu Long przesłania zmienną typu Variant zadeklarowaną w pierwszej linijce kodu. Dowodem na tą operację jest komunikat Makro2 (start): 0.
Później następuje przypisanie do zmiennej x wartości trzy, po czym Excel wyświetla komunikat Makro2 (koniec): 3. Wychodząc z procedury zmienna x typu Long zostaje przez interpreter zniszczona, przy czym przechodząc do procedury polacz_makra mamy dostęp do zmiennej x typu Variant. Dowodem tego jest komunikat Makro3 (start). Oczywiście przypisanie do zmiennej x wartości siedem nie jest czymś zaskakującym.
Programowanie VBA: Zarządzaj pamięcią i ułatwiaj sobie życie!
Pierwszą rzeczą jaką powinni robić programiści przy tworzeniu makr to deklarowanie zmiennych. Niewątpliwymi korzyściami tego rozwiązania są zarządzanie pamięcią oraz możliwość wybrania nazwy zmiennej z podpowiadacza (IntelliSense). Prozę spojrzeć na krótki kod z rys. 4:
Rys. 4. Użycie podpowiadacza
Dzięki temu, że zadeklarowano dwie zmienne typu prostego, to możemy użyć podpowiadacza przy pomocy kombinacji klawiszy Ctrl + Spacja. Bez jawnej deklaracji zmiennych nie można skorzystać z tego ułatwienia.
Rys.5. Komunikat dla zadeklarowanych zmiennych
Uruchomienie kodu z rys. 5 wskazuje na bardzo ważną rzecz: zadeklarowanie zmiennych w jednej linii nie oznacza, że będą one tego samego typu. Zmienna liczba_wierszy jest typu Variant, natomiast zmienna liczba_kolumn jest typu Long. Podany kod uświadamia, że należy deklarować każdą zmienną w osobnej linii. Co więcej, jeśli deklarujemy wszystkie zmienne, to warto wykorzystywać opcję Option Explicit, dzięki której Excel wyświetli nazwę wszystkich niezadeklarowanych jawnie zmiennych, co umożliwi zwiększenie szybkości poprawiania kodu. Przykładowy kod działania instrukcji Option Explicit jest przedstawiony na rys. 6.
Rys. 6. Kod wykorzystujący instrukcję Option Explicit
Bez tej instrukcji niemożliwe jest komunikatu błędu.
Programowanie VBA: Określ reguły i stosuj je!
Język programowania ma reguły, których nie można złamać (ponieważ powstanie błąd). Do tych zasad warto dopisać swoje własne np. stosowanie opisowych nazw zmiennych, stosowanie wielkich liter dla nazw stałych itp. Aby uświadomić sobie potęgę niepisanych reguł spróbuj przeanalizować kod z rys. 7:
Rys. 7. Działające makro bez zastosowania opisowych nazw zmiennych
Słowa liczba1, liczba2, liczba3 oraz Makro1 nie pomagają w odgadnięciu do czego służy makro. Co więcej, bardzo łatwo popełnić błąd w poprawie tego makra. Proszę spojrzeć na kod z rys. 8.
Rys. 8. Makro obliczające silnię
Makro ma nazwę, z której można wywnioskować, co robi dana procedura. Analizując całą procedurę wiemy, że makro ma na celu obliczenie silni. Kolejną zmienną której przeznaczenie łatwo odgadnąć to zmienna wynik (ma na celu przechowywanie końcowegorezultatu). Ogólna zasada stosowania jednoliterowych nazw zmiennych stosowana jest do pętli. Po analizie trzech pierwszych deklaracji można domyślać się, że liczba będzie tym, co pochodzi od użytkownika. W tym przypadku możliwości są co najmniej trzy:
- przy pomocy podanej liczby będzie trzeba obliczyć wynik silni, czyli po podaniu liczby trzy użytkownik otrzyma liczbę sześć,
- użytkownik podaje wynik silni, natomiast makro podaje największą liczbę której silnia jest mniejsza lub równa od wyniku danej silni, np. użytkownik podaje liczbę osiem, to otrzymuje liczbę trzy,
- użytkownik podaje wynik silni, natomiast makro podaje najmniejszą liczbę której silnia jest większa lub równa od wyniku danej silni, np. użytkownik podaje liczbę osiem, to otrzymuje liczbę cztery
Po dalszej analizie kodu można wywnioskować, że pierwsza opcja jest prawidłowa. Oczywiście w przypadku kodów programista zrozumie co robi makro, jednak czas poświęcony na analizę będzie krótszy w przypadku kodu z rys. 8.
Programowanie VBA: Deklaruj zmienne i stałe
Zadanie: Napisz funkcję obliczającą podatek do zapłaty Urzędowi Skarbowemu w zależności od dochodów osoby. Poniżej przedstawiono tabelę wg której należy obliczać podatek:
Proszę spojrzeć na pierwsze rozwiązanie z rys. 9:
Rys. 9. Funkcja obliczająca podatek
Funkcja poprawnie obliczy podatek, jednak w przypadku zmiany oprocentowania lub progu podatkowego należy zmienić każdą liczbę. Przykładowo zmiana oprocentowania z 20% na 19% spowoduje konieczność zmiany w trzech miejscach. Proszę spojrzeć na kod z rys. rys. 10.
Rys. 10. Obliczenie podatku z wykorzystaniem stałych
Dzięki temu, że w kodzie wykorzystano stałe, to zmiana ich w aplikacji nie wymaga tak dużo czasu, jak w przypadku, gdy z tych stałych nie korzystaliśmy.