Samouczek i przykłady modułu klasy VBA

Ten samouczek nauczy Cię o modułach klas w VBA. Dowiesz się, czym one są i jak z nich korzystać.

Moduły klasy VBA - wprowadzenie

Kiedy wstawiasz moduły do ​​edytora Visual Basic (VBE) w celu wprowadzenia kodu, być może zauważyłeś, że możesz również wstawić tak zwany „moduł klasy”.

Moduły klasowe a moduły

Moduły klas działają w zupełnie inny sposób niż zwykłe moduły, ponieważ ułatwiają tworzenie Component Object Model (COM), które można następnie wykorzystać w normalnym kodzie VBA

Skutecznie tworzysz obiekt, który działa w taki sam sposób, jak wbudowany obiekt Excela, taki jak „Arkusze”. W obiekcie Worksheets masz wiele właściwości i metod, które pozwalają uzyskać liczbę arkuszy roboczych w skoroszycie lub każdą indywidualną nazwę arkusza roboczego lub wiele innych informacji

Kiedy tworzysz nowy obiekt w ten sposób, tworzysz blok konstrukcyjny, którego można używać w dowolnym miejscu w VBA. Object ma wiele właściwości i metod, do których można uzyskać dostęp za pomocą kodu VBA z dowolnego miejsca w skoroszycie bez konieczności ponownego pisania kodu.

Oprócz odwoływania się do nowego obiektu ze standardowego modułu VBA, możesz również użyć go w kodzie za formularzem użytkownika, który jest częścią niestandardowej aplikacji

Możesz go również użyć, gdy umieściłeś kontrolki Active X w arkuszu, na przykład przycisk polecenia lub listę rozwijaną. Wszystkie te kontrolki używają języka VBA, a nowy obiekt można łatwo włączyć do kodu zdarzenia dla tych kontrolek.

Możesz także zamienić swój obiekt w dodatek Excela. Twój obiekt będzie automatycznie dostępny dla innych użytkowników, którzy mają załadowany ten dodatek. Dodaje to własną wielowarstwową architekturę do aplikacji Excel

Excel to aplikacja wielowarstwowa. Istnieje warstwa usług klienta, która steruje rzeczywistym oknem arkusza roboczego, z którym użytkownik jest zaznajomiony. Kolejną warstwą pod spodem jest model obiektowy Excela. Naciśnij F2 w module VBA, a zobaczysz ogromną liczbę obiektów i członków tych obiektów, które są silnikiem Excela. Zwróć uwagę, że Twój nowy obiekt również zostanie tutaj wyświetlony.

Wreszcie pod tym wszystkim znajduje się warstwa usług danych, która zawiera wszystkie dane, które wprowadziłeś do arkuszy roboczych i komórek. Program Excel uzyskuje do tego dostęp za pomocą modelu obiektów programu Excel.

Tworzenie modułu klasy pozwala rozszerzyć moduł obiektów programu Excel o własne niestandardowe obiekty i członków

W tym artykule wyjaśniono, jak utworzyć prostą hierarchię obiektów za pomocą modułów klas.

Zalety korzystania z modułów klas

  1. Możesz opracować solidny blok konstrukcyjny, który można wykorzystać w dowolnej liczbie różnych aplikacji Excel
  2. Po dokładnym przetestowaniu można polegać na tym, że zawsze generuje prawidłowe wyniki w taki sam sposób, jak wbudowane obiekty Excela
  3. Jeśli aktualizacje kodu zostaną wprowadzone w innym miejscu aplikacji, nowy obiekt będzie nadal działał w ten sam sposób
  4. Możesz użyć swojego nowego obiektu w innych aplikacjach Excela jako dodatku
  5. Obiekty mogą być ponownie użyte w innych aplikacjach i pomagają w debugowaniu

Wady korzystania z modułów klas

  1. Mogą być trudne do stworzenia i zrozumienia.
  2. Konwencje nazewnictwa są bardzo ważne, ponieważ to zobaczysz, gdy użyjesz swojego obiektu w normalnym module.
  3. Jeśli nie stworzyłeś wcześniej modułu zajęć, mogą być trudne do zrozumienia, a krzywa uczenia się jest stroma
  4. Nie można dokonać zmian w czasie wykonywania - musisz zresetować projekt.
  5. Jeśli właściwości i zmienne prywatne mają tę samą nazwę, mogą wystąpić nieskończone pętle powodujące błędy

Wstawianie modułu klasy

