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
Get
qui renvoie la valeur d'une propriété. - Une procédure
Let
qui affecte une valeur (nonObject
) à un objet. - Une procédure
Set
qui 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édureSet
permet de copier les valeurs d'un objetDateRange
existant.
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
List
dansProjectA
dans la fenêtre Propriétés, dePrivate
àPublicNotCreatable
Créez une fonction "factory" publique dans
ProjectA
qui 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 parProjectB
maisProjectB
ne 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 Function
Dans
ProjectB
ajoutez une référence àProjectA
utilisant le menuTools..References...
Dans
ProjectB
, déclarez une variable et assignez-lui une instance deList
utilisant la fonction factory deProjectA
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