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

MS-Access-Klassenmodul und VBA

Einführung.

In den letzten Wochen haben wir gelernt, wie man User-Defined Type (UDT) verwendet, indem wir eine komplexe Datenstruktur erstellt haben, und wir kennen die Stärken oder Schwächen von UDT inzwischen mehr oder weniger. Wenn Sie diese Artikel noch nicht gelesen haben, können Sie sie besuchen. Verwenden Sie die folgenden Links:

  • Benutzerdefinierter Datentyp-2
  • Benutzerdefinierter Datentyp-3

In Microsoft Access gibt es zwei Arten von VBA-Modulen.

  1. Standardmodule
  2. Klassenmodule

Wir haben mit Klassenmodulen in Formularen gearbeitet und Berichte von Microsoft Access. Form/Report Class Module-Programme sind meistens ereignisgesteuerte kleine Routinen (Klicks auf Schaltflächen, Before-Update, Form/Report Current Event usw.).

Ernsthaftere Datenverarbeitungsprogramme werden in Standardmodulen geschrieben. Mehrere Programme, die nicht notwendigerweise verwandt sind, können in einem Standardmodul geschrieben werden, um verschiedene Aufgaben zu erledigen.

Klassenmodule sind anders. Sie werden zum Erstellen benutzerdefinierter Objekte verwendet und ein Klassenmodul wird nur für ein Objekt verwendet.

Die Grundlagen des eigenständigen Klassenmoduls.

