Wprowadzenie.
W zeszłym tygodniu mieliśmy krótkie wprowadzenie do prostego obiektu klasy niestandardowej z tylko dwiema właściwościami, dla Długości i Szerokość Wartości. Metoda obliczania Powierzchni czegokolwiek, z wartościami długości i szerokości. Mam nadzieję, że zrozumiałeś podstawy modułu klasy niestandardowej Ms-Access. Jeśli nie, oto link:Moduł klasy Ms-Access i VBA. Odwiedź tę stronę przed kontynuowaniem.
Class Module Objects zapisuje dużo kodu w twoich programach. Kiedy znajdziesz coś, co powtarzasz w kodzie, pomyśl o obiekcie modułu klasy. Powtarzający się kod można również przekształcić w funkcję użytkową, ale w przypadku obiektów klas musisz przyjąć inne podejście.
W przypadku prostego zadania może być potrzebne więcej kodu, aby udoskonalić funkcje obiektu Class Module, ale główne programy modułów będą proste, a cały skomplikowany kod opracowany i udoskonalony pozostanie ukryty przed innymi.
Ale na razie mamy prosty moduł klasy, spróbujemy stworzyć tablicę obiektów, aby obliczyć obszar wielu elementów.
Podprocedura ClassArray().
Przykładowy kod VBA w module Standard tworzy tablicę pięciu obiektów klasy ClsArea i drukuje ich wartości właściwości oraz wynik metody w oknie debugowania. Skopiuj i wklej (lub lepiej, jeśli je wpiszesz, aby lepiej poznać każdą linię, co robią) następujący kod do modułu standardowego:
Public Sub ClassArray() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String Dim L As Long, U As Long title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next ‘PRINTING SECTION 'Print the Array contents into the Debug Window L = LBound(CA) U = UBound(CA) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With CA(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next ’stop 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Kliknij gdzieś w środku kodu i naciśnij F5, aby wykonać kod. Wprowadź wartości opisu, długości i szerokości z klawiatury dla 5 różnych elementów, jeden po drugim.
Przykładowy przebieg programu jest podany poniżej:
Description Length Width Area Door Mat 5 8 40 Carpet 12 23 276 Bed Room 21 23 483 Store Room 15 25 375 Terrace 40 50 2000
Przegląd linii kodu po linii.
Przeanalizujmy kod linia po linii. W obszarze deklaracji zadeklarowaliśmy zmienną obiektu tmpA typu ClsArea. W drugim wierszu zadeklarowano pustą tablicę CA() typu ClsArea. Wymagana liczba elementów zostanie ponownie zwymiarowana w dalszej części programu.
W kolejnych dwóch wierszach zadeklarowaliśmy zmienne title typu String i j, L, i U zmienne typu Long Integer.
Następnie zmienna title jest inicjowana ciągiem „ClassArray” i będzie używana jako tytuł w funkcji InputBox(). Dla….Dalej pętla jest ustawiana za pomocą zmiennej kontrolnej j uruchomić pętlę pięć razy. Po kolejnych dwóch wierszach komentarza Ustaw oświadczenie następuje (przydziela pamięć) Obiekt klasy ClsArea w pamięci o nazwie tmpA .
Następne trzy wiersze kodu służą do wprowadzania wartości dla strDesc , dblLength, i dblWidth Właściwości obiektu klasy tmpA.
Po następnym wierszu komentarza obiekt klasy ClsArea (CA) jest ponownie wymiarowany dla 1 do j razy (od 1 do 1 raz), zachowując istniejące elementy Object, jeśli takie istnieją (jest to pierwszy obiekt w tablicy). Będzie to rosło dzięki ReDim instrukcji, do 1 do 2, 1 do 3, 1 do 4 i 1 do 5, zachowując wcześniejsze wartości obiektów w For . . . Następna pętla. Ochrona słowo kluczowe zapewnia, że istniejące obiekty tablicy nie zostaną utracone.
Uwaga: Instrukcja Re-Dimension zwiększa/zmniejsza liczbę określonych elementów obiektów, ale usuwa istniejące obiekty wczytane do tablicy wcześniej, bez Zachowaj słowo kluczowe.
Zestaw instrukcja w następnym wierszu kopiuje obiekt tmpA wraz z jego danymi do CA(j) Nowo utworzony obiekt ClsArea j element tablicy.
Następny wiersz Ustaw tmpA =Nic usuwa tymczasowy obiekt z pamięci.
Pętla For…Next powtarza tę czynność jeszcze cztery razy, aby wprowadzić inne elementy do nowo utworzonego obiektu tymczasowego tmpA, jeden po drugim, i kopiuje obiekt do tablicy obiektów CA.
Następne dwa wiersze, po wierszu komentarza, znajdź zakres indeksu Object Array (znajduje najniższy i najwyższy numer indeksu.
Następny Debug.Print instrukcja drukuje wiersz nagłówka w 14 strefach kolumn w oknie debugowania. Dla. . . Dalej pętla z L i U zakresy numerów indeksów tablicy powiązanej uruchamia wewnętrzne instrukcje, aby uzyskać dostęp do każdego obiektu z tablicy CA, z numerem indeksu w zmiennej kontrolnej j.
Bieżące odniesienie do obiektu jest ustawione w With. . . Zakończ na zamiast powtarzania nazwy obiektu CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth i CA(j).Obszar aby wydrukować wyniki wartości właściwości obiektu i metody Area() w oknie debugowania.
Usuń symbol komentarza z „Zatrzymaj instrukcja, aby utworzyć pauzę w Programie w instrukcji Stop. Uruchom kod ponownie i wprowadź 5 szczegółów pozycji, aby móc poeksperymentować z obiektem tablicy. Możesz selektywnie adresować dowolną właściwość obiektu za pomocą numeru indeksu tablicy, aby edytować lub wydrukować dowolną wartość w oknie debugowania, jak pokazano poniżej.
Stwierdzenie Ustaw CA(j) =Nic w ramach For. . . Następna pętla czyści obiekty tablicy, jeden po drugim, z pamięci.
Przekaż tablicę obiektów klasy jako parametr funkcji.
Tablicę obiektów klasy możemy przekazać do programu jako parametr, tak jak to zrobiliśmy w przypadku typu danych zdefiniowanego przez użytkownika.
Stwórzmy prosty podprogram drukowania, wycinając kod sekcji drukowania programu głównego i umieszczając go w nowym programie.
Skopiuj kod podprogramu ClassArray(), wklej go w tym samym module standardowym i zmień nazwę na ClassArray2(), jak pokazano poniżej.
Public Sub ClassArray2() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String Dim L As Long, U As Long title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next ‘PRINTING SECTION 'Print the Array contents into the Debug Window L = LBound(CA) U = UBound(CA) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With CA(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next ’stop 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Kod ClassArray2 bez sekcji drukowania.
Utwórz nowy podprogram, jak podano poniżej:
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long End Sub
Podświetl sekcję Drukowanie do instrukcji „Stop” w programie ClassArray2(), wytnij podświetlony obszar kodu i wklej go poniżej Dim oświadczenia w ClassPrint() Program. Zmodyfikowana wersja obu Kodów jest podana poniżej:
Public Sub ClassArray2() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next Call ClassPrint(CA) ‘Pass the Object Array to print routine 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Program ClassPrint().
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long 'Printing Section 'Print the Array Contents into the Debug Window. L = LBound(clsPrint) U = UBound(clsPrint) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With clsPrint(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next End Sub
Sprawdź zmiany w kodzie w obu programach i dokonaj poprawek, jeśli ma to zastosowanie. Kliknij w środku kodu ClassArray2() i naciśnij klawisz F5, aby uruchomić program.
Instrukcja Call w pierwszym programie przekazuje tablicę obiektów klasy CA jako parametr ByRef do podprogramu ClassPrint(). Program wypisuje właściwości obiektu i wywołuje funkcję Area() w celu obliczenia i zwrócenia wartości do wydrukowania.
W przyszłym tygodniu dowiemy się, jak używać naszego modułu ClsArea Class jako klasy bazowej do tworzenia nowego obiektu klasy VBA w celu obliczenia Głośności czegoś.
- Moduł klasy MS-Access i VBA
- Tablice obiektów klasy MS-Access VBA
- Klasa bazowa MS-Access i obiekty pochodne
- Klasa podstawowa VBA i obiekty pochodne-2
- Warianty klasy bazowej i obiektów pochodnych
- Ms-Access Recordset and Class Module
- Dostęp do modułu klas i klas opakowujących
- Transformacja funkcjonalności klasy opakowującej
- Podstawy dostępu do MS i obiektów kolekcji
- Moduł klasy Ms-Access i obiekt kolekcji
- Rekordy tabeli w obiekcie i formularzu kolekcji
- Podstawy obiektów słownikowych
- Podstawy obiektów słownika-2
- Sortowanie kluczy obiektów i elementów słownika
- Wyświetl rekordy ze słownika do formularza
- Dodaj obiekty klasy jako elementy słownika
- Aktualizuj element słownika obiektów klasy w formularzu