Wybierz Wstaw | Class Module z menu VBE (Visual Basic Editor). Nowy moduł klasy zostanie automatycznie nazwany „Klasa 1”, ale należy to natychmiast zmienić na nazwę, której będziesz używać dla swojego obiektu

Możesz zmienić nazwę w oknie Właściwości, w którym wskazuje strzałka. Wystarczy wpisać swoją nową nazwę, a zmieni się to w kolekcji Class Modules

Jeśli okno Właściwości nie jest widoczne, wybierz Widok | Właściwości w menu VBE lub naciśnij F4

Wywołaj nowy moduł klasy „MyItem” i dwukrotnie kliknij nazwę w widoku drzewa w Eksploratorze projektów, aby wyświetlić dla niego okno kodu.

Tworzenie elementu obiektu

Ten przykład utworzy obiekt najwyższego poziomu o nazwie „MyItems” z obiektem członkowskim znajdującym się poniżej o nazwie „MyItem”, który będzie zawierał indywidualne dane dla każdego elementu. Po utworzeniu będzie działać w taki sam sposób, jak wbudowany obiekt Excel. Na przykład istnieje obiekt o nazwie „Arkusze robocze”, który jest zbiorem każdego arkusza roboczego w skoroszycie. Istnieje również obiekt o nazwie „Arkusz”, który reprezentuje każdy arkusz roboczy w skoroszycie i zawiera wszystkie właściwości i metody dla każdego arkusza roboczego. Ten obiekt odnosi się do obiektu kolekcji „Arkusze”.

Możesz iterować po kolekcji „Arkusze”, przeglądając kolejno każdy „Arkusz”. W ten sam sposób będziesz mógł przeglądać kolekcję „MyItems”, przeglądając właściwości utworzone w elemencie „Myitem”.

Pierwszą rzeczą do zrobienia jest utworzenie podobiektu dla poziomu członka, który będzie zawierał rzeczywiste elementy w kolekcji obiektu najwyższego poziomu. Jest to odpowiednik członków (np. Nazwa, widoczna, liczba) w obiekcie „Arkusz” w programie Excel. Ten kod jest wprowadzany do modułu klasy o nazwie „MyItem”

Moduły klas mają właściwości i metody. Właściwości są efektywnie jak zmienne, w tym sensie, że przechowują wartości danych jak zmienne, a Metody są jak podprogramy lub funkcje.

W podobiekcie stworzymy dwie właściwości obiektu - Item i Detail

Początkowo dwie zmienne łańcuchowe muszą być zadeklarowane do przechowywania wartości właściwości:

12 Prywatny mItem jako ciągPrywatny mDetail jako ciąg

Muszą byćzadeklarowane w sekcji Deklaracje na górze kodu modułu klasy aby można było ich używać we wszystkich podprogramach w całym module

Muszą mieć unikalne nazwy, aby różniły się od właściwości, które zamierzamy stworzyć, dlatego przed każdą nazwą umieszczono „m” (od członka).

Zmienne są zadeklarowane jako Prywatne, więc nie mogą być widoczne dla nikogo korzystającego z obiektu. Są zmiennymi roboczymi do użycia w kodzie obiektowym i nie są częścią końcowego obiektu.

Następnym krokiem jest skonfigurowanie kodu, aby dać dostęp do dwóch właściwości. Robisz to za pomocą instrukcji Property Let i Property Get dla każdej nieruchomości. Muszą być publiczne, w przeciwnym razie obiekt najwyższego poziomu nie będzie miał żadnych widocznych właściwości

123456789101112131415 Własność publiczna Let Item (vdata As String)mItem = vdataKoniec właściwościWłasność publiczna Pobierz przedmiot () jako ciągPrzedmiot = mPozycjaKoniec właściwościWłasność publiczna Let Detail (vdata As String)mDetail = vdataKoniec właściwościWłasność publiczna Uzyskaj szczegóły () jako ciągSzczegół = mSzczegółyKoniec właściwości

Ten kod tworzy środki do odczytywania i zapisywania wartości w dwóch właściwościach (Pozycja i Szczegóły) przy użyciu dwóch prywatnych zmiennych, które zostały zdefiniowane w sekcji deklaracji modułu.

Parametr „vdata” służy do przekazywania danych do danej nieruchomości.

Ważne jest, aby każda właściwość zawierała instrukcje „Let” i „Get” oraz aby nazwa właściwości była w każdym przypadku taka sama. W przypadku błędnej pisowni możesz otrzymać dwie różne właściwości - jedną, z której możesz czytać, a drugą, do której możesz pisać!

