Access
 sql >> Datenbank >  >> RDS >> Access

MS-Access-VBA-Klassenobjekt-Arrays

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.

  1. MS-Access-Klassenmodul und VBA
  2. MS-Access-VBA-Klassenobjekt-Arrays
  3. MS-Access-Basisklasse und abgeleitete Objekte
  4. VBA-Basisklasse und abgeleitete Objekte-2
  5. Basisklasse und abgeleitete Objektvarianten
  6. Ms-Access Recordset und Klassenmodul
  7. Zugriff auf Klassenmodul und Wrapper-Klassen
  8. Umwandlung der Wrapper-Klassenfunktionalität
  9. Grundlagen von MS-Access und Erfassungsobjekten
  10. MS-Access-Klassenmodul und Sammlungsobjekt
  11. Tabellensätze in Sammlungsobjekt und Formular
  12. Wörterbuchobjekt-Grundlagen
  13. Wörterbuchobjekt-Grundlagen-2
  14. Sortieren von Dictionary-Objektschlüsseln und -Elementen
  15. Datensätze aus Wörterbuch in Formular anzeigen
  16. Klassenobjekte als Wörterbucheinträge hinzufügen
  17. Klassenobjekt-Wörterbuchelement auf Formular aktualisieren