Einführung.
Es gibt Zeiten, in denen ein bestimmtes Klassenmodul mehr als einmal instanziiert werden muss, um einen ähnlichen Satz von Werten für eine bestimmte Anwendung zu verwenden.
Beispielsweise ist unser ClsArea-Klassenmodul, das wir für die Berechnung der Teppichfläche von Räumen entwickelt haben, ein Kandidat für ähnliche Anwendungen. Angenommen, wir möchten herausfinden, wie viele Bodenfliesen wir in einem Raum verlegen müssen, dann sollten wir neben den Maßwerten von Floor auch die Längen- und Breitenwerte von Tile eingeben können. Da sowohl Floor als auch Tile ähnliche Eigenschaftswerte als Eingabe haben, können wir zwei Instanzen des ClsArea-Klassenmoduls verwenden, eine Instanz für den FLOOR-Bereich und die zweite Instanz für den TILE-Bereich. Bodenfläche / Fliesenfläche gibt die Gesamtzahl der Fliesen für einen bestimmten Raum an.
Zwei Instanzen desselben Klassenmoduls.
Wir können dies tun, indem wir zwei verschiedene Instanzen des ClsArea-Klassenmoduls im Standardmodulprogramm erstellen, wenn es nur einen Raum gibt.
Public Sub FloorTiles() Dim FLOOR As ClsArea Dim TILES As ClsArea Dim flrArea As Double, tilearea As Double Dim lngTiles As Long Set FLOOR = New ClsArea Set TILES = New ClsArea FLOOR.strDesc = "Bed Room1" FLOOR.dblLength = 25 FLOOR.dblWidth = 15 flrArea = FLOOR.Area() TILES.strDesc = "Off-White" TILES.dblLength = 2.5 TILES.dblWidth = 1.25 tilearea = TILES.Area() lngTiles = flrArea / tilearea Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc Set FLOOR = Nothing Set TILES = Nothing End Sub
Handhabung eines Arrays von Objekten.
Aber was ist, wenn wir die obige Methode für eine Reihe von mehreren Räumen mit unterschiedlichen Fliesengrößen oder -farben anwenden müssen? Die Antwort darauf ist, ein neues Klassenmodul mit zwei Instanzen derselben ClsArea zu erstellen Klasse, eine Instanz für Floor, und die andere für Kacheln Eigenschaften. Beide Instanzen werden in ein neues Klassenmodul eingeschlossen.
Lassen Sie uns das tun.
- Öffnen Sie Ihre Datenbank und zeigen Sie das Codebearbeitungsfenster an (ALT+F11).
- Wählen Sie das Klassenmodul aus von Einfügen Menü.
- Ändern Sie den Namen Eigenschaftswert zu ClsTiles .
- Kopieren Sie den folgenden VBA-Code, fügen Sie ihn in das ClsTiles-Klassenmodul ein und speichern Sie den Code:
Option Compare Database Option Explicit Private pFLOOR As ClsArea Private pTILES As ClsArea Private Sub Class_Initialize() Set pFLOOR = New ClsArea Set pTILES = New ClsArea End Sub Private Sub Class_Terminate() Set pFLOOR = Nothing Set pTILES = Nothing End Sub Public Property Get Floor() As ClsArea Set Floor = pFLOOR End Property Public Property Set Floor(ByRef NewValue As ClsArea) Set pFLOOR = NewValue End Property Public Property Get Tiles() As ClsArea Set Tiles = pTILES End Property Public Property Set Tiles(ByRef NewValue As ClsArea) Set pTILES = NewValue End Property Public Function NoOfTiles() As Long NoOfTiles = pFLOOR.Area() / pTILES.Area() End Function
Beide Instanzen, pFLOOR und pTILES, werden als private Eigenschaften des ClsTiles-Klassenobjekts deklariert.
Die Class_Initialize() Die Subroutine instanziiert beide Objekte im Speicher, wenn die ClsTiles Das Klassenmodul wird im Benutzerprogramm instanziiert.
Die Class_Terminate() Unterroutine entfernt beide Instanzen (pFLOOR und pTILES) aus dem Speicher, wenn die Instanz des ClsTiles-Klassenmoduls im Benutzerprogramm auf Nothing gesetzt ist.
Das Get und Einstellen Eigenschaftsprozeduren ermöglichen das Abrufen und Zuweisen von Werten von bzw. zu der pFLOOR-Instanz im ClsTiles-Klassenobjekt.
Die nächste Get- und Set-Property-Prozedur ermöglicht die gleichen Operationen in der pTILES-Instanz der ClsArea-Klasse.
Wir haben eine neue Funktion NoOfTiles() hinzugefügt im neuen Klassenmodul, um die Anzahl der Fliesen basierend auf der Bodenfläche und der Fliesenabmessung zu berechnen.
Lassen Sie uns ein Programm schreiben und die Verwendung mehrerer Instanzen desselben Klassenobjekts in einem neuen Klassenmodul lernen:ClsTiles.
- Kopieren Sie den folgenden VBA-Code und fügen Sie ihn in ein Standardmodul ein:
Public Sub TilesCalc() Dim FTiles As ClsTiles Dim TotalTiles As Long Set FTiles = New ClsTiles FTiles.Floor.strDesc = "Warehouse" FTiles.Floor.dblLength = 100 FTiles.Floor.dblWidth = 50 FTiles.Tiles.dblLength = 2.5 FTiles.Tiles.dblWidth = 1.75 TotalTiles = FTiles.NoOfTiles() Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles" Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles End Sub
- Lassen Sie das Debug-Fenster geöffnet (STRG+G), um die Testdaten zu drucken.
- Klicken Sie irgendwo in die Mitte des VBA-Codes und drücken Sie F5 Schlüssel zum Ausführen des Codes. Das Ergebnis wird im Debug-Fenster ausgegeben.
Wenn Sie den Fliesenbedarf mehrerer Räume oder Räume mehrerer Stockwerke eines Hochhauses berechnen wollen, dann sollten Sie obiges Programm mehrmals ausführen und die Werte notieren, was praktisch sehr schwierig ist.
Fliesenanforderungen für mehrere Räume finden.
Lassen Sie uns nun ein weiteres Programm schreiben, um die Tile-Anforderungen mehrerer Räume mit einem Array von ClsTiles zu ermitteln Objekte durch Eingabe der Eigenschaftswerte direkt über die Tastatur.
- Kopieren Sie den folgenden VBA-Code und fügen Sie ihn in ein Standardmodul ein.
Public Sub TilesCalc2() Dim tmpFT As ClsTiles Dim FTiles() As ClsTiles Dim j As Long, L As Long, H As Long For j = 1 To 3 Set tmpFT = New ClsTiles 'Floor dimension With tmpFT.Floor .strDesc = InputBox(Str(j) & ") Floor Desc", , 0) .dblLength = InputBox(Str(j) & ") Floor Length", , 0) .dblWidth = InputBox(Str(j) & ") Floor Width", , 0) End With 'Tile Dimension With tmpFT.Tiles .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0) .dblLength = InputBox(Str(j) & ") Tile Length", , 0) .dblWidth = InputBox(Str(j) & ") Tile Width", , 0) End With ReDim Preserve FTiles(1 To j) As ClsTiles Set FTiles(j) = tmpFT Set tmpFT = Nothing Next 'Take Printout L = LBound(FTiles) H = UBound(FTiles) Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles" For j = L To H With FTiles(j) Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles End With Next 'Remove all objects from memory For j = L To H Set FTiles(j) = Nothing Next End Sub
- Lassen Sie das Debug-Fenster geöffnet, um die Ausgabe dort zu drucken.
- Führen Sie den Code wie zuvor aus und geben Sie Werte für Boden- und Fliesenabmessungen für drei Räume ein.
Wie Sie aus dem obigen Code ersehen können, gehen beide Werte der Room- und Tile-Dimensionen nebeneinander in dieselbe Class Object Array-Instanz.
Das obige Programm ist eine Demo, die nur für drei Wertesätze innerhalb von For ausgeführt wird. . . Nächste Schleife. Es kann mit einer bedingten Schleife modifiziert werden, die so oft ausgeführt wird, bis ein bedingter Unterbrechungscode das Programm beendet.
Das Programm kann modifiziert werden, um jeden Satz von Datenwerten und Berechnungsergebnissen in einer Tabelle zur späteren Bezugnahme zu speichern.
Eine Wrapper-Klasse ist ein Container Klasse für Instanzen anderer Klassen, Datenstrukturen oder Instanzsammlungen anderer Objekte. Hier haben wir es verwendet, um zwei Instanzen derselben Klasse Object.
zu speichernListe aller Links zu diesem Thema.
- 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
- Klassenobjekte als Wörterbucheinträge hinzufügen
- Klassenobjekt-Wörterbuchelement auf Formular aktualisieren