Quels sont les avantages de l'utilisation de Classes en VBA?
Je fais un certain programmation VBA dans Excel, et avoir un classeur où toutes les fiches techniques doivent être copiés à partir dans une autre feuille. La nouvelle feuille d'avoir plusieurs lignes d'en-tête, et je tiens à garder une trace de l'endroit où ils sont situés, donc je n'ai pas à trouver les mots dans leur permanence.
Est la chose la plus simple à l'utilisation des classes et de les garder en marche alors que le classeur Excel est ouvert? Ou sera-ce qu'il est lourd et difficile à manipuler, et je dois continuer à travailler avec des sous-programmes? Quels sont les avantages de l'utilisation de classes? Ce n'est pas comme j'ai plusieurs objets, que des feuilles et de validation sur les colonnes.
Vous devez vous connecter pour publier un commentaire.
L'avantage de l'utilisation de classes au lieu de simplement les sous-programmes est que les classes de créer un niveau d'abstraction qui vous permettent d'écrire plus propre code. Certes, si vous n'avez jamais utilisé des classes avant d'en VBA, il y a une courbe d'apprentissage, mais je crois qu'il vaut certainement la peine de le temps de le comprendre.
Une indication clé que vous devriez passer à des classes est si vous êtes constamment en ajoutant des paramètres à vos fonctions et sous-routines. Dans ce cas, il est presque toujours préférable d'utiliser des classes.
J'ai copié une explication des classes à partir de un de mes précédents Débordement de Pile réponses:
Voici un long exemple de la façon dont l'aide d'une classe peut vous aider. Bien que cet exemple est long, il va vous montrer comment quelques principes de la programmation orientée objet peut vraiment vous aider à nettoyer votre code.
Dans l'éditeur VBA, allez à la
Insert > Class Module
. Dans la fenêtre des Propriétés (en bas à gauche de l'écran par défaut), modifier le nom du module àWorkLogItem
. Ajoutez le code suivant à la classe:Le code ci-dessus va nous donner un typage fort des objets spécifiques pour les données avec lesquelles nous travaillons. Lorsque vous utilisez multi-dimension des tableaux pour stocker vos données, votre code ressemble à ceci:
arr(1,1)
est l'ID,arr(1,2)
est le PersonName, etarr(1,3)
est le HoursWorked. En utilisant cette syntaxe, il est difficile de savoir ce qui est quoi. Imaginons que vous toujours charger vos objets dans un tableau, mais au lieu d'utiliser laWorkLogItem
que nous avons créé ci-dessus. Ce nom, vous seriez en mesure de fairearr(1).PersonName
pour obtenir le nom de la personne. Qui rend votre code plus facile à lire.Nous allons continuer d'avancer avec cet exemple. Au lieu de stocker les objets dans le tableau, nous allons essayer d'utiliser un
collection
.Ensuite, ajoutez un nouveau module de classe et de l'appeler
ProcessWorkLog
. Placez le code suivant dedans:La classe ci-dessus est destiné à être utilisé pour "faire quelque chose" avec une collection de
WorkLogItem
. D'abord, nous avons juste mis à compter le nombre total d'heures travaillées. Nous allons tester le code que nous avons écrit. Créer un nouveau Module (pas un module de classe cette fois, il suffit d'un "régulier" module). Collez le code suivant dans le module:Dans le code ci-dessus,
PopulateArray()
crée simplement une collection deWorkLogItem
. Dans votre propre code, vous pouvez créer une classe pour analyser vos feuilles de calcul Excel ou vos objets de données pour remplir une collection ou un tableau.La
TestGetHoursWorked()
code montre comment les classes ont été utilisés. Vous remarquez queProcessWorkLog
est instancié comme un objet. Après il est instancié, une collection deWorkLogItem
devient une partie de lapwl
objet. C'est dans la ligne deSet pwl.WorkLogItems = PopulateArray()
. Ensuite, nous avons simplement appeler la fonction que nous avons écrit ce qui agit sur la collectionWorkLogItems
.Pourquoi est-ce utile?
Supposons que vos changements de données et vous souhaitez ajouter une nouvelle méthode. Supposons que votre
WorkLogItem
comprend maintenant un champ pourHoursOnBreak
et vous voulez ajouter une nouvelle méthode de calcul qui.Tout ce que vous devez faire est d'ajouter une propriété à
WorkLogItem
comme suit:Bien sûr, vous aurez besoin de changer votre méthode pour remplir votre collection (l'exemple de la méthode que j'ai utilisé était
PopulateArray()
, mais vous devez probablement avoir une classe juste pour cela). Ensuite, il suffit d'ajouter votre nouvelle méthode de votreProcessWorkLog
classe:Maintenant, si nous voulions mettre à jour notre
TestGetHoursWorked()
méthode pour retourner un résultat deGetHoursOnBreak
, tout ce que nous aurions à faire que d'ajouter la ligne suivante:Si vous avez passé dans un tableau de valeurs qui représentait vos données, vous devez trouver tous les endroits dans votre code où vous avez utilisé les tableaux et les mettre à jour en conséquence. Si vous utilisez des classes (et leurs objets instanciés) au lieu de cela, on peut très facilement mettre à jour votre code pour travailler avec les changements. Aussi, lorsque vous permettez à la classe pour être consommés dans de multiples manières (peut-être une fonction a besoin de seulement 4 des propriétés des objets si une autre fonction aurez besoin de 6), ils peuvent toujours référence au même objet. Ceci vous évite d'avoir plusieurs tableaux pour les différents types de fonctions.
Pour en savoir plus, je très vous recommandons d'obtenir une copie de VBA Manuel du Développeur, 2e édition. Le livre est plein de bons exemples et bonnes pratiques et des tonnes d'exemples de code. Si vous êtes à investir beaucoup de temps dans VBA pour un projet sérieux, il est bien utile de votre temps à regarder dans ce livre.
PopulateArray
fonction, pourquoi avez-vous (et les autres) la création d'une collection, d'y ajouter, puis régler la fonction égale à la collection? Pourquoi ne pas simplement définir la fonction égale à une nouvelle collection et d'y ajouter directement?Si il y a beaucoup de sous-programmes ou sous-programmes sont très longues, puis de structurer le code pour les classes peuvent aider. Si il ya seulement un couple de routines, de dire, chacun étant à seulement 10 lignes de code à chaque alors ce n'est plus de tuer. L'avantage de structurer le code dans les classes, c'est qu'il est plus facile de lire et de changer quand vous revenez en bas de la ligne. Donc une autre raison de la structuration du code dans les classes est de savoir si le code est susceptible d'avoir besoin de changer la ligne
Il y a une autre chose que vous pourriez ajouter des avantages que d'autres contributeurs ont dit (désolé si c'est quelque part dans Ben McCormack excellente réponse et je l'ai raté). Les Classes peuvent avoir leurs utilisations si votre script VBA est susceptible d'être re-programmé à un certain point.
Par exemple, je suis en train de concevoir une sorte de système de gestion de commandes. Il est utilisé par plusieurs collègues pendant un certain temps, mais il peut avoir besoin de re-progamming si la commande de changement des règles. J'ai donc conçu une base de classe de l'élément, qui rassemble toutes les informations sur un élément de stock. Les règles sur la façon dont ces données sont analysées pour toute commande sont, cependant, écrit en facilement accessible et bien commenté sous-routines. En faisant cela, j'espère que les futurs programmeurs VBA pouvez facilement changer les règles mathématiques par les commandes qui sont générés, sans avoir à traiter de la façon dont les données sont recueillies au sujet d'un élément de stock (ce qui est fait par les sous-routines et fonctions au sein de la classe, qui sont activés lorsque la classe est remis un numéro de stock). Une Classe de propriétés publiques sont également enregistrées par l'intellisense, permettant à la prochaine programmeur, ainsi que vous-même, pour avoir un temps plus facile de lui.
Je suppose que le point est que les classes peuvent rendre la vie plus facile pour plus tard les utilisateurs de cette façon si ils codent de base d'une série d'informations, ou quelque objet conceptuel, qui est toujours susceptible d'être pertinente pour le contexte de l'utilisation du programme.