VBA
Créer une classe personnalisée
Recherche…
Remarques
Cet article montre comment créer une classe personnalisée complète dans VBA. Il utilise l'exemple d'un objet DateRange , car les dates de début et de fin sont souvent transmises aux fonctions.
Ajout d'une propriété à une classe
Une procédure de Property est une série d'instructions qui récupère ou modifie une propriété personnalisée sur un module.
Il existe trois types d'accesseurs de propriétés:
- Une procédure
Getqui renvoie la valeur d'une propriété. - Une procédure
Letqui affecte une valeur (nonObject) à un objet. - Une procédure
Setqui attribue une référence à unObject.
Les accesseurs de propriétés sont souvent définis par paires, en utilisant à la fois un Get et un Let / Set pour chaque propriété. Une propriété avec uniquement une procédure Get serait en lecture seule, tandis qu'une propriété avec uniquement une procédure Let / Set serait en écriture seule.
Dans l'exemple suivant, quatre accesseurs de propriétés sont définis pour la classe DateRange :
-
StartDate( lecture / écriture ). Valeur de date représentant la date antérieure dans une plage. Chaque procédure utilise la valeur de la variable de module,mStartDate. -
EndDate( lecture / écriture ) Valeur de date représentant la date ultérieure dans une plage. Chaque procédure utilise la valeur de la variable de module,mEndDate. -
DaysBetween( lecture seule ). Valeur entière calculée représentant le nombre de jours entre les deux dates. Comme il n'y a qu'une procédureGet, cette propriété ne peut pas être modifiée directement. -
RangeToCopy(en écriture seule ). Une procédureSetpermet de copier les valeurs d'un objetDateRangeexistant.
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
Ajout de fonctionnalités à une classe
Toute Sub - Function , Function ou Property publique à l'intérieur d'un module de classe peut être appelée en précédant l'appel par une référence d'objet:
Object.Procedure
Dans une classe DateRange , un Sub pourrait être utilisé pour ajouter un nombre de jours à la date de fin:
Public Sub AddDays(ByVal NoDays As Integer)
mEndDate = mEndDate + NoDays
End Sub
Une Function pourrait renvoyer le dernier jour du mois suivant (notez que GetFirstDayOfMonth ne serait pas visible en dehors de la classe car elle est privée):
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
Les procédures peuvent accepter des arguments de tout type, y compris des références à des objets de la classe en cours de définition.
L'exemple suivant teste si l'objet DateRange actuel a une date de début et une date de fin qui incluent la date de début et de fin d'un autre objet DateRange .
Public Function ContainsRange(ByRef TheRange As DateRange) As Boolean
ContainsRange = TheRange.StartDate >= Me.StartDate And TheRange.EndDate <= Me.EndDate
End Function
Notez l'utilisation de la notation Me pour accéder à la valeur de l'objet exécutant le code.
Portée du module de classe, instanciation et réutilisation
Par défaut, un nouveau module de classe est une classe Private, il est donc uniquement disponible pour l'instanciation et l'utilisation dans VBProject dans lequel il est défini. Vous pouvez déclarer, instancier et utiliser la classe n'importe où dans le même projet:
'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
Mais souvent, vous écrirez des classes que vous souhaitez utiliser dans d'autres projets sans copier le module entre les projets. Si vous définissez une classe appelée List in ProjectA et que vous souhaitez utiliser cette classe dans ProjectB , vous devrez effectuer 4 actions:
Modifier la propriété d'instanciation de la classe
ListdansProjectAdans la fenêtre Propriétés, dePrivateàPublicNotCreatableCréez une fonction "factory" publique dans
ProjectAqui crée et renvoie une instance d'une classeList. Généralement, la fonction de fabrique inclurait des arguments pour l'initialisation de l'instance de classe. La fonction factory est requise car la classe peut être utilisée parProjectBmaisProjectBne peut pas créer directement une instance de la classeProjectA.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 FunctionDans
ProjectBajoutez une référence àProjectAutilisant le menuTools..References...Dans
ProjectB, déclarez une variable et assignez-lui une instance deListutilisant la fonction factory deProjectADim 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