Aby pomóc w tworzeniu tego kodu, możesz użyć Wstaw | Procedura w menu VBE, aby utworzyć szkielet kodu, który utworzy początkowy kod dla właściwości „Get” i „Let” dla danej nazwy właściwości

Spowoduje to wyświetlenie wyskakującego okna, w którym wpisujesz nazwę nieruchomości i wybierasz „Właściwość” z przycisków opcji:

Kliknij OK, a szkielet kodu zostanie dodany do modułu klasy:

1234567 Własność publiczna Pobierz MyProperty() jako wariantKoniec właściwościWłasność publiczna Let MyProperty (ByVal vNewValue jako wariant)Koniec właściwości

Zapobiega to błędom w nazwach właściwości. Wystarczy dodać swój kod pomiędzy oświadczeniami „Własność publiczna” i „Własność końcowa”.

Masz teraz obiekt o nazwie „MyItem”, w którym będą przechowywane wszystkie dane do tego ćwiczenia.

Masz dość wyszukiwania przykładów kodu VBA? Wypróbuj Automakro!

Tworzenie kolekcji

Następnym etapem jest utworzenie obiektu najwyższego poziomu jako obiektu Collection, aby dać dostęp do właściwości skonfigurowanych w obiekcie „MyItem”

Ponownie musisz zdefiniować obiekt roboczy, który będzie działał jako obiekt kolekcji w taki sam sposób, w jaki zdefiniowałeś dwie zmienne łańcuchowe w obiekcie „MyItem”.

1 Prywatne mItems jako kolekcja

Ponownie, musi to mieć unikalną nazwę, dlatego przed nazwą znajduje się „m” (obiekt członkowski), a także jest zadeklarowane jako „Prywatne”, aby nie pojawiało się, gdy nowy obiekt jest używany

Następnie musisz wypełnić kod Class_Initialize. Działa to, gdy po raz pierwszy używasz obiektu w kodzie i określa, jakie wartości zostaną załadowane do obiektu

Możesz uzyskać dostęp do tej podprogramu, wybierając „Klasa” w pierwszym menu rozwijanym i „Zainicjuj” w drugim menu rozwijanym okna modułu

12345678910 Prywatna klasa podrzędna_Inicjowanie()Dim objItem As MyItemUstaw mItems = Nowa kolekcjaDla n = 1 do 3Ustaw objItem = Nowy MyItemobjItem.Item = Arkusze("Arkusz1").Range("a" & n).ValueobjItem.Detail = Arkusze("Arkusz1").Range("b" & n).ValuemItems.Dodaj objItemNastępna nNapis końcowy

Kod konfiguruje obiekt o nazwie „objItem”, korzystając z definicji „MyItem”, którą zbudowaliśmy wcześniej jako moduł klasy.

Następnie tworzy nową kolekcję na podstawie wcześniej zdefiniowanego obiektu „mItems”

Przechodzi przez wartości przechowywane w arkuszu Arkusz1 skoroszytu i umieszcza je we właściwościach, które utworzyliśmy dla obiektu „MyItem”. Zwróć uwagę, że gdy używasz „objitem”, pojawia się menu rozwijane pokazujące dwie właściwości, dokładnie tak, jakbyś używał wbudowanego obiektu Excela.

Obiekt item jest następnie dodawany do obiektu kolekcji, który teraz przechowuje wszystkie dane w wartościach właściwości.

Dane wejściowe nie muszą być pobierane z arkusza roboczego. Mogą to być wartości statyczne, mogą pochodzić z połączenia z bazą danych, taką jak Microsoft Access lub SQL Server, lub z innego arkusza.

Następnie musisz dodać funkcję publiczną o nazwie „Pozycja”

123 Element funkcji publicznej (indeks jako liczba całkowita) jako MyItemUstaw element = mItems.Item(indeks)Koniec funkcji

Umożliwia to odwoływanie się do poszczególnych obiektów w obiekcie kolekcji według ich numeru indeksu. Ta funkcja zapewnia „lustrzane odbicie” tego, co dzieje się w kolekcji „mMyItems” w tle.

Będziesz także musiał dodać właściwość o nazwie „Count”, aby Twój kod mógł ustalić, ile obiektów „MyItem” znajduje się w kolekcji „MyItems”, jeśli chcesz ją iterować.

123 Własność publiczna Pobierz Count() tak długoLiczba = mItems.CountKoniec właściwości

W tym przypadku potrzebujesz tylko właściwości „Get”, ponieważ jest ona tylko do odczytu. Używa kolekcji mItems, ponieważ ma już wbudowaną właściwość count.

