Inleiding.
Soms moet een bepaalde klassenmodule meer dan één keer worden geïnstantieerd om een vergelijkbare set waarden voor een bepaalde toepassing te gebruiken.
Onze ClsArea Class Module, die we hebben ontworpen voor het berekenen van het tapijtoppervlak van kamers, is bijvoorbeeld een kandidaat voor vergelijkbare toepassingen. Stel dat we willen weten hoeveel vloertegels we in een kamer moeten leggen, dan zouden we naast de dimensiewaarden van Vloer ook de lengte- en breedtewaarden van Tegel moeten kunnen invoeren. Aangezien zowel Floor als Tile vergelijkbare eigenschapswaarden hebben als invoer, kunnen we twee instanties van ClsArea Class Module gebruiken, één instantie voor het FLOOR-gebied en het tweede exemplaar voor het TILE-gebied. Vloeroppervlak / Tegeloppervlak geeft het totale aantal tegels voor een bepaalde kamer.
Twee instanties van dezelfde klasmodule.
We kunnen dit doen door twee verschillende instanties van de ClsArea Class Module in het Standard Module Program te maken als er maar één Room is.
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
Omgaan met een reeks objecten.
Maar wat als we de bovenstaande methode moeten toepassen op een reeks van verschillende kamers met verschillende maten of kleuren tegels? Het antwoord daarop is om een nieuwe klasmodule te maken met twee instanties van hetzelfde ClsArea Klasse, één instantie voor Floor, en de andere voor Tegels Eigenschappen. Beide instanties zijn verpakt in een nieuwe Class Module.
Laten we dat doen.
- Open uw database en open het codebewerkingsvenster (ALT+F11).
- Selecteer de Klasmodule van Invoegen Menu.
- Wijzig de Naam Eigenschapswaarde naar ClsTiles .
- Kopieer en plak de volgende VBA-code in de ClsTiles Class-module en sla de code op:
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 instanties, pFLOOR en pTILES worden gedeclareerd als Private Properties van ClsTiles Class Object.
De Class_Initialize() Subroutine start beide objecten in het geheugen wanneer de ClsTiles Class Module wordt geïnstantieerd in het gebruikersprogramma.
De Class_Terminate() subroutine verwijdert beide instanties (pFLOOR en pTILES) uit het geheugen wanneer de instantie van de ClsTiles Class Module is ingesteld op Niets in het gebruikersprogramma.
De Krijg en Instellen Met eigenschappenprocedures kunnen waarden worden opgehaald en toegewezen, respectievelijk van en naar de pFLOOR-instantie in het ClsTiles-klasse-object.
De volgende procedure voor het ophalen en instellen van eigenschappen staat dezelfde bewerkingen toe in de pTILES-instantie van de ClsArea-klasse.
We hebben een nieuwe functie toegevoegd NoOfTiles() in de nieuwe klassenmodule, om het aantal tegels te berekenen, gebaseerd op het vloeroppervlak en de tegeldimensie.
Laten we een programma schrijven en het gebruik van meerdere instanties van hetzelfde klasseobject leren, in een nieuwe klassemodule:ClsTiles.
- Kopieer en plak de volgende VBA-code in een standaardmodule:
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
- Houd het foutopsporingsvenster open (CTRL+G) om de testgegevens af te drukken.
- Klik ergens in het midden van de VBA-code en druk op F5 Sleutel om de code uit te voeren. Het resultaat wordt afgedrukt op het Debug-venster.
Als u de tegelbehoefte van meerdere kamers of kamers van meerdere verdiepingen van een hoogbouw wilt berekenen, moet u het bovenstaande programma dat een aantal keren uitvoeren en de waarden noteren, wat praktisch erg moeilijk is.
Tegelvereiste voor meerdere kamers zoeken.
Laten we nu een ander programma schrijven om de tegelvereisten van verschillende kamers te vinden, met een array van ClsTiles Objecten door de eigenschapswaarden rechtstreeks vanaf het toetsenbord in te voeren.
- Kopieer en plak de volgende VBA-code in een standaardmodule.
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
- Houd het foutopsporingsvenster open om de uitvoer daar af te drukken.
- Voer de code uit zoals eerder en voer waarden in voor vloer- en tegeldimensies voor drie kamers.
Zoals u in de bovenstaande code kunt zien, gaan beide waarden van de dimensies Room en Tile naast elkaar in dezelfde Class Object Array-instantie.
Het bovenstaande programma is een demo die alleen draait voor drie sets waarden binnen de For. . . Volgende lus. Het kan worden gewijzigd met een voorwaardelijke lus die een vereist aantal keren wordt uitgevoerd totdat een voorwaardelijke onderbrekingscode het programma beëindigt.
Het programma kan worden aangepast om elke set gegevenswaarden en berekeningsresultaten op te slaan in een tabel voor toekomstig gebruik.
Een Inpakklas is een Container Klasse voor instanties van andere klassen, gegevensstructuren of instantiesverzameling van andere objecten. Hier hebben we het gebruikt om twee instanties van hetzelfde klasse Object te bewaren.
Lijst met alle links over dit onderwerp.
- MS-Access Class-module en VBA
- MS-Access VBA Class Object Arrays
- MS-Access-basisklasse en afgeleide objecten
- VBA-basisklasse en afgeleide objecten-2
- Basisklasse en afgeleide objectvarianten
- Ms-Access Recordset en Class Module
- Toegang tot klassenmodule en wrapperklassen
- Transformatie van functionaliteit van wrapperklasse
- Basisprincipes voor MS-Access en verzamelingsobjecten
- Ms-Access Class-module en verzamelobject
- Tabelrecords in verzamelobject en formulier
- Basisprincipes van woordenboekobjecten
- Basisprincipes van woordenboekobjecten-2
- Woordenboek-objectsleutels en items sorteren
- Records van woordenboek naar formulier weergeven
- Klasobjecten toevoegen als woordenboekitems
- Klasobjecten toevoegen als woordenboekitems
- Klasobject woordenboekitem op formulier bijwerken