Einführung.
Letzte Woche hatten wir eine kurze Einführung in ein einfaches benutzerdefiniertes Klassenobjekt mit nur zwei Eigenschaften, für Länge und Breite Werte. Eine Methode zur Berechnung der Fläche von irgendetwas, mit Längen- und Breitenwerten. Ich hoffe, Sie haben die Grundlagen eines benutzerdefinierten Ms-Access-Klassenmoduls verstanden. Wenn nicht, hier ist der Link:Ms-Access Class Module und VBA. Bitte besuchen Sie die Seite, bevor Sie fortfahren.
Class Module Objects spart viel Code in Ihren Programmen. Wenn Sie etwas gefunden haben, das Sie wiederholt in Code tun, denken Sie an ein Klassenmodulobjekt. Der sich wiederholende Code kann auch in eine Hilfsfunktion umgewandelt werden, aber für Klassenobjekte müssen Sie einen anderen Ansatz wählen.
Für eine einfache Aufgabe kann mehr Code erforderlich sein, um die Funktionen des Klassenmodulobjekts zu verfeinern, aber Ihre Hauptmodulprogramme werden einfach sein und der gesamte komplizierte Code, der entwickelt und verfeinert wird, wird anderen verborgen bleiben.
Aber im Moment haben wir ein einfaches Klassenmodul in der Hand. Wir werden versuchen, ein Array von Objekten zu erstellen, um die Fläche vieler Elemente zu berechnen.
Die ClassArray()-Unterroutine.
Der Beispiel-VBA-Code im Standardmodul erstellt ein Array von fünf Objekten der ClsArea-Klasse und gibt ihre Eigenschaftswerte und Methodenergebnisse im Debug-Fenster aus. Kopieren und Einfügen (oder besser, wenn Sie sie eingeben, um besser zu wissen, was sie in jeder Zeile tun) den folgenden Code in ein Standardmodul:
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
Klicken Sie irgendwo in die Mitte des Codes und drücken Sie F5, um den Code auszuführen. Geben Sie die Werte für Beschreibung, Länge und Breite über die Tastatur für 5 verschiedene Elemente nacheinander ein.
Beispiellauf des Programms ist unten angegeben:
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
Überprüfung des Codes Zeile für Zeile.
Lassen Sie uns den Code Zeile für Zeile untersuchen. Im Deklarationsbereich haben wir eine Objektvariable tmpA deklariert vom ClsArea-Typ. In der zweiten Zeile deklariert ein leeres Array CA() vom ClsArea-Typ. Die erforderliche Anzahl von Elementen wird später im Programm neu bemaßt.
In den nächsten beiden Zeilen haben wir die Variablen title deklariert vom Typ String und j, L, und U Variablen vom Typ Long Integer.
Als nächstes wird die Titelvariable mit dem String „ClassArray“ initialisiert und als Titel in der InputBox()-Funktion verwendet. Das Für….Weiter Schleife wird mit einer Kontrollvariablen j gesetzt um die Schleife fünfmal zu laufen. Nach den nächsten beiden Kommentarzeilen wird das Set -Anweisung instanziiert (weist Speicher zu) ClsArea-Klasse Objekt im Speicher mit dem Namen tmpA .
Die nächsten drei Codezeilen dienen der Eingabe von Werten für strDesc , dblLength, und dblWidth Eigenschaften des tmpA-Klassenobjekts.
Nach der nächsten Kommentarzeile wird das ClsArea-Klassenobjekt (CA) für 1 bis j neu dimensioniert Mal (1 zu 1 Mal) durch Beibehalten der vorhandenen Objektelemente, falls vorhanden (dies ist das erste Objekt im Array). Dies wird durch das ReDim weiter zunehmen -Anweisung auf 1 bis 2, 1 bis 3, 1 bis 4 und 1 bis 5, indem die früheren Objektwerte innerhalb der For beibehalten werden. . . Nächste Schleife. Die Konserve Das Schlüsselwort stellt sicher, dass die vorhandenen Array-Objekte nicht verloren gehen.
Hinweis: Die Re-Dimension-Anweisung erhöht/verringert die Anzahl der angegebenen Objektelemente, löscht jedoch die vorhandenen Objekte, die zuvor in das Array geladen wurden, ohne Preserve Stichwort.
Das Set -Anweisung in der nächsten Zeile kopiert das tmpA-Objekt mit seinen Daten in die CA(j) ClsArea-Objekt neu erstellt j Array-Element.
Nächste Zeile Set tmpA =Nothing entfernt das temporäre Objekt aus dem Speicher.
Die For…Next-Schleife wiederholt diese Aktion vier weitere Male, um nacheinander weitere Elemente in das neu instanziierte temporäre Objekt tmpA einzugeben, und kopiert das Objekt in das CA-Objektarray.
Die nächsten beiden Zeilen nach der Kommentarzeile finden den Objekt-Array-Indexbereich (findet die niedrigste und höchste Indexnummer.
Das nächste Debug.Print -Anweisung druckt eine Überschriftenzeile in 14-Spalten-Zonen im Debug-Fenster. Das Für . . . Weiter Schleife mit dem L und U gebundene Array-Indexnummernbereiche führt die inneren Anweisungen aus, um auf jedes Objekt aus dem Array CA, zuzugreifen mit Indexnummer in Kontrollvariable j.
Die aktuelle Objektreferenz wird innerhalb von With gesetzt. . . Ende mit Struktur, anstatt den Objektnamen CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth zu wiederholen und CA(j).Bereich um die Ergebnisse der Property Values und Method Area() des Objekts im Debug-Fenster zu drucken.
Entfernen Sie das Kommentarsymbol vom Stopp -Anweisung, um eine Pause im Programm bei der Stop-Anweisung zu erstellen. Führen Sie den Code erneut aus und geben Sie 5 Elementdetails ein, damit Sie mit dem Array-Objekt experimentieren können. Sie können jede der Objekteigenschaften selektiv mit der Array-Indexnummer adressieren, um einen beliebigen Wert im Debug-Fenster zu bearbeiten oder zu drucken, wie unten gezeigt.
Die Anweisung Set CA(j) =Nothing innerhalb des For. . . Next Loop löscht die Array-Objekte einzeln aus dem Speicher.
Klassenobjekt-Array als Funktionsparameter übergeben.
Wir können das Klassenobjekt-Array als Parameter an ein Programm übergeben, wie wir es beim benutzerdefinierten Datentyp getan haben.
Lassen Sie uns eine einfache Druck-Unterroutine erstellen, indem wir den Druckabschnittscode des Hauptprogramms ausschneiden und in das neue Programm einfügen.
Kopieren Sie den ClassArray()-Subroutinencode, fügen Sie ihn in dasselbe Standardmodul ein und ändern Sie den Namen in ClassArray2(), wie unten gezeigt.
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
Der ClassArray2-Code ohne Druckabschnitt.
Erstellen Sie eine neue Unterroutine wie unten angegeben:
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long End Sub
Markieren Sie den Printing-Abschnitt bis zur „Stopp-Anweisung“ im ClassArray2()-Programm, schneiden Sie den hervorgehobenen Bereich des Codes aus und fügen Sie ihn unter dem Dim ein Anweisungen in ClassPrint() Programm. Die modifizierte Version beider Kodizes ist unten angegeben:
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
Das ClassPrint()-Programm.
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
Suchen Sie in beiden Programmen nach Codeänderungen und nehmen Sie gegebenenfalls Korrekturen vor. Klicken Sie in die Mitte des ClassArray2()-Codes und drücken Sie F5, um das Programm auszuführen.
Die Call-Anweisung im ersten Programm übergibt das CA-Klassenobjekt-Array als ByRef-Parameter an die ClassPrint()-Subroutine. Das Programm druckt die Objekteigenschaften und ruft die Funktion Area() auf, um den zu druckenden Wert zu berechnen und zurückzugeben.
Nächste Woche lernen wir, wie wir unser ClsArea-Klassenmodul als Basisklasse verwenden, um ein neues VBA-Klassenobjekt zur Berechnung des Volumens zu erstellen von etwas.
- MS-Access-Klassenmodul und VBA
- MS-Access-VBA-Klassenobjekt-Arrays
- MS-Access-Basisklasse und abgeleitete Objekte
- VBA-Basisklasse und abgeleitete Objekte-2
- Basisklasse und abgeleitete Objektvarianten
- Ms-Access Recordset und Klassenmodul
- Zugriff auf Klassenmodul und Wrapper-Klassen
- Umwandlung der Wrapper-Klassenfunktionalität
- Grundlagen von MS-Access und Erfassungsobjekten
- MS-Access-Klassenmodul und Sammlungsobjekt
- Tabellensätze in Sammlungsobjekt und Formular
- Wörterbuchobjekt-Grundlagen
- Wörterbuchobjekt-Grundlagen-2
- Sortieren von Dictionary-Objektschlüsseln und -Elementen
- Datensätze aus Wörterbuch in Formular anzeigen
- Klassenobjekte als Wörterbucheinträge hinzufügen
- Klassenobjekt-Wörterbuchelement auf Formular aktualisieren