Tutoriel et exemples du module de classe VBA

Ce didacticiel vous apprendra les modules de classe en VBA. Vous apprendrez ce qu'ils sont et comment les utiliser.

Modules de classe VBA - Introduction

Lorsque vous insérez des modules dans Visual Basic Editor (VBE) afin d'entrer votre code, vous avez peut-être remarqué que vous pouvez également insérer ce qu'on appelle un « module de classe ».

Modules de classe vs modules

Les modules de classe fonctionnent d'une manière très différente des modules ordinaires en ce sens qu'ils facilitent la création d'un modèle d'objet composant (COM) qui peut ensuite être utilisé dans votre code VBA normal

En effet, vous créez un objet qui fonctionne de la même manière qu'un objet Excel intégré tel que « Feuilles de calcul ». Dans l'objet Worksheets, vous disposez d'un certain nombre de propriétés et de méthodes qui vous permettent d'obtenir le nombre de feuilles de calcul dans un classeur ou chaque nom individuel d'une feuille de calcul, ou de nombreuses autres informations

Lorsque vous créez un nouvel objet de cette manière, vous créez un bloc de construction qui peut être utilisé n'importe où dans VBA. L'objet possède un certain nombre de propriétés et de méthodes auxquelles votre code VBA peut accéder de n'importe où dans le classeur sans avoir à réécrire le code à nouveau.

En plus de faire référence à votre nouvel objet à partir d'un module VBA standard, vous pouvez également l'utiliser dans le code derrière un UserForm qui fait partie de votre application personnalisée

Vous pouvez également l'utiliser là où vous avez placé des contrôles Active X sur une feuille de calcul, comme un bouton de commande ou une liste déroulante. Ces contrôles utilisent tous VBA et votre nouvel objet peut facilement être incorporé dans le code d'événement de ces contrôles.

Vous pouvez également transformer votre objet en un complément Excel. Votre objet sera automatiquement disponible pour les autres utilisateurs qui ont chargé ce complément. Cela ajoute votre propre architecture multi-niveaux à votre application Excel

Excel est une application à plusieurs niveaux. Il y a la couche de services client, qui pilote la fenêtre de feuille de calcul réelle avec laquelle l'utilisateur est familier. Le modèle d'objet Excel est la couche suivante en dessous. Appuyez sur F2 dans un module VBA et vous pourrez voir le grand nombre d'objets et de membres de ces objets qui sont le moteur d'Excel. Notez que votre nouvel objet sera également affiché ici.

Enfin, sous tout cela, vous avez la couche de services de données qui contient toutes les données que vous avez saisies dans les feuilles de calcul et les cellules. Excel y accède à l'aide du modèle objet Excel.

La création d'un module de classe vous permet d'étendre le module objet Excel avec vos propres objets et membres personnalisés

Cet article vous explique comment créer une hiérarchie simple d'objets à l'aide de modules de classe.

Avantages de l'utilisation des modules de classe

  1. Vous pouvez développer un bloc de construction robuste qui peut être utilisé dans n'importe quel nombre d'applications Excel différentes
  2. Une fois qu'il est minutieusement testé, on peut s'y fier pour toujours produire les résultats corrects de la même manière que les objets Excel intégrés
  3. Si des mises à jour sont apportées au code ailleurs dans l'application, le nouvel objet continuera à fonctionner de la même manière
  4. Vous pouvez utiliser votre nouvel objet dans d'autres applications Excel en tant que complément
  5. Les objets peuvent être réutilisés dans d'autres applications et aident au débogage

Inconvénients de l'utilisation des modules de classe

  1. Ils peuvent être difficiles à créer et à comprendre.
  2. Les conventions de nommage sont très importantes car c'est ce que vous verrez lorsque vous utiliserez votre objet dans un module normal.
  3. Si vous n'avez jamais créé de module de classe auparavant, ils peuvent être difficiles à comprendre et la courbe d'apprentissage est abrupte.
  4. Impossible d'apporter des modifications à l'exécution - vous devez réinitialiser le projet.
  5. Si les propriétés et les variables privées ont le même nom, des boucles infinies peuvent se produire, entraînant des erreurs