Masz teraz obiekt (MyItems) z pełną hierarchią zdefiniowaną przez obiekt „MyItem”

Aby wszystko działało, musisz teraz wypełnić arkusz roboczy (Arkusz1) danymi, aby procedura inicjalizacji klasy mogła zebrać je w obiekcie

Twój arkusz kalkulacyjny powinien wyglądać tak:

Korzystanie z nowego obiektu

Możesz teraz używać obiektu Collection (MyItems) w standardowym module Excel VBA. Wpisz następujący kod:

12345678 Sub test_object()Dim MyClass As New MyItems, n As IntegerMsgBox MojaKlasa.LiczbaDla n = 1 To MyClass.CountMsgBox MyClass.Item(n).ItemMsgBox MyClass.Item(n).DetailNastępna nNapis końcowy

Ten kod tworzy obiekt o nazwie „MyClass” na podstawie utworzonego obiektu kolekcji o nazwie „MyItems”. To uruchamia procedurę „Inicjalizuj”, która wyodrębnia wszystkie dane z arkusza roboczego do obiektu.

Wyświetla liczbę elementów w kolekcji, a następnie iteruje kolekcję, wyświetlając tekst „Pozycja” i tekst „Szczegóły”. Zauważysz, że kiedy odwołujesz się do obiektu „MyClass” w swoim kodzie, zobaczysz listę dwóch właściwości składowych, które pomagają w dodaniu właściwej właściwości.

Jeśli zmienisz wartość komórki w danych wejściowych w arkuszu kalkulacyjnym, zostanie to automatycznie zaktualizowane w kolekcji po ponownym uruchomieniu powyższego kodu, ponieważ po zwymiarowaniu obiektu uruchomi się procedura inicjowania i pobierze wszystkie nowe dane

Jeśli użyjesz słowa „Static” zamiast „Dim”, procedura inicjalizacji nie zostanie uruchomiona, a stare wartości zostaną zachowane, o ile kod jest stale uruchomiony. Jeśli dane w arkuszu kalkulacyjnym ulegną zmianie, nie zostanie to odzwierciedlone w obiekcie

1234567 Podtest_statyczny()Statyczna Myclass As New MyItems, n As IntegerDla n = 1 To Myclass.CountMsgBox Myclass.Item(n).ItemMsgBox Myclass.Item(n).DetailNastępna nNapis końcowy

Podsumowanie tworzenia obiektu za pomocą modułu klasy

Jak widzieliście, tworzenie hierarchii modułów klas do wykorzystania jako obiekt jest dość skomplikowaną sprawą, nawet dla struktury tak prostej, jak podany tutaj przykład. Możliwości popełniania błędów są ogromne!

Ma jednak ogromne zalety, ponieważ czyni Twój kod bardziej eleganckim i łatwiejszym do odczytania. Łatwiejsze jest również udostępnianie innym aplikacjom Excel i programistom, przekształcając go w dodatek.

W tym przykładzie tworzenia obiektu do przechowywania danych normalnym podejściem byłoby utworzenie wielowymiarowej tablicy do przechowywania danych z wielokolumnowego arkusza kalkulacyjnego i napisanie wiersza kodu, aby zaktualizować lub odczytać każdy element w tablica. Byłoby to prawdopodobnie dość bałaganiarskie i można by łatwo popełnić błędy w zajmowaniu się różnymi elementami.

Za pomocą nowego obiektu możesz po prostu odwołać się do niego i członków, które utworzyłeś pod nim, aby przechowywać dane.

Ponadto, jeśli dane ulegną zmianie w arkuszu kalkulacyjnym (lub w połączonej bazie danych, jeśli użyłeś tego jako źródła danych w module klasy) za każdym razem, gdy użyjesz instrukcji „Dim”, zostanie wywołana procedura inicjalizacji i dane zostaną natychmiast zaktualizowane . Nie ma potrzeby pisania kodu, aby ponownie wypełnić tablicę.

Używanie modułu klasy do tworzenia repozytorium zmiennych

Kiedy piszesz kod VBA, używasz zmiennych w całym miejscu, wszystkie o różnych zakresach. Niektóre mogą być zdefiniowane tylko dla określonej procedury, niektóre dla konkretnego modułu, a niektóre mogą być zmiennymi globalnymi, które mogą być używane w całej aplikacji

Możesz utworzyć moduł klasy, który będzie przechowywać dużą liczbę zmiennych, a ponieważ jest to obiekt, może być używany w dowolnym miejscu w kodzie, nawet w formularzu użytkownika lub w kontrolce Active X, którą umieściłeś w arkuszu.

