Wokół VBA narosło przez lata wiele różnych mitów. Jeden z nich mówi o tym, że praca w tym środowisku to głównie nagrywanie makr i ich późniejsza obróbka. Takie podejście wynika zarówno z niewiedzy jak i uprzedzeń wobec VBA. Podobnie jak w innych językach programowania, także tutaj możemy określić kilka poziomów zaawansowania. W tym artykule opiszę Ci jak może wyglądać ścieżka nauki VBA i co powinien umieć JUNIOR, MID i SENIOR.
Kim jest VBA Developer?
Słowo developer nie ma dobrego odpowiednika w języku polskim. Mi od zawsze kojarzyło się z kimś, kto buduje osiedla. W praktyce zakres działań takiego developera jest znacznie szerszy. Nie tylko buduje on domy, ale zarządza całym procesem: kupuje grunty, dba o uzyskanie pozwoleń, współpracuje z architektami. W końcu – zajmuje się sprzedażą lub wynajmem tych nieruchomości.
Podobnie wygląda sytuacja w przypadku developera IT. Pojęcie to jest dużo szersze od programisty. Chodzi tu o osobę, która nie tylko pisze kod, ale dba o rozwój oprogramowania, wymyśla nowe pomysły, odpowiada za wdrożenie w firmie i dba o to, aby wszystko działało prawidłowo.
Słowo developer pochodzi od angielskiego czasownika develop co oznacza rozwijanie czy też rośnięcie. W polskiej pisowni czasami zamienia się v na w – ja pozostanę przy tej oryginalnej.
Jak to się ma do VBA? Czy osoba, która nagrywa makra i pisze prosty kod jest już developerem? Zdecydowanie NIE. Nie jest ona nawet programistą. Developerem jest ktoś kto tworzy i dystrybuuje (odpłatnie) swoje produkty. Może być nim też osoba, która projektuje aplikacje na zamówienie i implementuje je w środowisku klienta.
W kontekście znajomości VBA wydzieliłem role: JUNIORA, MIDA i SENIORA. Ale tylko tego ostatniego nazwałbym VBA Developerem.
JUNIOR pisze makra
JUNIOR w mojej ocenie to ktoś, kto zbudował już solidny warsztat VBA, i potrafi pisać samodzielnie proste makra.
Zastanówmy się, co musi się znaleźć w tym warsztacie…
Teoria
W pierwszej kolejności JUNIOR powinien wiedzieć jak działa język obiektowy i czym różni się od proceduralnego. Musi dobrze rozumieć takie pojęcia jak: obiekt, kolekcja, hierarchia, właściwość, metoda i parametr. Powinien umieć je zilustrować na przykładach z życia.
Musi także wiedzieć czym jest VBA, po co go używamy i jakie korzyści niesie ze sobą automatyzacja.
Praktyka
Wbrew pozorom, nawet osoba na najniższym szczeblu powinna zbudować solidny warsztat. VBA wcale nie jest taką wąską dziedziną, jak to niektórzy opisują. To głęboka woda – ale też ocean możliwości.
Co zatem musisz umieć jako JUNIOR?
Zmienne
Prawidłowa deklaracja zmiennych to must-have każdego dobrego programisty. Na tym poziomie musisz wiedzieć po co to robić. Oprócz tego, musisz „czuć” czym jest zmienna i wiedzieć jakie są jej komponenty tj. nazwa, wartość, typ i zasięg.
Bardzo ważną rolę odgrywa tu także operator przypisania wartości do zmiennej. W VBA jest on reprezentowany przez znak równości, toteż zapis: i = i + 1 nie może Cię dziwić ;).
Edytor Visual Basic
Edytor kodu VBA, mimo, że leciwy i nieaktualizowany – jest bardzo przyjemnym miejscem pracy. Posiada on wiele kluczowych okienek, które domyślnie są wyłączone. Twoim zdaniem będzie więc także reorganizacja tego panelu.
Musisz wiedzieć jak odpytywać w okienku Immediate, jak monitorować zmienne w Locals i Watches. Musisz też rozumieć jak współpracują ze sobą okna projektu i właściwości, a także jak korzystać z przeglądarki obiektów i systemu pomocy.
Procedury i funkcje
Jednym z kluczowych tematów w VBA jest rozróżnienie pomiędzy procedurą (Sub), a funkcją (Function). Procedura zwykle wykonuje jakieś zadanie zaś funkcja zwraca wynik będący rezultatem pewnych obliczeń. Ważne aby wiedzieć, kiedy napisać procedurę, a kiedy funkcję.
Operatory
VBA, podobnie jak inne języki posiada całą gamę operatorów. Są to:
- Operatory matematyczne: + – * ^ / \ MOD.
- Operatory porównania: =, <>, >, <, >=, <=, Like, Is Nothing. Kluczowe są dwa pierwsze i ostatnie.
- Operatory logiczne: And, Or, Not. Warto zwrócić uwagę na ten ostatni i przyswoić, że FAŁSZ = NIE PRAWDA, a PRAWDA = NIE FAŁSZ. Zastanów się też, dlaczego taka instrukcja działa prawidłowo: ActiveWindow.DisplayGridlines = Not ActiveWindow.DisplayGridlines
Instrukcje warunkowe
Instrukcja If… End If jest bardzo często wykorzystywana w kodzie VBA, i to w wielu różnych formach. Bywa ona zagnieżdżana, rozszerzana o warunki ElseIf, czy też wspierana o operatory logiczne.
Instrukcja Select Case jest bardziej wygodna i sprawdzi się tam, gdzie mamy większą liczbę kombinacji do sprawdzenia.
Prosta komunikacja
Solą rozwiązań VBA jest interakcja z użytkownikiem. W wersji PRO odbywa się ona poprzez formularze użytkownika, zaś w wersji podstawowej – dzięki okienkom MsgBox i InputBox.
W przypadku MsgBox nie powinieneś się ograniczać tylko do komunikatów z przyciskiem OK. Jako JUNIOR musisz wiedzieć, jak sprawdzić, który przycisk kliknął użytkownik i zareagować odpowiednio na jego wybór.
Operacje na komórkach
Obiekt Range jest najważniejszy w całym VBA. Nie jest on jednak precyzyjny ponieważ możemy do niego przypisać pojedynczą komórkę, (nie)ciągły zakres komórek, pojedynczy wiersz/kolumnę czy też kilka wierszy/kolumn.
Najważniejsze właściwości do opanowania to: CurrentRegion, Resize, Offset, UsedRange, Rows, Columns, End. To jest absolutne must-have.
Przyda się także znajomość notacji R1C1, która pozwoli Ci w łatwy sposób wstawiać do komórek formuły.
Pętle
W VBA mamy trzy rodzaje pętli, z których najprostsza jest obiektowa For Each. Myślę, że warto od niej zacząć swoją naukę „przechodząc” po komórkach zakresu.
Pętla licznikowa For Next jest jednak najważniejsza i ona też obowiązkowo musi znaleźć się w warsztacie JUNIORA.
Dobrze również poznać cztery odmiany pętli logicznej Do … Loop, chociaż jest ona najrzadziej wykorzystywana w praktyce.
Dobre i złe praktyki
Dobry programista już na tym etapie powinien zadbać o jakość swojego kodu tj. aktualizować komentarze i dbać o czytelność (wcięcia, podział linii),
Dobrze jest też optymalizować kod pod względem wydajności (wyłączać migotanie ekranu i przeliczanie automatyczne; korzystać z With… End With; nie używać Select, Selection, ActiveSheet i przede wszystkim – nie odkrywać koła na nowo, tylko bazować na wbudowanych mechanizmach Excela).
MID tworzy narzędzia
MID to w mojej ocenie osoba, która posiadła umiejętność budowania prostych narzędzi. Zwykle składają się one z kilku powiązanych ze sobą makr. Elementami sterującymi mogą być formanty ActiveX lub kontrolki formularza umieszczone bezpośrednio w arkuszu.
Teoria
Na tym poziomie MID powinien znacznie wydłużyć czas planowania. Powinien dobrze przemyśleć logikę działania narzędzia i podzielić pracę na etapy (makra). Brak takiego porządku może skutkować stworzeniem rozwiązania, które będzie działać wolno lub nie będzie spełniać wszystkich wymogów.
Praktyka
W pierwszej kolejności MID powinien wiedzieć jak łączyć ze sobą poszczególne makra i jak skutecznie obsłużyć ewentualne błędy. Powinien także wiedzieć jak uruchamiać kod automatycznie i jak używać tablic do efektywnej pracy.
Oprócz VBA powinien znać na dobrym poziomie Power Query i Power Pivot. Oba narzędzia mogą być przydatne, jeśli zachodzi potrzeba importu danych lub stworzenia relacyjnego modelu.
Co zatem musisz umieć jako MID?
Parametryzacja
Osoby, które dopiero zaczynają z Excelem, często mają tendencję do umieszczania wszystkich danych w jednej dużej tabeli. Nie wiedzą jeszcze, że lepiej jest stworzyć kila mniejszych i powiązać je relacjami.
Bardzo podobnie jest w VBA. Początkujący często umieszczają kod w jednej, długiej procedurze, zamiast podzielić ją na mniejsze części. Lepiej jest utworzyć procedury z parametrami, a w procedurze głównej wywoływać je z konkretnymi wartościami (argumentami).
Takie podejście jest zgodne z kanonami VBA. Po pierwsze, eliminujemy zduplikowany kod. Po drugie, taką procedurę możemy skopiować do całkiem innego projektu i będzie działać.
Obsługa błędów
Obsługa błędów nie jest tematem zbyt seksownym ;). Jest jednak konieczna, ponieważ każdy błąd powinien być właściwie obsłużony, nawet jeśli tworzymy narzędzie tylko dla siebie.
Oprócz numeru i opisu, dobrze jest wyświetlić nazwę procedury i modułu, w którym wystąpił błąd. Idealnie jest także wskazać numer linii, jednak edytor VBA nie posiada takiej opcji i wymaga to instalacji dodatku np. MZ-Tools.
Tablice
O ile JUNIOR ma prawo tworzyć nieoptymalny kod, o tyle MID powinien już pisać wydajne makra. Jednym z filarów takiego podejścia jest przetwarzanie danych w tablicach, a nie komórkach arkusza. Jako MID musisz zatem świetnie opanować import i eksport danych na linii: tablica-arkusz.
Podstawą jest tu znajomość tablic jedno i dwuwymiarowych (statycznych i dynamicznych) oraz poleceń LBound i UBound, które są absolutnie kluczowe w nauce VBA i bardzo często występują w duecie z pętlą licznikową For Next.
Zdarzenia
Im trudniejszy projekt, tym częściej zachodzi potrzeba wykorzystania zdarzeń. Często bowiem chcemy, aby kod uruchamiał się samoczynnie.
Generalnie zdarzenia pozwalają nakładać pewne ograniczenia na użytkowników, co w narzędziach VBA jest wysoce… pożądane. Możemy np. blokować kasowanie danych, sterować dostępem do arkuszy, uniemożliwiać zapis pliku czy wyświetlenie menu podręcznego.
Operacje na arkuszach
Obok Range, MID powinien dobrze poznać obiekt Worksheet, który pozwala wykonywać różne operacje na arkuszach. Może to być np. eksport wszystkich zakładek do osobnych plików, spis arkuszy wraz z hiperłączami, dodawanie arkuszy na koniec listy, a nawet ich sortowanie po nazwie.
Oczywiście niezbędna jest także znajomość różnic pomiędzy kolekcją Worksheets, a Sheets.
Operacje na skoroszytach
Trzecim kluczowym obiektem w VBA jest Workbook, który pozwala na zarządzanie plikami Excela. Oprócz otwierania i zamykania, MID powinien znać wszelkie właściwości i metody związane z zapisywaniem zmian i tworzeniem kopii.
Odczytywanie danych z innych plików Excela, czy też uruchamianie stamtąd makr, nie powinno stanowić problemu.
SENIOR automatyzuje procesy
SENIOR to jedyna osoba w tym zestawieniu, którą nazwałbym VBA Developerem. Co prawda, MID też tworzy narzędzia, ale są one proste i raczej na własny lub wewnętrzny użytek. SENIOR automatyzuje całe procesy biznesowe i buduje profesjonalne aplikacje klienckie.
Teoria
SENIOR współpracuje ściśle z biznesem, więc po pierwsze – powinien być osobą komunikatywną i otwartą na feedback. Powinien być także anielsko cierpliwy i bardzo dokładny. Zamiłowanie do porządku i krytyczne myślenie to absolutnie topowe cechy dobrego developera VBA.
Projektowanie aplikacji to ciężki kawałek chleba, więc aby zadbać o własny interes, a jednocześnie dostarczyć klientowi to, czego chce – SENIOR powinien orientować się w zwinnych metodykach zarządzania projektami IT np. Scrum.
Mamy tu więc dodatkowe kompetencje miękkie i wiedzę bardziej ogólną IT.
Praktyka
O ile MID pracował głównie z kodem (backend), o tyle SENIOR odpowiada także za warstwę wizualną aplikacji (frontend). Możemy więc powiedzieć, że jest on FULL STACK DEVELOPEREM, ponieważ łączy w sobie pracę programisty i projektanta.
Co musisz umieć jako SENIOR?
Moduły klas
Tworzenie własnych obiektów nie jest czymś niezbędnym – Excel posiada kilkaset wbudowanych i rzadko istnieje potrzeba tworzenia własnych. Są jednak sytuacje dość abstrakcyjne np. dostęp do zdarzeń poziomu aplikacji czy też dostęp do zdarzeń wykresu osadzonego w arkuszu.
Moduły klas przydają się jednak bardzo w dwóch przypadkach. Po pierwsze, gdy pracujemy z formularzami użytkownika. Zawsze jest bowiem dobrze – zgodnie z zasadą hermetyzacji – oddzielić dane od analizy biznesowej. Po drugie, gdy mamy na formularzu wiele kontrolek tego samego typu. Zamiast przypisywać każdej z nich niemal identyczny kod, lepiej utworzyć klasę i wrzucić jej elementy do kolekcji.
Formularze użytkownika
UserFormy to wisienka na torcie całego VBA i przyznam, że jest to też mój konik. Ich celem jest interakcja z użytkownikiem i pobranie od niego informacji, czy też wytycznych do dalszych działań.
Projektowanie estetycznych i łatwych w obsłudze formularzy jest sztuką. Nie piszę tego bez kozery, bowiem wygląd wbudowanych kontrolek nie zmienił się od lat 90`tych. Ale wystarczy odrobina dobrego smaku wspartego nutką krytycyzmu, aby stworzyć intuicyjny i fajny wizualnie formularz. Wbrew pozorom nie jest to żadna kość niezgody. Moi Klienci nigdy na to nie narzekali. Wręcz przeciwnie – byli pod wrażeniem, że takie okna można zrobić w Excelu.
Wstążka
Profesjonalne aplikacje VBA często wymagają dedykowanej wstążki do uruchamiania makr. Od 2007r. plik Excela jest skompresowanym plikiem, który mieści w sobie różne pliki XML.
Aby przygotować własną wstążkę nie trzeba jednak znać tego języka. Wystarczy świetny i darmowy dodatek RibbonX Visual Designer.
ADO
ActiveX Data Object to fenomenalna biblioteka, która pozwala łączyć się z innymi plikami Excela, plikami tekstowymi (w tym CSV), a także bazami danych. Dzięki zapytaniom SQL pozwala wgrać do Excela interesujące nas dane.
W obliczu rosnącej popularności Power Query, ADO straciło mocno na znaczeniu, ale jego atuty nie kończą się na pobieraniu danych. Pozwala ono dodawać, aktualizować i usuwać rekordy z baz danych. Działa bardzo szybko i w przeciwieństwie do PQ – nie tworzy łączy.
Współpraca z Office
Developer VBA, jak wskazuje jego nazwa, powinien nie tylko dobrze znać model obiektowy Excela, ale także najważniejsze obiekty Worda, Outlooka, Accessa czy nawet Power Pointa.
W praktyce dość często istnieje potrzeba łączenia się z tymi aplikacjami. Zamiast tworzyć opasły kod, który buduje coś od zera – lepiej przygotować formatkę (maila, dokumentu, prezentacji) i później wprowadzać w niej drobne zmiany.
Biblioteki zewnętrzne
To co napędza VBA to dostęp do obiektów spoza Excela. Wspomniałem już o ADO i pakiecie Office, ale warto wymienić także choćby Microsoft Scripting Runtime, która pozwala dokonywać różnych operacji na plikach i folderach w bardzo komfortowy sposób.
Z poziomu VBA możemy także odczytywać dane ze stron internetowych (nie tylko z tabel!). W tym celu musimy zapoznać się z takimi bibliotekami jak np. Microsoft HTML Object Library czy też Microsoft XML.
Eksport do plików tekstowych
O ile kwestię importu i przekształcania danych załatwia nam Power Query, o tyle eksport danych do formatów txt i csv to już działka VBA. A tutaj zapotrzebowanie na taki kod jest bardzo duże.
Po pierwsze, firmy często potrzebują wczytywać końcowe wyniki do różnych systemów np. SAP. Po drugie, w plikach Excela nie powinniśmy przechowywać setek tysięcy wierszy, bo spuchnie nam plik. Lepiej dane zapisać do txt, a następnie utworzyć połączenie w Power Query. Po trzecie, w świetnej obsłudze błędów mamy plik tekstowy (log), który przechowuje wszystkie błędy jakie się pojawiły. Dopisywanie danych do takiego pliku najlepiej załatwić makrem.
Podsumowanie
Jak widać, nauka VBA to „gruby” temat i nawet na poziomie JUNIORA niezbędne jest zbudowanie solidnego warsztatu. Im wyższy stopień, tym rośnie poziom skomplikowania i liczba problemów, o których nie wiemy zaczynając pracę. Taka jest jednak specyfika projektów informatycznych – ciągle odkrywamy nieznane, a priorytety zmieniają się dynamicznie. Jest to praca bardzo czasochłonna i dla wytrwałych. Z tej racji, dobrze jest realizować projekt VBA w oparciu o zwinne metodyki zarządzania. Tak aby zabezpieczyć swój interes, oraz dostarczyć Klientowi projekt zgodny z jego oczekiwaniami.
W tym artykule wymieniłem nieco ponad 20 zagadnień, które trzeba opanować, aby zostać VBA Developerem. Skupiłem się tylko na najważniejszych kwestiach, bo listę tą mógłbym spokojnie podwoić.
Rejestrator makr jest przydatnym i często niezastąpionym narzędziem, jednak postrzeganie całego VBA przez pryzmat obróbki nagranego kodu jest dużym nadużyciem i ignorancją. Takie podejście niestety jest dość popularne lecz mam nadzieję, że ten artykuł skutecznie wyprowadzi z błędu ludzi, którzy tak myślą.