Insertion d'un module de classe

Sélectionnez Insérer | Module de classe dans le menu VBE (Visual Basic Editor). Le nouveau module de classe s'appellera automatiquement « Classe 1 », mais cela doit être immédiatement remplacé par le nom que vous allez utiliser pour votre objet

Vous modifiez le nom dans la fenêtre Propriétés vers laquelle pointe la flèche. Vous tapez simplement votre nouveau nom, et cela changera dans la collection Class Modules

Si la fenêtre Propriétés n'est pas visible, sélectionnez Affichage | Propriétés dans le menu VBE ou appuyez sur F4

Appelez votre nouveau module de classe 'MyItem' et double-cliquez sur le nom dans l'arborescence de l'explorateur de projet pour afficher la fenêtre de code correspondant.

Création d'un élément d'objet

Cet exemple créera un objet de niveau supérieur appelé « MyItems » avec un objet membre en dessous appelé « MyItem » qui contiendra les données individuelles pour chaque élément. Une fois créé, il fonctionnera de la même manière qu'un objet Excel intégré. Par exemple, il existe un objet appelé « Feuilles de calcul » qui est une collection de chaque feuille de calcul de votre classeur. Il existe également un objet appelé « Feuille » qui représente chaque feuille de calcul individuelle dans votre classeur et contient toutes les propriétés et méthodes de chaque feuille de calcul. Cet objet se rapporte à l'objet de collection « Feuilles de travail ».

Vous pouvez parcourir la collection « Feuilles de travail », en affichant chaque « feuille » à tour de rôle. De la même manière, vous pourrez parcourir la collection « MyItems » en affichant les propriétés que vous avez créées dans le membre « Myitem ».

La première chose à faire est de créer le sous-objet pour le niveau membre qui contiendra les éléments réels dans la collection de l'objet de niveau supérieur. C'est l'équivalent des membres (par exemple, nom, visible, nombre) dans l'objet « Feuille » dans Excel. Ce code est entré dans le module de classe appelé 'MyItem'

Les modules de classe ont des propriétés et des méthodes. Les propriétés sont effectivement comme des variables, en ce sens qu'elles contiennent des valeurs de données comme des variables, et les méthodes sont comme des sous-routines ou des fonctions.

Dans le sous-objet, nous allons créer deux propriétés pour l'objet - Item et Detail

Initialement, deux variables de chaîne doivent être déclarées pour contenir les valeurs des propriétés :

12 mItem privé en tant que chaînemDetail privé en tant que chaîne

Ceux-ci doivent être déclarés dans la section Déclarations en haut du code du module de classe afin qu'ils puissent être utilisés dans toutes les sous-routines du module

Ils doivent recevoir des noms uniques pour les rendre différents des propriétés que nous allons créer, donc un "m" (pour membre) a été placé devant chaque nom.

Les variables sont déclarées comme privées afin qu'elles ne puissent pas être vues par quiconque utilisant l'objet. Ce sont des variables de travail à utiliser dans le code objet et ne font pas partie de l'objet final.

L'étape suivante consiste à configurer le code pour donner accès aux deux propriétés. Pour ce faire, utilisez une instruction Property Let et une instruction Property Get pour chaque propriété. Ceux-ci doivent être publics, sinon l'objet de niveau supérieur n'aura aucune propriété visible

123456789101112131415 Propriété publique Let Item(vdata As String)mItem = vdataPropriété de finPropriété publique Obtenir l'élément () en tant que chaîneArticle = mArticleFin de la propriétéDétail de la propriété publique (vdata en tant que chaîne)mDétail = vdataPropriété de finPropriété publique Get Detail () As StringDétail = mDétailPropriété de fin

Ce code crée les moyens de lire et d'écrire des valeurs dans les deux propriétés (Item et Detail) en utilisant les deux variables privées qui ont été définies dans la section des déclarations du module.

Le paramètre 'vdata' permet de passer des données à la propriété concernée.

Il est important que chaque propriété ait une instruction « Let » et « Get » et que le nom de la propriété soit le même dans chaque cas. Vous pourriez vous retrouver avec deux propriétés différentes en cas d'orthographe incorrecte - une à partir de laquelle vous pouvez lire et une à laquelle vous pouvez écrire !