Lassen Sie uns ein einfaches Klassenmodul von Grund auf neu erstellen und die Grundlagen lernen.

  1. Starten Sie Microsoft Access und öffnen Sie eine Datenbank oder erstellen Sie eine neue. Wenn es sich um eine neue Datenbank handelt, speichern Sie sie am vorhandenen vertrauenswürdigen Speicherort (Ordner) oder fügen Sie den neuen Speicherort zur Liste der vertrauenswürdigen Speicherorte hinzu. Klicken Sie auf die Office-Schaltfläche –> Zugriffsoptionen –> Trust Center –> Trust Center-Einstellungen. Fügen Sie den Datenbankordner zur Liste hinzu und klicken Sie auf OK.
  2. Öffnen Sie das VBA-Bearbeitungsfenster (Alt+F11).
  3. Klicken Sie auf Einfügen Menü und wählen Sie das Klassenmodul aus von der Liste. Ein neues Klassenmodul wird eingefügt.

  • Im linken Bereich gibt es einen Namen Steuerelement mit dem Namen Class1.
  • Ändern Sie den Namen Klasse1 zu ClsArea . Dies ist der Name unseres benutzerdefinierten Objekts.

  • Hinweis: Der Klassenname:ClsArea zum Objektnamen werden. Das heißt, wo immer wir dieses Objekt verwenden, ist es wie eine normale Variablendeklaration:Dim xyz As ClsArea . Wir haben eine ähnliche Anweisung für benutzerdefinierte Datentypdeklarationen geschrieben.

    Als Nächstes fügen wir drei Eigenschaften (Variablen) des Objekts hinzu (für Beschreibung, Länge, und Breite ) oben im Modul unter der Optionsvergleichsdatenbank und Option Explicit Linien. Geben Sie die folgenden Zeilen in das Klassenmodul ein.

    Option Compare Database
    Option Explicit
    
    Public p_Desc as String
    Public p_Length as Double
    Public p_Width as Double
    

    Diese Variablen werden als Eigenschaften des benutzerdefinierten VBA-Klassenobjekts identifiziert. Speichern Sie das Klassenmodul.

    Hinweis: Unser Klassenmodulobjekt und die Codezeilen werden nicht so einfach sein. Es wird Änderungen mit mehreren Codezeilen unterzogen. Seien Sie besser darauf vorbereitet, ihnen Schritt für Schritt zu folgen, ohne den Überblick über jede Phase der Veränderungen zu verlieren. Dies ist eine einfache Flächenberechnungsklasse (Fläche =Länge * Breite ), so einfach. Es wird schrittweise Änderungen unterzogen, damit Sie wissen, warum diese Änderungen erforderlich sind.

    Wir werden ein kleines Programm in einem Standardmodul schreiben, um unser neues Klassenmodul zu testen. Fügen Sie ein Standardmodul aus dem Menü „Einfügen“ ein. Sie können den folgenden Code in das Standardmodul eingeben oder kopieren und einfügen, wobei die vorhandene Zeile im Modul überschrieben wird:

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    oArea.
    
    Set oArea = Nothing
    
    End Function
    

    Das Dim -Anweisung deklariert eine Variable so, wie wir es für eine normale Variable wie Dim Desc als String tun. Aber das ist keine gewöhnliche Variable, wir setzen einen Verweis auf unser Klassenmodulobjekt ClsArea . Da es sich um ein Objekt handelt, reicht eine einfache Dimension-Anweisung allein nicht aus, da sie keinen Speicherplatz zum Speichern von Werten in unserem lokal definierten Objekt oArea zuweist Eigenschaften.

    Das Set -Anweisung in der nächsten Zeile mit New Schlüsselwort erforderlich, um eine Instanz eines Objekts aus ClsArea zu erstellen im Speicher mit dem Objektinstanznamen oArea . Wir können auf diese Weise bei Bedarf mehrere Instanzen desselben Klassenobjekts im Speicher öffnen (wir werden in den kommenden Wochen mehr darüber erfahren), damit wir Werte in seinen Eigenschaften (p_Desc, p_Length, p_Width) speichern können. Das p_ Präfix für die Variablen ist ein Indikator dafür, dass der Gültigkeitsbereich von Variablen privat ist, d.h. die Variablen sind außerhalb des Klassenmoduls nicht sichtbar, wenn die Variable mit dem Schlüsselwort Private deklariert ist, aber jetzt als Public deklariert ist. Der Variablenname kann ein beliebiger gültiger Name sein.

    Hinweis: Wir haben es noch nicht als privat deklariert. Wir sind auf dem Weg zu dieser Veränderung.

    Unmittelbar nach dem Schlüsselwort Set den lokalen Objektnamen (Sie können einen passenden Namen wählen, der Ihnen lieber ist, aber er sollte den normalen Regeln für Variablennamen entsprechen), gefolgt von einem Gleichheitszeichen und dem Schlüsselwort Neu und der Klassenmodulname (ClsArea) um eine Instanz des clsArea-Objekts mit all seinen Eigenschaften (Variablen) im Speicher zu erstellen.

    Es gibt eine Abkürzung für diesen zweizeiligen Code. Aktionen dieser beiden Codezeilen können mit einer Anweisung wie unten gezeigt erreicht werden:

    Dim oArea As ClsArea
    Set oArea = New ClsArea
    
    'the shortcut to the above two statements
    Dim oArea As New ClsArea
    
    

    Wenn Sie die nächste Zeile oArea eingeben gefolgt von einem Punkt (. ) Trennzeichen erscheint die folgende Anzeige, um die Liste der verfügbaren benutzerdefinierten Objekteigenschaften anzuzeigen, aus denen Sie auswählen können.

    Wenn dies nicht der Fall ist, gehen Sie über das Menü "Extras" zum Dialogfeld "Optionen" und setzen Sie auf der Registerkarte "Editor" ein Häkchen bei "Mitglieder automatisch auflisten".

    Vor dem Verlassen der Funktion sollte die letzte Anweisung Set oArea =Nothing sein . Diese Anweisung gibt explizit den von der Instanz des benutzerdefinierten Objekts belegten Speicher frei, sodass mehr Speicher für andere Programme verfügbar ist. Dies ist eine verantwortungsbewusste Aufräumaktion unseres Programms.

    Was auch immer wir mit dem instanziierten benutzerdefinierten Objekt tun, sollte zwischen dem ersten und letzten Set codiert werden Aussagen.

    Das ClsArea-Klassenobjekt-Testprogramm.

    Der vollständige Klassentest-Programmcode ist unten angegeben:

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    oArea.p_Desc = "Carpet"
    oArea.p_Length = 25
    oArea.p_Width = 15
    
    Debug.Print "Description", "Length", "Width"
    
    Debug.Print oArea.p_Desc, oArea.p_Length, oArea.p_Width
    
    Set oArea = Nothing
    
    End Function
    

    Klicken Sie irgendwo in die Mitte des Codes und drücken Sie F5 um das Programm auszuführen. Die Ausführung des Programms ist unten als Referenz angegeben.

    Description   Length        Width
    Carpet         25            15 

    Öffentlicher|Privater Geltungsbereich von Objekteigenschaften.

    Unser einfaches Klassenmodulobjekt hat einige Nachteile und wir werden sie beheben.

    Der erste ist, dass wir alle Variablen (oder Eigenschaften) mit Public deklariert haben Zielfernrohr. Dadurch sind sie für andere VBA-Programme sichtbar und können ihren Wert direkt ändern. Das zweite Problem ist, dass es alle ungültigen Werte akzeptiert, wie negative oder Nullwerte, was für unser Klassenobjekt nicht geeignet ist. Wir müssen einige Validierungsprüfungen einbauen, bevor wir die Werte in die Variablen übernehmen.

    Das erste Problem können wir leicht lösen, indem wir die Variablendeklarationen von Public auf Private ändern . Wenn wir das tun, sollten wir eine indirekte Methode zum Speichern und Abrufen von Werten aus den privaten Variablen haben. Das ist der Zweck von Get und Let Eigenschaftsverfahren für jede Eigenschaft des Objekts. Lassen Sie uns diese Änderungen im Klassenmodul vornehmen.

    Öffnen Sie das Klassenmodul ClsArea. Ändern Sie für alle drei Variablen das Wort Öffentlich in Privat.

    Property-Prozeduren erstellen

    Wählen Sie Verfahren aus von Einfügen Geben Sie im Menü strDesc ein im Namen Textsteuerelement, wählen Sie Eigenschaft im Typ Optionsgruppe und Öffentlich im Geltungsbereich Optionsgruppe. Klicken Sie auf OK, um die Eigenschaftenprozeduren für Private p_Desc einzufügen Variable (Eigenschaft).

    Option Compare Database
    Option Explicit
    
    Private p_Desc As String
    Private p_Length As Double
    Private p_Width As Double
    
    Public Property Get strDesc() As String
      strDesc = p_Desc 'return the value from p_Desc
    End Property
    
    Public Property Let strDesc(ByVal strNewValue As String)
      p_Desc = strNewValue ‘store the value into p_Desc
    End Property
    

    Sowohl das Get Verfahren und Let Verfahren werden als Öffentlich deklariert . Beide Prozedurnamen sind gleich strDesc. Standardmäßig wird zurückgegeben Datentyp ist Variante im Holen Prozedur und der Datentyp Parameter wird ebenfalls als Variant in das Let eingefügt Verfahren. Diese können wir nach Bedarf in bestimmte Typen ändern, was wir auch getan und in String geändert haben Typ. Die ersten drei Buchstaben str in strDesc gibt dem Benutzer einen Hinweis, dass die Eigenschaft einen Wert vom Datentyp String erwartet. Ändern Sie das Let Eigenschaftenprozedur Parameter Variablenname vNeuerWert zu strNewValue

    Wenn wir die Property Procedure einfügen, werden sie immer mit Get eingefügt und Let Prozedurpaare für eine Variable.

    Schauen Sie sich nun den Ausdruck genau an, den wir in Get geschrieben haben Verfahren. Die linke Seite von = Signieren Sie den Namen der Get-Prozedur strDesc fungiert als Variable, um den aus der privaten Variablen p_Desc kopierten Wert zurückzugeben an das aufrufende Programm.

    Das Let Prozedur strDesc akzeptiert String-Wert in der Parameter-Variablen strNewValue . Der Eingabewert wird in unsere private Variable p_Desc. übertragen

    Zu beachten ist hier, dass es keinen direkten Zugriff auf unsere private Variable p_Desc nach außen gibt. Transport von Werten Von/Nach die Variable (Eigenschaft) p_Desc wird immer durch Get/Let geleitet Nur Eigentumsverfahren und vorbehaltlich Validierungsprüfungen (noch nicht implementiert), Wir werden später Validierungsprüfungen für die Eingabe von Werten (Let-Prozedur) in die Eigenschaft einführen.

    Das Holen/Lassen Prozeduren werden automatisch ausgeführt, je nachdem, was wir mit der Object-Eigenschaft in einem Ausdruck in VBA-Programmen tun.

    Das Get Die Prozedur wird ausgeführt, wenn wir den Eigenschaftsnamen in einem Ausdruck auf folgende Weise verwenden:

    ‘ Reads the value from p_Desc to Print
    
    Debug.Print oArea.strDesc
    
    OR
    
    ‘ Reads the value from p_Desc and assigns it to the variable X
    
    X = oArea.strDesc
    
    

    Das Let Die Eigenschaftsprozedur wird ausgeführt, wenn wir versuchen, dem Eigenschaftsnamen einen Wert zuzuweisen. Überprüfen Sie den Beispielausdruck in unserem Testprogramm unten:

    oArea.strDesc = “Carpet”
    
    

    In früheren BASIC Language-Büchern können Sie die Verwendung des Schlüsselworts LET.

    sehen
    LET X = 25 ‘ LET is optional
    
    

    Da es optional war, funktioniert die Anweisung ohne es und verwendet es überhaupt nicht mehr.

    Hier, falls Sie nur lesen einen Wert aus einer Variablen und nichts direkt darin zu speichern, dann können Sie die Let-Prozedur weglassen und nur Get verwenden Verfahren.

    Diese Regel gilt auch für das Let-Verfahren. Sie dürfen nur das Let verwenden Vorgehensweise, wenn Sie zuordnen einen Wert in eine private Variable, aber nichts aus derselben Variablen zurücklesen, dann lassen Sie die Get-Prozedur weg.

    Das Get und Let Prozeduren werden nacheinander ausgeführt, wenn unser Ausdruck etwa wie folgt aussieht:

    oArea.strDesc = oArea.strDesc & “ – King Size.”
    
    

    Im obigen Ausdruck werden wir Get der vorhandene Wert aus der privaten Variablen p_Desc und ändern Sie die Beschreibung und speichern Sie sie wieder in derselben Variablen. Kurz gesagt in einem Ausdruck wenn Sie den Eigenschaftsnamen rechts vom Gleichheitszeichen verwenden (= ) das Get Prozedur wird aufgerufen und Let Die Prozedur wird ausgeführt, wenn der Name der Objekteigenschaftsprozedur links vom Gleichheitszeichen (=) erscheint ) Zeichen.

    Fügen Sie zwei Sätze von Eigenschaftsprozeduren für die Variablen p_Length ein und p_Width. Wenn Sie die Prozedurnamen im Namen angeben Geben Sie dem Steuerelement den Namen dblLength und dblWidth um dem Benutzer einen Hinweis zu geben, dass diese Eigenschaften Zahlen mit doppelter Genauigkeit als Eingabe erwarten.

    ClsArea-Klassenobjekt mit seinen Eigenschaftsprozeduren.

    Der bisher fertig gestellte Code mit den Property-Prozeduren dblLength und dblWidth ist unten als Referenz und zur Aktualisierung Ihres Codes angegeben.

    Option Compare Database
    Option Explicit
    
    Private p_Desc As String
    Private p_Length As Double
    Private p_Width As Double
    
    Public Property Get strDesc() As String
      strDesc = p_Desc 'copy the value from p_Desc
    End Property
    
    Public Property Let strDesc(ByVal strNewValue As String)
      p_Desc = strNewValue
    End Property
    
    Public Property Get dblLength() As Double
      dblLength = p_Length
    End Property
    
    Public Property Let dblLength(ByVal dblNewValue As Double)
      p_Length = dblNewValue
    End Property
    
    Public Property Get dblWidth() As Double
      dblWidth = p_Width
    End Property
    
    Public Property Let dblWidth(ByVal dblNewValue As Double)
      p_Width = dblNewValue
    End Property
    

    Das Testprogramm mit Änderungen.

    Wenn Sie den obigen Code vollständig ausgefüllt haben, lassen Sie uns Änderungen an unserem Testprogramm vornehmen, um die hier vorgenommenen Änderungen widerzuspiegeln. Der geänderte Beispielcode ist unten angegeben.

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    ‘Property Let procedures called here
    
    oArea.strDesc = "Carpet"
    oArea.dblLength = 25
    oArea.dblWidth = 15
    
    Debug.Print "Description", "Length", "Width"
    
    ‘Property Get Procedures called here to print
    Debug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidth
    
    Set oArea = Nothing
    
    End Function
    
    

    Wenn Sie unmittelbar nach dem Objektnamen oArea (oArea.) einen Punkt (.) eingeben, wird die Liste der Eigenschaftsprozedurnamen von VBA IntelliSense angezeigt, und Sie können den erforderlichen Namen aus der Liste auswählen, ohne ihn manuell einzugeben.

    Der Zweck dieses Klassenobjekts besteht darin, die Fläche von etwas zu berechnen, z. B. die Fläche eines Raums, Teppichs, Bodenfliesen oder eines anderen Materials, das Werte für Länge und Breite hat. Das bedeutet, dass wir eine öffentliche Funktion benötigen, um die Fläche der in das Klassenobjekt eingegebenen Längen-, Breiten- und Beschreibungswerte eines Elements zu berechnen.

    ClsArea-Objektmethode:Area()

    Hier ist der Code für die öffentliche Funktion:

    Public Function Area() As Double
       Area = Me.dblLength * Me.dblWidth
    End Function
    

    Sie können diese Funktion über Einfügen einfügen Menü durch Eingabe von Bereich im Namen Steuerung, Funktion auswählen aus dem Typ Optionsgruppe und Öffentlich als Geltungsbereich in das ClsArea-Klassenmodul. Schließen Sie die Funktion ab, indem Sie die Zeile in der Mitte eingeben.

    Wir können die Variablen p_Length und p_Width direkt ansprechen (weil die Funktion Area() ist Teil des Klassenmoduls) im Ausdruck zur Berechnung der Fläche. Aber wir gehen den richtigen Weg und rufen die Get-Prozeduren dblLength und dblWidth zur Berechnung auf. Vielleicht ist Ihnen der Verweis Ich. aufgefallen Wird verwendet, um die dblLength-, dblWidth-Get-Prozeduren zu qualifizieren, wie wir sie früher in Form/Report-Klassenmodulen geschrieben haben, um auf das aktuelle Objekt im Speicher und seine Eigenschaften zu verweisen. Wie ich bereits erwähnt habe, können in unserem benutzerdefinierten Klassenobjekt mehrere Objektinstanzen gleichzeitig im Speicher geöffnet sein und Me Schlüsselwort bezieht sich auf die aktuelle Instanz, zu der die Funktion Area() gehört.

    Die Testfunktion mit Modifikation.

    Modifizieren Sie unsere Testfunktion ClassTest1(), um die Ausgabe der Funktion Area() wie folgt zu integrieren:

    Option Compare Database
    Option Explicit
    
    Public Function ClassTest1()
    Dim oArea As ClsArea
    
    Set oArea = New ClsArea
    
    oArea.strDesc = "Carpet"
    oArea.dblLength = 25
    oArea.dblWidth = 15
    
    Debug.Print "Description", "Length", "Width", "Area"
    Debug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidth, oArea.Area
    
    Set oArea = Nothing
    
    End Function
    

    Die Änderung betrifft nur die Debug.Print-Anweisungen. Führen Sie den Code aus und prüfen Sie das Ergebnis im Debug-Fenster.

    In den benutzerdefinierten Klassenmodulen sind zwei Ereignisprozeduren erforderlich:Class_Initialize() und Class_Terminate() .

    Automatisch ausführende Methoden.

    Die Class_Initialize() Programm wird automatisch ausgeführt, wenn wir ein Objekt mit New instanziieren Stichwort. Dieses Programm kann verwendet werden, um Standardwerte in Variablen zu setzen oder andere Objekte im Speicher zu instanziieren. Ein Klassenobjekt kann andere Klassen als untergeordnete Objekte verwenden und muss instanziiert werden. Diesen Aspekt werden wir weiter untersuchen und später lernen, wie es geht.

    Die Class_Terminate() Programm wird ausgeführt, wenn wir versuchen, das Objekt aus dem Speicher zu löschen, wenn Nothing Schlüsselwort wird in der Anweisung Set oArea =Nothing ausgeführt . Wenn das Programm endet, das das Klassenobjekt verwendet, wird die Instanz des Objekts im Arbeitsspeicher standardmäßig entfernt. Aber es ist eine gute Programmierpraxis, dass wir Set oArea =Nothing verwenden -Anweisung als letzte ausführbare Anweisung in unseren Programmen, um das Objekt aus dem Speicher zu löschen.

    Wir werden die oben genannten Programme in unser Klassenmodul aufnehmen. Fügen Sie den folgenden Code am Ende Ihres Klassenmoduls hinzu:

    Private Sub Class_Initialize()
       p_Length = 0
       p_Width = 0
    
       'MsgBox "Initialize.", vbInformation, "Class_Initialize()"
    End Sub
    
    Private Sub Class_Terminate()
       'MsgBox "Terminate.", vbInformation, "Class_Terminate()"
    End Sub
    
    

    Wenn Sie diese beiden Unterroutinen testen möchten, entfernen Sie das Kommentarsymbol und aktivieren Sie die MsgBox. Führen Sie Ihr Testprogramm noch einmal aus. Sie finden die Initialisieren Meldung erscheint am Anfang (Klicken Sie auf OK um fortzufahren) und die Beenden Meldung erscheint am Ende des Testprogramms.

    Ich weiß, was Sie jetzt denken, wie „so viel Code, um zwei Variablen miteinander zu multiplizieren“. In dieser Hinsicht ist es wahr, aber es ist sehr wahrscheinlich, dass wir jedes Mal wiederholt Code für ähnliche Problemlösungsprobleme geschrieben und Code für Validierungsprüfungen und andere Schutzmaßnahmen gegen logische Fehler dupliziert haben.

    Hier schreiben wir kein gewöhnliches Programm, sondern entwickeln ein benutzerdefiniertes Objekt, das viele Male verwendet oder Teil anderer Objekte sein kann, wo immer wir es brauchen, ohne uns Gedanken darüber zu machen, wie es aus Sicht des Benutzers funktioniert. Microsoft Access verfügt über viele integrierte Objekte/Funktionen, die wir ständig verwenden, ohne uns Gedanken darüber zu machen, wie es funktioniert, indem wir ihre Eigenschaften oder Parameter festlegen und die Arbeit erledigen.

    Wir müssen uns noch um ein weiteres Problem kümmern, die Validierungsprüfungen für Werte, die in dblNewValue eingegeben werden Parameter im Let Eigenschaftsprozeduren von dblLength() und dblWidth(), um sicherzustellen, dass den Objekteigenschaften p_Length werden gültige Werte zugewiesen und p_Width .

    Eingegebene negative oder Nullwerte gelten als ungültig und wir müssen Vorkehrungen treffen, um sicherzustellen, dass der Benutzer den richtigen Wert eingibt.

    Validierungsprüfungen durchführen.

    Das modifizierte Let Die Segmente des Property Procedure Code sind unten angegeben. Nehmen Sie entsprechende Änderungen in Ihrem Code vor.

    Public Property Let dblLength(ByVal dblNewValue As Double)
       Do While dblNewValue <= 0
          dblNewValue = InputBox("Negative/0 Values Invalid:", "dblLength()", 0)
       Loop
    
       p_Length = dblNewValue
    End Property
    
    
    Public Property Let dblWidth(ByVal dblNewValue As Double)
       Do While dblNewValue <= 0
           dblNewValue = InputBox("Negative/0 Values Invalid:", "dblwidth()", 0)
       Loop
    
       p_Width = dblNewValue
    End Property
    
    

    Die Do While. . . Schleife wird wiederholt ausgeführt, bis ein gültiger Wert (größer als 0) in dblNewValue eingegeben wird durch den Benutzer

    Validierungsprüfungen in der öffentlichen Methode:Area()

    Wir brauchen eine weitere Validierungsprüfung in Area() Funktion. Wenn der Benutzer die Funktion Area() aufruft, ohne vorher gültige Werte für Länge und Breite einzugeben, muss der Benutzer darüber informiert werden. Wir prüfen, ob die Variablen p_Length und p_Width gültige Werte haben, bevor wir den Ausdruck für die Flächenberechnung ausführen. Hier ist der Code:

    Public Function Area() As Double
      If (Me.dblLength > 0) And (Me.dblWidth > 0) Then
            Area = Me.dblLength * Me.dblWidth
      Else
            Area = 0
            MsgBox "Error: Length/Width Value(s) Invalid., Program aborted."
      End If
    End Function
    

    Der vollständige Code des ClsArea-Objekts.

    Der vollständig ausgefüllte Code unseres Klassenmoduls ClsArea ist unten angegeben:

    Option Compare Database
    Option Explicit
    
    Private p_Desc As String
    Private p_Length As Double
    Private p_Width As Double
    
    Public Property Get strDesc() As String
        strDesc = p_Desc 'copy the value from p_Desc
    End Property
    
    Public Property Let strDesc(ByVal strNewValue As String)
        p_Desc = strNewValue
    End Property
    
    Public Property Get dblLength() As Double
       dblLength = p_Length
    End Property
    
    Public Property Let dblLength(ByVal dblNewValue As Double)
        Do While dblNewValue <= 0
           dblNewValue = InputBox("Negative/0 Values Invalid:", "dblLength()", 0)
        Loop
    
        p_Length = dblNewValue
    End Property
    
    Public Property Get dblWidth() As Double
       dblWidth = p_Width
    End Property
    
    Public Property Let dblWidth(ByVal dblNewValue As Double)
        Do While dblNewValue <= 0
           dblNewValue = InputBox("Negative/0 Values Invalid:", "dblwidth()", 0)
        Loop
    
        p_Width = dblNewValue
    End Property
    
    Public Function Area() As Double
    
       If (Me.dblLength > 0) And (Me.dblWidth > 0) Then
           Area = Me.dblLength * Me.dblWidth
       Else
           Area = 0
           MsgBox "Error: Length/Width Value(s) Invalid., Program aborted."
       End If
    
    End Function
    
    Private Sub Class_Initialize()
       p_Length = 0
       p_Width = 0
     'MsgBox "Initialize.", vbInformation, "Class_Initialize()"
    End Sub
    
    Private Sub Class_Terminate()
       'MsgBox "Terminate.", vbInformation, "Class_Terminate()"
    End Sub
    

    Property-Prozeduren und -Methoden testen.

    Sie können unser benutzerdefiniertes Klassenobjekt testen, indem Sie negative oder 0-Werte als Eingabe für die Eigenschaften dblLength, dblWidth eingeben.

    Kommentieren Sie im Testprogramm die Zeilen (oArea.dblLength=25 und oArea.dblWidth=15) aus, um die Funktion Area() zu testen. Es sollte die Fehlermeldung anzeigen, die wir in die Funktion geschrieben haben.

    Unser Flächenberechnungs-Klassenmodul gilt jetzt als vollständig und wir haben es getestet und festgestellt, dass es korrekt funktioniert. Sie können es weiter auf logische Fehler testen, die ich übersehen habe. Wenn Sie auf etwas stoßen, mit dem ich nicht gerechnet habe, teilen Sie es mir bitte mit.

    Zukunftsplan für Tests.

    Wir haben das Klassenobjekt nur für ein Element getestet. Wir müssen die Fläche mehrerer Gegenstände berechnen (z. B. die Fläche von 5 Schlafzimmern oder 10 unterschiedlich großen Teppichen usw. Uns wird gesagt, dass wir ein einmal entwickeltes Objekt mehrmals im Speicher instanziieren können, indem wir einen anderen Satz von Werten zuweisen in jede Instanz des Objekts und kann damit arbeiten.

    Abgesehen davon kann dieses Objekt als Teil anderer Objekte verwendet werden, die wir mit weniger Code entwickeln, da ein Teil unseres neuen Klassenobjekts bereits im ClsArea-Klassenmodul entwickelt wurde.

    Nächste Woche lernen wir, wie man ein Array aus benutzerdefinierten Objekten erstellt, um die Fläche mehrerer Elemente zu berechnen.

    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