Inleiding.
Vorige week hadden we een korte introductie van een eenvoudig Aangepast klassenobject met slechts twee eigenschappen, voor Lengte en Breedte Waarden. Een methode voor het berekenen van oppervlakte van alles, met lengte- en breedtewaarden. Ik hoop dat je de basis van een Ms-Access Custom Class-module hebt begrepen. Zo niet, dan is hier de link:Ms-Access Class Module en VBA. Bezoek de pagina voordat u verdergaat.
Class Module Objects bespaart veel code in uw programma's. Als je iets hebt gevonden dat je herhaaldelijk in Code doet, denk dan aan een Class Module Object. De herhalende code kan ook worden omgezet in een hulpprogramma-functie, maar voor Class Objects moet u een andere benadering kiezen.
Voor een eenvoudige taak kan er meer code nodig zijn om de functies van het Class Module Object te verfijnen, maar uw hoofdmoduleprogramma's zullen eenvoudig zijn en alle ingewikkelde code die is ontwikkeld en verfijnd, blijft voor anderen verborgen.
Maar voor nu hebben we een eenvoudige klassenmodule in de hand. We zullen proberen een reeks objecten te maken om de oppervlakte van veel items te berekenen.
De ClassArray()-subroutine.
De voorbeeld-VBA-code in de standaardmodule creëert een array van vijf objecten van de ClsArea-klasse en drukt hun eigenschapswaarden en methoderesultaat af in het foutopsporingsvenster. Kopieer en plak (of beter als je ze typt, om elke regel beter te weten wat ze doen) de volgende code in een standaardmodule:
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
Klik ergens in het midden van de code en druk op F5 om de code uit te voeren. Voer de waarden voor Beschrijving, Lengte en Breedte van het toetsenbord in voor 5 verschillende items, de een na de ander.
Voorbeeld van het programma wordt hieronder gegeven:
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
Review van code regel voor regel.
Laten we de code regel voor regel bekijken. In het declaratiegebied hebben we een objectvariabele tmpA . gedeclareerd van het ClsArea-type. In de tweede regel een lege array gedeclareerd CA() van het ClsArea-type. Het benodigde aantal elementen wordt later in het programma opnieuw gedimensioneerd.
In de volgende twee regels hebben we variabelen title . gedeclareerd van het type String en j, L, en U variabelen van het type Long Integer.
Vervolgens wordt de titelvariabele geïnitialiseerd met de tekenreeks 'ClassArray' en wordt deze gebruikt als een titel in de InputBox()-functie. De Voor….Volgende lus wordt ingesteld met een regelvariabele j om de lus vijf keer uit te voeren. Na de volgende twee commentaarregels, de Set verklaring instantieert (wijst geheugen toe) ClsArea Class Object in geheugen met de naam tmpA .
De volgende drie regels code dienen om waarden in te voeren voor strDesc , dblLength, en dblWidth Eigenschappen van tmpA Class Object.
Na de volgende regel met commentaar wordt het ClsArea Class Object (CA) opnieuw gedimensioneerd voor 1 tot j keer (1 tot 1 keer) door de bestaande objectelementen te behouden, indien aanwezig (dit is het eerste object in de array). Dit zal blijven toenemen, via de ReDim statement, tot 1 tot 2, 1 tot 3, 1 tot 4 en 1 tot 5 door de eerdere objectwaarden te behouden, binnen de For . . . Volgende lus. Het Behoud trefwoord zorgt ervoor dat de bestaande array-objecten niet verloren gaan.
Opmerking: De Re-Dimension-instructie verhoogt/verlaagt het aantal opgegeven objectelementen, maar wist de bestaande objecten die eerder in de array zijn geladen, zonder de Preserve trefwoord.
De Set statement in de volgende regel kopieert het tmpA-object, met zijn gegevens naar de CA(j) ClsArea Object nieuw gemaakt j array-element.
Volgende regel Set tmpA =Nothing verwijdert het tijdelijke object uit het geheugen.
De For...Next-lus herhaalt deze actie nog vier keer om andere items een voor een in het nieuw geïnstantieerde tijdelijke object tmpA in te voeren, en kopieert het object naar de CA Object Array.
De volgende twee regels, na de commentaarregel, vinden het indexbereik van Object Array (vindt de laagste en hoogste indexnummers.
De volgende Debug.Print statement drukt een kopregel af in 14 kolomzones in het foutopsporingsvenster. De Voor . . . Volgende lus met de L en U gebonden array-indexnummerbereiken voert de innerlijke instructies uit om toegang te krijgen tot elk object vanuit Array CA, met indexnummer in controlevariabele j.
De huidige objectreferentie wordt ingesteld binnen With. . . Eindig met structuur, in plaats van de objectnaam te herhalen CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth en CA(j).Area om de Property Values en Method Area()-resultaten van het object in het Debug-venster af te drukken.
Verwijder het commentaarsymbool uit de ‘Stop instructie om een pauze in het programma te maken op de stop-instructie. Voer de code opnieuw uit en voer 5 itemdetails in zodat u kunt experimenteren met het array-object. U kunt elk objecteigenschap selectief adresseren, met het array-indexnummer, om elke waarde in het foutopsporingsvenster te bewerken of af te drukken, zoals hieronder weergegeven.
Het statement Set CA(j) =Nothing binnen de Voor. . . Next Loop wist de array-objecten een voor een uit het geheugen.
Klasobjectarray doorgeven als functieparameter.
We kunnen de Class Object Array als parameter doorgeven aan een programma, zoals we deden met User-Defined Data Type.
Laten we een eenvoudige afdruksubroutine maken door de afdruksectiecode van het hoofdprogramma te knippen en in het nieuwe programma te plaatsen.
Kopieer de ClassArray()-subroutinecode, plak deze in dezelfde standaardmodule en verander de naam als ClassArray2(), zoals hieronder weergegeven.
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
De ClassArray2-code zonder afdruksectie.
Maak een nieuwe subroutine zoals hieronder aangegeven:
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long End Sub
Markeer de sectie Afdrukken tot aan de 'Stop-instructie in het ClassArray2()-programma, knip het gemarkeerde gedeelte van de code uit en plak het onder de Dim uitspraken in de ClassPrint() Programma. De gewijzigde versie van beide codes wordt hieronder gegeven:
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
Het ClassPrint()-programma.
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
Controleer op codewijzigingen in beide programma's en voer correcties uit, waar van toepassing. Klik in het midden van de ClassArray2()-code en druk op F5 om het programma uit te voeren.
De Call-instructie in het eerste programma geeft de CA Class Object Array als ByRef-parameter door aan de ClassPrint()-subroutine. Het programma drukt de Objecteigenschappen af en roept de functie Area() aan om de waarde te berekenen en terug te sturen om af te drukken.
Volgende week leren we hoe we onze ClsArea Class-module als basisklasse kunnen gebruiken om een nieuw VBA-klasseobject te maken om het Volume te berekenen. van iets.
- 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
- Woordenboekobjectsleutels en -items sorteren
- Records van woordenboek naar formulier weergeven
- Klasobjecten toevoegen als woordenboekitems
- Klasobjectwoordenboekitem op formulier bijwerken