Pour vous aider à créer ce code, vous pouvez utiliser Insert | Procédure dans le menu VBE pour créer un squelette de code qui créera le code initial pour les propriétés « Get » et « Let » pour un nom de propriété donné

Cela affichera une fenêtre contextuelle dans laquelle vous saisissez le nom de la propriété et sélectionnez « Propriété » sur les boutons radio :

Cliquez sur « OK » et le code squelette sera ajouté dans le module de classe :

1234567 Propriété publique Get MyProperty() en tant que varianteFin de la propriétéPropriété publique Let MyProperty(ByVal vNewValue As Variant)Propriété de fin

Cela évite toute erreur sur les noms de propriétés. Vous ajoutez simplement votre code entre les instructions « Public Property » et « End Property ».

Vous avez maintenant un objet appelé "MyItem" qui contiendra toutes les données pour cet exercice.

Fatigué de rechercher des exemples de code VBA ? Essayez AutoMacro !

Création d'une collection

L'étape suivante consiste à créer un objet de niveau supérieur en tant qu'objet Collection pour donner accès aux propriétés que vous avez configurées dans l'objet 'MyItem'

Encore une fois, vous devez définir un objet de travail pour agir en tant qu'objet de collection de la même manière que vous avez défini les deux variables de chaîne dans l'objet « MyItem ».

1 Éléments privés en tant que collection

Encore une fois, cela doit avoir un nom unique, c'est pourquoi il y a un "m" (objet membre) devant le nom, et il est également déclaré comme "Privé" afin qu'il n'apparaisse pas lorsque le nouvel objet est en cours utilisé

Ensuite, vous devez remplir le code Class_Initialize. Cela s'exécute lorsque vous utilisez l'objet pour la première fois dans votre code et détermine les valeurs qui seront chargées dans l'objet

Vous pouvez accéder à cette sous-routine en sélectionnant « Classe » dans la première liste déroulante et « Initialiser » dans la deuxième liste déroulante de la fenêtre du module

12345678910 Sous-classe privée_Initialize()Dim objItem en tant que MyItemDéfinir mItems = Nouvelle CollectionPour n = 1 à 3Définir objItem = New MyItemobjItem.Item = Worksheets("Sheet1").Range("a" & n).ValueobjItem.Detail = Worksheets("Sheet1").Range("b" & n).ValuemItems.Ajouter objItemSuivant nFin du sous-marin

Le code configure un objet appelé 'objItem' en utilisant la définition de 'MyItem' que nous avons construit plus tôt en tant que module de classe.

Il crée ensuite une nouvelle collection basée sur l'objet 'mItems' défini précédemment

Il parcourt les valeurs détenues sur Sheet1 du classeur et les place dans les propriétés que nous avons créées pour l'objet 'MyItem'. Notez que lorsque vous utilisez 'objitem', une liste déroulante apparaît montrant les deux propriétés, exactement comme si vous utilisiez un objet Excel intégré.

L'objet item est ensuite ajouté à l'objet collection qui contient désormais toutes les données des valeurs de propriété.

Les données d'entrée ne doivent pas nécessairement être extraites d'une feuille de calcul. Il peut s'agir de valeurs statiques, d'une connexion à une base de données telle que Microsoft Access ou SQL Server, ou d'une autre feuille de calcul.

Vous devez ensuite ajouter une fonction publique appelée « Item »

123 Élément de fonction publique (index As Integer) As MyItemDéfinir l'élément = mItems.Item(index)Fonction de fin

Cela vous permet de faire référence à des objets individuels au sein de l'objet de collection par leur numéro d'index. Cette fonction fournit un « miroir » de ce qui se passe dans la collection « mMyItems » en arrière-plan.

Vous devrez également ajouter une propriété appelée « Count » afin que votre code puisse établir combien d'objets « MyItem » se trouvent dans la collection « MyItems », si vous souhaitez parcourir celle-ci.

123 Propriété publique Get Count() As LongNombre = mItems.CountPropriété de fin

Dans ce cas, vous n'avez besoin que d'une propriété 'Get' car elle est en lecture seule. Il utilise la collection mItems car elle possède déjà une propriété count intégrée.

Vous avez maintenant un objet (MyItems) avec une hiérarchie complète définie par l'objet 'MyItem'

Pour que le tout fonctionne, vous devez maintenant remplir une feuille de calcul (Sheet1) avec des données afin que la routine Class Initialize puisse les collecter dans l'objet

Votre feuille de calcul devrait ressembler à ceci :

Utiliser votre nouvel objet

Vous pouvez désormais utiliser votre objet Collection (MyItems) dans un module Excel VBA standard. Saisissez le code suivant :

12345678 Sous objet_test()Dim MyClass As New MyItems, n As IntegerMsgBox MaClasse.CountPour n = 1 à MyClass.CountMsgBox MaClasse.Item(n).ItemMsgBox MaClasse.Item(n).DétailSuivant nFin du sous-marin

Ce code crée un objet appelé "MyClass" basé sur l'objet de collection que vous avez créé et appelé "MyItems". Cela déclenche la routine "Initialize" qui extrait toutes les données de la feuille de calcul dans l'objet.

Il affiche le nombre d'éléments de la collection, puis parcourt la collection en affichant le texte « Article » et le texte « Détail ». Vous remarquerez que lorsque vous faites référence à l'objet 'MyClass' dans votre code, vous verrez une liste des deux propriétés membres qui aident à ajouter la propriété correcte.

Si vous modifiez la valeur d'une cellule dans les données d'entrée de la feuille de calcul, cela sera automatiquement mis à jour dans la collection lorsque vous exécutez à nouveau le code ci-dessus, car lorsque vous dimensionnez l'objet, la routine d'initialisation s'exécute et récupère toutes les nouvelles données

Si vous utilisez le mot « Static » au lieu de « Dim », la routine d'initialisation ne s'exécute pas et les anciennes valeurs sont conservées, tant que le code s'exécute en continu. Si les données de la feuille de calcul changent, cela ne sera pas reflété dans l'objet

1234567 Sous Test_Statique()Myclass statique en tant que nouveaux MyItems, n en tant qu'entierPour n = 1 à Myclass.CountMsgBox Maclasse.Item(n).ItemMsgBox Maclasse.Item(n).DétailSuivant nFin du sous-marin

Résumé de la création d'un objet à l'aide d'un module de classe

Comme vous l'avez vu, créer une hiérarchie de modules de classe à utiliser comme objet est une affaire assez compliquée, même pour une structure aussi simple que l'exemple fourni ici. La possibilité de faire des erreurs est énorme !

Cependant, il présente d'énormes avantages pour rendre votre code plus élégant et plus facile à lire. Il est également plus facile à partager avec d'autres applications et développeurs Excel en le transformant en un complément.

Dans cet exemple de création d'un objet pour contenir des données, ce serait une approche normale de créer un tableau multidimensionnel pour contenir les données d'une feuille de calcul à plusieurs colonnes, et vous écririez une ligne de code pour mettre à jour ou lire chaque élément dans le tableau. Cela finirait probablement par être assez compliqué et des erreurs pourraient facilement être commises en abordant les différents éléments.

Avec votre nouvel objet, vous pouvez simplement vous y référer et les membres que vous avez créés en dessous pour contenir les données.

De plus, si les données changent dans la feuille de calcul (ou dans une base de données liée si vous l'avez utilisée comme source de données dans votre module de classe) chaque fois que vous utilisez l'instruction "Dim", la routine d'initialisation sera appelée et les données seront instantanément mises à jour . Pas besoin d'écrire du code pour repeupler votre tableau.

Utiliser un module de classe pour créer un référentiel de variables

Lorsque vous écrivez du code VBA, vous utilisez des variables partout, toutes avec des portées différentes. Certaines peuvent uniquement être définies pour une procédure particulière, d'autres pour un module particulier, et certaines peuvent être des variables globales pouvant être utilisées dans toute l'application

Vous pouvez créer un module de classe qui contiendra un grand nombre de variables, et comme il s'agit d'un objet, il peut être utilisé n'importe où dans votre code, même sur un formulaire utilisateur ou dans un contrôle Active X que vous avez placé sur une feuille de calcul.

L'avantage supplémentaire est que lorsque vous faites référence à votre objet variable, vous verrez une liste de tous les noms de variables contenus dans l'objet triés par ordre croissant.

Pour créer un référentiel, vous devez insérer un nouveau module de classe. Pour ce faire, utilisez Insert | Module de classe dans le menu de l'éditeur VB

Remplacez le nom par « MyVariables » en utilisant la même méthodologie que celle décrite précédemment dans cet article.

Saisissez le code suivant :

12345678910111213141516 mV privé comme variantePropriété publique Obtenir Variable1() en tant que varianteVariable1 = mVPropriété de finPropriété publique Let Variable1(ByVal vNewValue As Variant)mV = vNouvelleValeurFin de la propriétéPropriété publique Obtenir Variable2() comme varianteVariable1 = mVPropriété de finPropriété publique Let Variable2(ByVal vNewValue As Variant)mV = vNouvelleValeurPropriété de fin

Ce code définit les propriétés « Let » et « Get » pour deux variables (« Variable1 » et « Variable2 »). Les propriétés Let et Get sont requises pour chacune de vos variables afin qu'elles soient en lecture/écriture

Vous pouvez utiliser vos propres noms pour les variables au lieu des exemples de ce code, et vous pouvez ajouter d'autres variables, en vous assurant que chaque nouvelle variable a une instruction « Let » et « Get ».

La déclaration privée de la variable « mV » consiste à créer une variable de travail qui n'est utilisée que dans le module de classe pour transférer des valeurs.

Pour utiliser le référentiel de variables, saisissez le code suivant dans un module standard :

123456 Global VarRepo en tant que nouveau MyVariablesSous-testVariableRepository()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1Fin du sous-marin

Ce code crée une instance globale de votre objet 'MyVariables' que vous avez créé. Vous n'avez besoin de faire cette déclaration qu'une seule fois depuis n'importe où dans votre code.

Le code affiche d'abord la valeur de 'Variable1' pour montrer qu'elle est vide.

Une valeur de 10 est attribuée à « Variable1 » et la nouvelle valeur dans l'objet est ensuite affichée pour montrer que cette propriété détient désormais cette valeur.

Étant donné que l'instance de l'objet « MyVariables » a été définie globalement, vous pouvez faire référence à l'une des variables définies dans l'objet à partir de n'importe où dans votre code.

Cela présente un énorme avantage en ce que si vous souhaitez utiliser vos variables n'importe où dans votre code, vous n'avez besoin de définir qu'une seule variable globale, et à partir de cette instance, toutes les variables peuvent être librement consultées et modifiées dans tout votre code.

Transformer votre objet en complément

Jusqu'à présent, le code pour la création de l'objet se trouve dans votre application de classeur. Cependant, si vous souhaitez pouvoir partager votre objet avec d'autres développeurs ou dans d'autres applications Excel, vous pouvez le transformer en un complément

Pour ce faire, il suffit d'enregistrer le fichier en tant que complément. Sélectionnez Fichier | Enregistrer sous et une fenêtre de navigateur apparaîtra

Sélectionnez le type de fichier en tant que complément (.xlam) dans la liste déroulante des types de fichier et cliquez sur OK. Le fichier sera enregistré par défaut dans le dossier Add-In, mais vous pouvez modifier l'emplacement.

Vous pouvez ensuite incorporer le fichier de complément dans vos applications Excel, ce qui vous donne la possibilité d'utiliser votre nouvel objet

Pour inclure votre nouveau complément dans Excel, cliquez sur Fichier dans le ruban Excel, puis sur Options en bas du volet de gauche

Cliquez sur « Add-Ins » dans le volet de gauche de la fenêtre contextuelle qui apparaît. Au bas de la fenêtre se trouve un bouton marqué « Go »

Cliquez dessus et une fenêtre contextuelle « Add-In » apparaîtra. Cliquez sur « Parcourir », puis localisez votre fichier de complément. Vous pourrez alors faire référence à votre objet dans votre code.

Vous contribuerez au développement du site, partager la page avec vos amis

wave wave wave wave wave