Zoeken…


Opmerkingen

Dit artikel laat zien hoe u een volledige aangepaste klasse in VBA kunt maken. Het gebruikt het voorbeeld van een DateRange object, omdat een begin- en einddatum vaak aan functies worden doorgegeven.

Een eigenschap toevoegen aan een klasse

Een Property is een reeks instructies waarmee een aangepaste eigenschap van een module wordt opgehaald of gewijzigd.

Er zijn drie soorten accessors voor onroerend goed:

  1. Een Get procedure die de waarde van een eigenschap retourneert.
  2. A Let procedure die een (niet- Object ) waarde toekent aan een object.
  3. Een Set procedure kent een Object referentie.

Eigendomstoegangen worden vaak in paren gedefinieerd, waarbij voor elke eigenschap zowel een Get als een Let / Set . Een eigenschap met alleen een Get procedure zou alleen-lezen zijn, terwijl een eigenschap met alleen een Let / Set procedure alleen-schrijven zou zijn.

In het volgende voorbeeld zijn vier eigenschapstoegangen gedefinieerd voor de DateRange klasse:

  1. StartDate ( lezen / schrijven ). Datumwaarde die de eerdere datum in een bereik vertegenwoordigt. Elke procedure gebruikt de waarde van de mStartDate , mStartDate .
  2. EndDate ( lezen / schrijven ). Datumwaarde die de latere datum in een bereik vertegenwoordigt. Elke procedure gebruikt de waarde van de mEndDate , mEndDate .
  3. DaysBetween ( alleen-lezen ). Berekende gehele waarde die het aantal dagen tussen de twee datums vertegenwoordigt. Omdat er alleen een Get procedure is, kan deze eigenschap niet rechtstreeks worden gewijzigd.
  4. RangeToCopy ( alleen-schrijven ). Een Set procedure die wordt gebruikt om de waarden van een bestaand DateRange object te kopiëren.
Private mStartDate As Date                ' Module variable to hold the starting date
Private mEndDate As Date                  ' Module variable to hold the ending date
  
' Return the current value of the starting date
Public Property Get StartDate() As Date
    StartDate = mStartDate
End Property

' Set the starting date value. Note that two methods have the name StartDate
Public Property Let StartDate(ByVal NewValue As Date)
    mStartDate = NewValue
End Property
  
' Same thing, but for the ending date
Public Property Get EndDate() As Date
    EndDate = mEndDate
End Property
  
Public Property Let EndDate(ByVal NewValue As Date)
    mEndDate = NewValue
End Property

' Read-only property that returns the number of days between the two dates
Public Property Get DaysBetween() As Integer
    DaysBetween = DateDiff("d", mStartDate, mEndDate)
End Function

' Write-only property that passes an object reference of a range to clone
Public Property Set RangeToCopy(ByRef ExistingRange As DateRange)

Me.StartDate = ExistingRange.StartDate
Me.EndDate = ExistingRange.EndDate

End Property

Functionaliteit toevoegen aan een klasse

Elke openbare Sub , Function of Property in een klassemodule kan worden opgeroepen door de oproep vooraf te gaan met een objectreferentie:

Object.Procedure

In een DateRange klasse kan een Sub worden gebruikt om een aantal dagen aan de einddatum toe te voegen:

Public Sub AddDays(ByVal NoDays As Integer)
    mEndDate = mEndDate + NoDays
End Sub

Een Function kan de laatste dag van het volgende einde van de maand GetFirstDayOfMonth ( GetFirstDayOfMonth er rekening mee dat GetFirstDayOfMonth niet zichtbaar zou zijn buiten de klasse omdat het privé is):

Public Function GetNextMonthEndDate() As Date
    GetNextMonthEndDate = DateAdd("m", 1, GetFirstDayOfMonth())
End Function

Private Function GetFirstDayOfMonth() As Date
    GetFirstDayOfMonth = DateAdd("d", -DatePart("d", mEndDate), mEndDate)
End Function

Procedures kunnen elk soort argumenten accepteren, inclusief verwijzingen naar objecten van de klasse die wordt gedefinieerd.

In het volgende voorbeeld wordt getest of het huidige DateRange object een begindatum en einddatum heeft met de begin- en einddatum van een ander DateRange object.

Public Function ContainsRange(ByRef TheRange As DateRange) As Boolean
    ContainsRange = TheRange.StartDate >= Me.StartDate And TheRange.EndDate <= Me.EndDate
End Function

Let op het gebruik van de Me notatie als een manier om toegang te krijgen tot de waarde van het object waarop de code wordt uitgevoerd.

Klasse module scope, instancing en hergebruik

Standaard is een nieuwe klassemodule een privéklasse, dus deze is alleen beschikbaar voor instantiatie en gebruik binnen het VBProject waarin deze is gedefinieerd. U kunt de klasse overal in hetzelfde project declareren, instantiëren en gebruiken:

'Class List has Instancing set to Private
'In any other module in the SAME project, you can use:

Dim items As List
Set items = New List

Maar vaak schrijf je klassen die je in andere projecten wilt gebruiken zonder de module tussen projecten te kopiëren. Als u een klasse met de naam List in ProjectA definieert en die klasse in ProjectB wilt gebruiken, moet u 4 acties uitvoeren:

  1. Wijzig de instance-eigenschap van de klasse List in ProjectA in het venster Properties, van Private in PublicNotCreatable

  2. Maak een openbare "fabrieks" -functie in ProjectA die een instantie van een klasse List maakt en retourneert. Doorgaans bevat de fabrieksfunctie argumenten voor de initialisatie van de klasse-instantie. De fabrieksfunctie is vereist omdat de klasse kan worden gebruikt door ProjectB maar ProjectB kan niet rechtstreeks een instantie van de klasse van ProjectA .

     Public Function CreateList(ParamArray values() As Variant) As List
         Dim tempList As List
         Dim itemCounter As Long
         Set tempList = New List
         For itemCounter = LBound(values) to UBound(values) 
             tempList.Add values(itemCounter)
         Next itemCounter
         Set CreateList = tempList
     End Function
    
  3. Voeg in ProjectB een verwijzing naar ProjectA met behulp van het menu Tools..References...

  4. ProjectB in ProjectB een variabele en wijs er een instantie van List met behulp van de fabrieksfunctie van ProjectA

     Dim items As ProjectA.List
     Set items = ProjectA.CreateList("foo","bar")
    
     'Use the items list methods and properties
     items.Add "fizz"
     Debug.Print items.ToString()
     'Destroy the items object
     Set items = Nothing
    


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow