Sök…


Anmärkningar

Den här artikeln visar hur man skapar en komplett anpassad klass i VBA. Den använder exemplet på ett DateRange objekt, eftersom ett start- och slutdatum ofta skickas tillsammans till funktioner.

Lägga till en fastighet i en klass

En Property är en serie uttalanden som hämtar eller modifierar en anpassad egenskap i en modul.

Det finns tre typer av fastighetsförsäljare:

  1. En Get procedur som returnerar värdet på en egenskap.
  2. En Let procedur som tilldelar ett (icke- Object ) värde till ett objekt.
  3. En Set som tilldelar en Object .

Fastighetstillbehör definieras ofta i par med både Get och Let / Set för varje fastighet. En egenskap med endast en Get procedur är skrivskyddad, medan en egenskap med endast en Let / Set procedur är skrivskyddad.

I följande exempel definieras fyra egendomstillträdare för klassen DateRange :

  1. StartDate ( läs / skriv ). Datumvärde som representerar det tidigare datumet i ett intervall. Varje procedur använder värdet på mStartDate , mStartDate .
  2. EndDate ( läs / skriv ). Datumvärde som representerar det senare datumet i ett intervall. Varje procedur använder värdet på mEndDate , mEndDate .
  3. DaysBetween ( skrivskyddad ). Beräknat heltal som representerar antalet dagar mellan de två datumen. Eftersom det bara finns en Get procedur kan den här egenskapen inte ändras direkt.
  4. RangeToCopy ( skrivskyddad ). En Set som används för att kopiera värdena på ett befintligt DateRange objekt.
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

Lägga till funktionalitet i en klass

Alla offentliga Sub , Function eller Property i en klassmodul kan ringas genom att föregå samtalet med en objektreferens:

Object.Procedure

I en DateRange klass kan en Sub användas för att lägga till ett antal dagar till slutdatumet:

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

En Function kan returnera den sista dagen i nästa GetFirstDayOfMonth (observera att GetFirstDayOfMonth skulle vara synligt utanför klassen eftersom det är privat):

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

Procedurer kan acceptera argument av alla slag, inklusive referenser till objekt i klassen som definieras.

Följande exempel testar om det aktuella DateRange objektet har ett startdatum och ett slutdatum som inkluderar start- och slutdatum för ett annat DateRange objekt.

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

Notera användningen av Me notationen som ett sätt att komma åt värdet på det objekt som kör koden.

Klassmodulomfång, instans och återanvändning

Som standard är en ny klassmodul en privat klass, så den är endast tillgänglig för inställning och användning inom VBProjektet där den definieras. Du kan förklara, instansera och använda klassen var som helst i samma projekt:

'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

Men ofta skriver du klasser som du vill använda i andra projekt utan att kopiera modulen mellan projekt. Om du definierar en klass som heter List i ProjectA och vill använda den klassen i ProjectB , måste du utföra fyra åtgärder:

  1. Ändra visa exempel på egendom List klass i ProjectA i fönstret Egenskaper, från Private till PublicNotCreatable

  2. Skapa en offentlig "fabrik" -funktion i ProjectA som skapar och returnerar en instans av en List . Normalt skulle fabriksfunktionen innehålla argument för initialisering av klassinstansen. Fabriksfunktionen krävs eftersom klassen kan användas av ProjectB men ProjectB kan inte direkt skapa en instans av ProjectA klass.

     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. Lägg till en referens till ProjectA ProjectB med hjälp av Tools..References...

  4. ProjectB en variabel i ProjectB och tilldela den en instans av List hjälp av fabriksfunktionen från 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow