Formularz użytkownika jest przykładem klasy, dlatego w kodzie VBA powinniśmy się odwoływać do jego publicznych metod i właściwości. Niestety większość osób tego nie wie i pracuje na formularzach w zły sposób. Z tego tekstu dowiesz się jak tworzyć właściwości formularza i jak się do nich odwoływać w zewnętrznych procedurach.
Artykuł, który zmienił wszystko…
Wiele lat temu znalazłem w internecie artykuł, który zrewolucjonizował moją pracę w VBA. Piszę te słowa w pełni świadomie, bez krzty przesady. Uważam, że był to najważniejszy tekst jaki przeczytałem kiedykolwiek na temat VBA. Przedstawione w nim praktyki stosuję w swoich aplikacjach od dziesięciu lat!
Autor pisze w nim o trzech bardzo ważnych zasadach pracy z formularzem.
- Bazowaniu na kopii obiektu, a nie na oryginale.
- Odwoływaniu się w zwykłym module do publicznych właściwości UserForma.
- Oddzieleniu logiki biznesowej od formularza.
Pobierz załącznik do artykułu i przetestuj kod samodzielnie.
Kopia, nie oryginał!
Formularz typu UserForm jest specjalną wersją klasy i powinniśmy go używać w ten sam sposób.
W jaki sposób pracujemy na klasach? Jeżeli utworzyliśmy już moduł klasy, to później tworzymy procedurę główną w module zwykłym. Deklarujemy zmienną obiektową i przypisujemy jej nową instancję. W ten sposób tworzymy nowy egzemplarz (obiekt) klasy.
W przypadku formularza powinniśmy działać tak samo. Po utworzeniu kopii, powinniśmy go wyświetlić w trybie modalnym i pobrać od użytkownika wszystkie potrzebne dane. Zaczytać te informacje do zmiennych i zamknąć formularz.
Korzystanie z domyślnej instancji (oryginału) często prowadzi do błędów i utraty danych już wprowadzonych do formularza – metoda Unload.
Właściwości publiczne
Pracując z modułem klasy odwołujemy się do jego metod i właściwości. Nie inaczej powinno być z formularzem. W module zwykłym, powinniśmy pobierać do zmiennych, wartości poszczególnych właściwości formularza. Po pobraniu wszystkich informacji, formularz możemy zamknąć.
W jaki sposób możemy utworzyć właściwość publiczną formularza?
- Deklarujemy zmienną prywatną poziomu modułu. Przykładem może być mbOk – zmienna typu Boolean, która sprawdza czy użytkownik kliknął przycisk OK czy Anuluj na formularzu.
- Kontrolki z tej samej grupy zmieniają wartość zmiennej. Kliknięcie w przycisk OK, zmienia wartość zmiennej mbOk na TRUE. Kliknięcie w przycisk Anuluj zmienia wartość zmiennej na FALSE.
- Instrukcja Property Get tworzy właściwość publiczną na bazie zmiennej prywatnej. Tworzymy właściwość OK, która będzie widoczna poza modułem formularza.
Oddziel dane od analizy!
Celem formularzy UserForm jest zawsze pobranie informacji wejściowych od użytkownika. I nic więcej! Analiza tych danych jest osobnym tematem i ta separacja powinna mieć miejsce również w kodzie VBA.
Analiza danych pobranych od użytkownika nie powinna znajdować się w module formularza lecz w zwykłym module. Analogicznie, w module zwykłym nie powinniśmy sprawdzać wartości poszczególnych kontrolek, lecz bazować na właściwościach publicznych formularza.
Stosowanie reguł w praktyce
Jak wspomniałem w zajawce artykułu, korzystam z tych praktyk od dziesięciu lat i stanowią one pewien paradygmat w moich aplikacjach.
Zobacz przykłady, w których zastosowałem tą metodykę pracy: