Apprendre Excel avec le sourire. Leçon 1 : Les modules de classe

Par Laurent Longre, le 17/11/2000

Suite aux nombreuses questions à ce sujet sur le forum, un petit topo sur les modules de classe. La vocation première des modules de classe est de définir des modèles d'objets qui n'existent pas dans les bibliothèques existantes.

 

Par exemple, si l'objet Chart n'était pas fourni par la bibliothèque d'objets d'Excel, on pourrait envisager de définir son type dans un module de classe (en fait ce ne serait pas possible parce que les possibilités offertes par les modules de classe sont bien trop pauvres, mais dans l'idéal ça devrait être réalisable).

Un module de classe ne crée aucun objet. Il contient simplement un modèle décrivant comment l'objet doit fonctionner, c'est à dire ses méthodes et ses propriétés.

On peut par exemple créer un module de classe nommé "JeanPaulSabatier".

Celui-ci mettra à disposition de nos macros un type d'objet "JeanPaulSabatier", doté de propriétés et de méthodes que l'on a définies soi-même. On pourra donc créer des instances (des réalisations) de la classe JeanPaulSabatier et manipuler ces objets à notre guise.

L'instanciation d'une classe se fait par le mot-clé New :

Sub Test()

' (On instancie un nouvel objet JPS de classe JeanPaulSabatier)
Dim JPS As New JeanPaulSabatier

' (On modifie quelques propriétés de l'instance JPS)
JPS.Signature = "jean-paul sabatier, du gouleyant beaujolais"
JPS.DateNaissance = Evaluate("DATEREP(" & Date & ",TRUE,TRUE)")
JPS.Adresse = "DX32768"

' (On applique la méthode DonnerDuRonRon à l'objet JPS)
JPS.DonnerDuRonRon CuilleresASoupe:=1.5

' (Et enfin, on supprime notre objet JPS en libérant sa mémoire)
Set JPS = Nothing

End Sub

Quand VBA rencontre une instruction qui modifie une propriété de l'objet JPS ou applique une de ses méthodes, il exécute automatiquement le code correspondant à cette propriété ou à cette méthode dans le module de classe JeanPaulSabatier.

Les modules de classe disposent de 3 types de procédures qui permettent de définir le code associé aux procédures et méthodes d'une classe d'objets.

 

  • Pour les méthodes : procédures Sub
  • Pour lire le contenu de propriétés : procédures Property Get
  • Pour modifier le contenu de propriétés : procédures Property Let (propriétés simples, de type String, Double etc.) et Property Get (propriétés contenant des objets).

Les procédures de lecture de propriété sont couramment appelées "getters" et celles d'écriture "setters".

Par exemple, quand VBA rencontre l'instruction suivante :

JPS.Adresse = "DX32768"

... il exécute automatiquement la procédure 'Property Let Adresse' contenue dans le module de classe JeanPaulSabatier, en lui transmettant "DX32768" comme paramètre. Cette procédure pourrait ressembler à:

 

Dim Cellule As Range Property Let Adresse(NouvelleAdresse As String)
Set Cellule = Range(NouvelleAdresse)
With Cellule
.ClearContents
.Value = Me.Signature
.Font.Name = "WingDings"
.Borders.LineStyle = xlDouble
.Borders.Weight = xlThick
.Flash
.Locked = True
End With
End Property
  

Cette procédure sera exécutée avec "DX32768" comme paramètre NouvelleAdresse. Le simple fait de modifier la propriété Adresse va donc entraîner toute une suite d'actions: mettre la signature de l'objet JPS dans la cellule DX32768, l'entourer de barreaux double épaisseur, la faire flasher etc.

Il faudrait également constituer une base de données des 8427 messages mfe de notre gouleyant préféré, avec une méthode de tirage aléatoire.

Tu mets ensuite le fichier dans ton Compaq, et ça te fait une sorte de tamagoshi Sabatier portable que tu peux promener avec toi, qui te sort des HS à la demande, qui réclame à boire etc. De quoi ne plus regretter les éclipses du Maître sur le forum.

Il ne manque que les procédures événementielles, qui ne sont pas supportées par les modules de classe, malheureusement. Donc, pas de procédure JPS_BeforeClose(), JPS_BottleChange() ni JPS_AskForCidre() en perspective.

Evidemment, il s'agit là d'un exemple un peu artificiel, et d'une classe d'objets JeanPaulSabatier dont le mode de fonctionnement est plus abstrait et le maniement beaucoup plus aisé que son modèle original.

Si le sujet vous intéresse, je vous proposerai dans un prochain chapitre un exemple complet et détaillé de module de classe définissant un type d'objet un peu plus sophistiqué.

A très bientôt,

Laurent

Réponse de l'intéressé

(le droit de réponse est toujours ouvert !)

Si cet affreux de LL avait jeté son dévolu sur un objet plus inanimé qui aurait sûrement eu une âme qui s'attache à notre âme et nous force à l'aimer.
Pensez-vous! il a fallu qu'il s'empare de JPS, qu'il le triture, que dis-je, qu'il l'instancie Sei was du wilst, aber was du bist, sei es ganz
eh bien, je vous le dis en vérité : ich bin instanciert

à +

jps (objet)