VBA
Skapa en anpassad klass
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:
- En
Get
procedur som returnerar värdet på en egenskap. - En
Let
procedur som tilldelar ett (icke-Object
) värde till ett objekt. - En
Set
som tilldelar enObject
.
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
:
-
StartDate
( läs / skriv ). Datumvärde som representerar det tidigare datumet i ett intervall. Varje procedur använder värdet påmStartDate
,mStartDate
. -
EndDate
( läs / skriv ). Datumvärde som representerar det senare datumet i ett intervall. Varje procedur använder värdet påmEndDate
,mEndDate
. -
DaysBetween
( skrivskyddad ). Beräknat heltal som representerar antalet dagar mellan de två datumen. Eftersom det bara finns enGet
procedur kan den här egenskapen inte ändras direkt. -
RangeToCopy
( skrivskyddad ). EnSet
som används för att kopiera värdena på ett befintligtDateRange
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:
Ändra visa exempel på egendom
List
klass iProjectA
i fönstret Egenskaper, frånPrivate
tillPublicNotCreatable
Skapa en offentlig "fabrik" -funktion i
ProjectA
som skapar och returnerar en instans av enList
. Normalt skulle fabriksfunktionen innehålla argument för initialisering av klassinstansen. Fabriksfunktionen krävs eftersom klassen kan användas avProjectB
menProjectB
kan inte direkt skapa en instans avProjectA
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
Lägg till en referens till
ProjectA
ProjectB
med hjälp avTools..References...
ProjectB
en variabel iProjectB
och tilldela den en instans avList
hjälp av fabriksfunktionen frånProjectA
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