Dodatkową zaletą jest to, że kiedy odwołujesz się do obiektu zmiennej, zobaczysz listę wszystkich nazw zmiennych przechowywanych w obiekcie posortowaną w porządku rosnącym.

Aby utworzyć repozytorium, musisz wstawić nowy moduł klasy. Robisz to za pomocą Wstaw | Moduł klasy z menu edytora VB

Zmień nazwę na „MyVariables”, korzystając z tej samej metodologii, co omówiono wcześniej w tym artykule.

Wpisz następujący kod:

12345678910111213141516 Prywatny mV jako wariantWłasność publiczna Pobierz zmienną1() jako wariantZmienna1 = mVKoniec właściwościWłasność publiczna Let Variable1 (ByVal vNewValue As Variant)mV = vNowaWartośćKoniec właściwościWłasność publiczna Pobierz zmienną2() jako wariantZmienna1 = mVKoniec właściwościWłasność publiczna Let Variable2 (ByVal vNewValue jako wariant)mV = vNowaWartośćKoniec właściwości

Ten kod konfiguruje właściwości „Let” i „Get” dla dwóch zmiennych („Variable1” i „Variable2”). Właściwości Let i Get są wymagane dla każdej zmiennej, aby można było je czytać / pisać

Możesz użyć własnych nazw zmiennych zamiast przykładowych w tym kodzie i możesz dodać kolejne zmienne, upewniając się, że każda nowa zmienna ma instrukcję „Let” i „Get”.

Prywatna deklaracja zmiennej „mV” ma na celu utworzenie działającej zmiennej, która jest używana tylko w module klasy do przesyłania wartości.

Aby skorzystać z repozytorium zmiennych, wprowadź następujący kod do standardowego modułu:

123456 Global VarRepo jako nowe MyVariablesRepozytorium podrzędnej zmiennej testowej()MsgBox VarRepo.Variable1VarRepo.Zmienna1 = 10MsgBox VarRepo.Variable1Napis końcowy

Ten kod tworzy globalną instancję Twojego obiektu „MyVariables”, który utworzyłeś. Tę deklarację musisz wykonać tylko raz z dowolnego miejsca w kodzie.

Kod najpierw wyświetla wartość „Zmienna1”, aby pokazać, że jest pusta.

Wartość 10 jest przypisywana do „Zmiennej1”, a następnie wyświetlana jest nowa wartość w obiekcie, aby pokazać, że ta właściwość ma teraz tę wartość.

Ponieważ instancja obiektu „MyVariables” została zdefiniowana globalnie, możesz odwoływać się do dowolnej ze zdefiniowanych zmiennych w obiekcie z dowolnego miejsca w kodzie.

Ma to ogromną zaletę, ponieważ jeśli chcesz używać zmiennych w dowolnym miejscu w kodzie, wystarczy zdefiniować jedną zmienną globalną, a od tego wystąpienia wszystkie zmienne mogą być swobodnie dostępne i modyfikowane w całym kodzie.

Przekształcenie obiektu w dodatek

Jak dotąd kod do tworzenia obiektów znajduje się w aplikacji skoroszytu. Jeśli jednak chcesz mieć możliwość udostępniania swojego obiektu innym programistom lub w innych własnych aplikacjach Excel, możesz przekształcić go w dodatek

Aby to zrobić, wystarczy zapisać plik jako dodatek. Wybierz plik | Zapisz jako i pojawi się okno przeglądarki

Wybierz typ pliku jako dodatek (.xlam) z listy rozwijanej typu pliku i kliknij przycisk OK. Plik zostanie domyślnie zapisany w folderze Add-In, ale możesz zmienić lokalizację.

Następnie możesz włączyć plik dodatku do swoich aplikacji Excel, co zapewnia elastyczność w korzystaniu z nowego obiektu

Aby dołączyć nowy dodatek do programu Excel, kliknij Plik na wstążce programu Excel, a następnie kliknij Opcje u dołu lewego panelu

Kliknij „Dodatki” w lewym panelu w wyskakującym oknie, które się pojawi. W dolnej części okna znajduje się przycisk oznaczony „Idź”

Kliknij to, a pojawi się wyskakujące okno „Dodatek”. Kliknij „Przeglądaj”, a następnie zlokalizuj plik dodatku. Będziesz wtedy mógł odnieść się do swojego obiektu w swoim kodzie.

Będziesz pomóc w rozwoju serwisu, dzieląc stronę ze swoimi znajomymi

wave wave wave wave wave