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:

  1. Une procédure Get qui renvoie la valeur d'une propriété.
  2. Une procédure Let qui affecte une valeur (non Object ) à un objet.
  3. Une procédure Set qui attribue une référence à un Object .

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 :

  1. 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 .
  2. 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 .
  3. 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édure Get , cette propriété ne peut pas être modifiée directement.
  4. RangeToCopy (en écriture seule ). Une procédure Set permet de copier les valeurs d'un objet DateRange 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:

  1. Modifier la propriété d'instanciation de la classe List dans ProjectA dans la fenêtre Propriétés, de Private à PublicNotCreatable

  2. Créez une fonction "factory" publique dans ProjectA qui crée et renvoie une instance d'une classe List . 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 par ProjectB mais ProjectB ne peut pas créer directement une instance de la classe 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. Dans ProjectB ajoutez une référence à ProjectA utilisant le menu Tools..References...

  4. Dans ProjectB , déclarez une variable et assignez-lui une instance de List utilisant la fonction factory de 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow