Présentation.
Ces dernières semaines, nous avons appris à utiliser le type défini par l'utilisateur (UDT) en créant une structure de données complexe et nous connaissons plus ou moins la force ou la faiblesse de l'UDT. Si vous n'avez pas parcouru ces articles, vous pouvez les visiter. Utilisez les liens suivants :
- Type de données défini par l'utilisateur-2
- Type de données défini par l'utilisateur-3
Dans Microsoft Access, il existe deux types de modules VBA.
- Modules standards
- Modules de cours
Nous avons travaillé avec des modules de cours sur Forms et Rapports de Microsoft Access. Les programmes du module de classe de formulaire/rapport sont principalement des petites routines pilotées par des événements (clics sur les boutons, avant la mise à jour, événement actuel du formulaire/rapport, etc.).
Des programmes de traitement de données plus sérieux seront écrits dans des modules standard. Plusieurs programmes, pas nécessairement liés, peuvent être écrits dans un module standard, pour effectuer différentes tâches.
Les modules de classe sont différents. Ils sont utilisés pour créer des objets personnalisés et un module de classe est utilisé pour un seul objet.
Les bases du module de classe autonome.
Créons un module de classe simple à partir de zéro et apprenons les bases.
- Démarrez Microsoft Access et ouvrez une base de données ou créez-en une nouvelle. S'il s'agit d'une nouvelle base de données, enregistrez-la dans l'emplacement approuvé existant (dossier) ou ajoutez le nouvel emplacement à la liste des emplacements approuvés. Cliquez sur le bouton Office -> Options d'accès -> Centre de gestion de la confidentialité -> Paramètres du centre de gestion de la confidentialité. Ajoutez le dossier de la base de données dans la liste et cliquez sur OK.
- Ouvrez la fenêtre d'édition VBA (Alt + F11).
- Cliquez sur Insérer Menu et sélectionnez le module de cours de la liste. Un nouveau module de classe est inséré.
Remarque : Le nom de la classe :ClsArea devenir le nom de l'objet. Cela signifie que, partout où nous utilisons cet objet, ce sera comme une déclaration de variable normale :Dim xyz As ClsArea . Nous avons rédigé une déclaration similaire pour les déclarations de type de données défini par l'utilisateur.
Ensuite, nous ajouterons trois Propriétés (Variables) de l'Objet (pour Description, Longueur, et Largeur ) en haut du module, sous la base de données de comparaison d'options et Option Explicit lignes. Tapez les lignes suivantes dans le module de cours.
Option Compare DatabaseOption ExplicitPublic p_Desc as StringPublic p_Length as DoublePublic p_Width as Double
Ces variables sont identifiées en tant que propriétés de l'objet de classe personnalisé VBA. Enregistrez le module de cours.
Remarque : Notre objet de module de classe et nos lignes de code ne seront pas aussi simples. Il subira des modifications avec plusieurs lignes de code. Mieux vaut être prêt à les suivre étape par étape, sans perdre de vue chaque étape des changements. Il s'agit d'une simple classe de calcul de surface (surface =longueur * largeur ), c'est simple. Il subira progressivement des changements afin que vous sachiez pourquoi ces changements deviennent nécessaires.
Nous allons écrire un petit programme dans un module standard pour tester notre nouveau module de classe. Insérez un module standard à partir du menu Insertion. Vous pouvez saisir ou copier et coller le code suivant dans le module standard, en écrasant la ligne existante dans le module :
Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.Set oArea =NothingEnd Function
Le Dim déclaration déclare une Variable comme nous le faisons pour une variable normale, comme Dim Desc as String. Mais, ce n'est pas une variable ordinaire, nous définissons une référence à notre objet de module de classe ClsArea . Puisqu'il s'agit d'un objet, une simple instruction Dimension seule ne suffit pas car elle n'allouera aucun espace mémoire pour stocker des valeurs dans notre objet défini localement oArea Propriétés.
L'ensemble déclaration dans la ligne suivante avec le Nouveau mot-clé requis, pour créer une instance d'un objet à partir de ClsArea en mémoire, avec le nom d'instance d'objet oArea . Nous pouvons ouvrir plusieurs instances du même objet de classe en mémoire de cette manière si nécessaire (nous en apprendrons davantage dans les semaines à venir) afin de pouvoir stocker des valeurs dans ses propriétés (p_Desc, p_Length, p_Width). Le p_ Le préfixe des variables est un indicateur que la portée des variables est privée, c'est-à-dire que les variables ne sont pas visibles en dehors du module de classe si la variable est déclarée avec le mot-clé Private, mais maintenant elle est déclarée comme publique. Le nom de la variable peut être n'importe quel nom valide.
Remarque : Nous ne l'avons pas encore déclaré privé. Nous sommes sur la voie de ce changement.
Immédiatement après le mot-clé Définir le nom de l'objet local (vous pouvez choisir un nom approprié que vous préférez, mais il doit être conforme aux règles normales de nom de variable) suivi d'un signe égal et du mot-clé Nouveau et le nom du module de classe (ClsArea) pour créer une instance de l'objet clsArea en mémoire avec toutes ses propriétés (variables).
Il existe un raccourci pour ce code à deux lignes. Les actions de ces deux lignes de code peuvent être réalisées avec une seule instruction comme indiqué ci-dessous :
Dim oArea As ClsAreaSet oArea =New ClsArea'le raccourci vers les deux instructions ci-dessusDim oArea As New ClsArea
Lorsque vous tapez la ligne suivante oArea suivi d'un point (. ) séparateur l'affichage suivant apparaîtra pour montrer la liste des propriétés d'objets personnalisés disponibles à sélectionner.
S'il n'apparaît pas, accédez à la boîte de dialogue Options dans la boîte de menu Outils et cochez la case Membres de la liste automatique dans l'onglet Éditeur.
Avant de quitter la fonction, la dernière instruction doit être Set oArea =Nothing . Cette instruction libère explicitement la mémoire occupée par l'instance de l'objet personnalisé, afin que davantage de mémoire soit disponible pour d'autres programmes. Il s'agit d'une opération de nettoyage responsable par notre programme.
Tout ce que nous faisons avec l'objet personnalisé instancié doit être codé entre le premier et le dernier Set déclarations.
Le programme de test d'objet de classe ClsArea.
Le code du programme de test de classe complété est donné ci-dessous :
Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.p_Desc ="Tapis"oArea.p_Length =25oArea.p_Width =15Debug.Print "Description", "Length", "Width"Debug.Print oArea.p_Desc, oArea.p_Length, oArea.p_WidthSet oArea =NothingEnd Fonction
Cliquez quelque part au milieu du code et appuyez sur F5 pour exécuter le programme. L'exécution du programme est donnée ci-dessous à titre de référence.
Description Longueur LargeurTapis 25 15
Public|Portée privée des propriétés de l'objet.
Notre objet de module de classe simple présente quelques inconvénients et nous allons les corriger.
La première est que nous avons déclaré toutes les Variables (ou Propriétés) avec Public Portée. Pour cette raison, ils sont visibles par d'autres programmes VBA et peuvent voir leur valeur modifiée directement. Le deuxième problème est qu'il acceptera toutes les valeurs non valides, comme les valeurs négatives ou nulles, qui ne conviennent pas à notre objet de classe. Nous devons incorporer quelques vérifications de validation avant d'accepter les valeurs dans les variables.
Le premier problème que nous pouvons résoudre facilement en changeant les déclarations de variables de Public à Private . Lorsque nous faisons cela, nous devrions avoir une méthode indirecte pour stocker et récupérer les valeurs des variables privées. C'est le but du Get et Laissez Procédures de propriété, pour chaque propriété de l'objet. Faisons ces changements dans le module de cours.
Ouvrez le module de classe ClsArea. Remplacez le mot Public par Privé pour les trois variables.
Créer des procédures de propriété
Sélectionnez Procédure de Insérer Menu, tapez strDesc dans le Nom contrôle de texte, sélectionnez Propriété dans le Type Groupe d'options et Public dans le portée groupe d'options. Cliquez sur OK pour insérer les procédures de propriété pour le Private p_Desc Variable (Propriété).
Option Compare DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePrivate p_Width As DoublePublic Property Get strDesc() As String strDesc =p_Desc 'renvoie la valeur de p_DescEnd PropertyPublic Property Let strDesc(ByVal strNewValue As String) p_Desc =strNewValue 'stocke la valeur dans Propriété p_DescEnd
Le Get Procédure et Laisser Les procédures sont déclarées comme Public . Les deux noms de procédure sont identiques strDesc. Par défaut, le renvoyé le type de données est Variant dans Obtenir Procedure et le type de données Parameter sont également insérés en tant que Variant dans le Let Procédure. Ceux-ci, nous pouvons les changer en types spécifiques selon les besoins, ce que nous avons fait et changé en String taper. Les trois premières lettres str dans strDesc indique à l'utilisateur que la propriété attend une valeur de type de données String. Changer le Let Propriété Procédure Paramètre Nom de la variable vNouvelleValeur à strNouvelleValeur
Lorsque nous insérons la procédure de propriété, elles sont toujours insérées avec Get et Laissez Paires de procédures pour une variable.
Maintenant, regardez attentivement l'expression que nous avons écrite dans le Get Procédure. Le côté gauche du = Signez le nom de la Get Procedure strDesc agit comme une variable pour renvoyer la valeur copiée de la variable privée p_Desc au programme appelant.
Le Laissez Procédure strDesc accepte la valeur de chaîne dans le paramètre Variable strNewValue . La valeur d'entrée est transférée dans notre variable privée p_Desc.
Le point à noter ici est qu'il n'y a pas d'accès direct à notre variable privée p_Desc vers le monde extérieur. Transport de valeurs De/Vers la Variable (Propriété) p_Desc est toujours acheminé via Get/Let Procédures de propriété uniquement et soumises à des contrôles de validation (pas encore implémenté), nous introduirons ultérieurement des contrôles de validation sur les valeurs saisies (procédure Let) dans la propriété.
Le Obtenir/Laisser Les procédures sont exécutées automatiquement en fonction de ce que nous faisons avec la propriété Object dans une expression dans les programmes VBA.
Le Obtenir La procédure est exécutée lorsque nous utilisons le nom de la propriété dans une expression de la manière suivante :
‘ Lit la valeur de p_Desc à PrintDebug.Print oArea.strDescOR‘ Lit la valeur de p_Desc et l’affecte à la variable XX =oArea.strDesc
Le Laissez La procédure de propriété est exécutée lorsque nous essayons d'attribuer une valeur au nom de la propriété. Vérifiez l'exemple d'expression dans notre programme de test ci-dessous :
oArea.strDesc ="Tapis"
Dans les livres BASIC précédents, vous pouvez voir l'utilisation du mot-clé LET.
LET X =25 ‘ LET est facultatif
Comme il était facultatif, l'instruction fonctionne sans et ne l'utilise plus du tout.
Ici, si vous ne faites que lire une valeur d'une variable et ne rien y stocker directement, vous pouvez omettre la procédure Let et utiliser uniquement le Get Procédure.
Cette règle s'applique également à la procédure Let. Vous ne pouvez utiliser que le Let Procédure, si vous assignez une valeur dans une variable privée mais sans rien lire de la même variable, puis omettez la procédure Get.
Le Obtenir et Laissez Les procédures s'exécuteront les unes après les autres si notre expression ressemble à ceci :
oArea.strDesc =oArea.strDesc &" – King Size."
Dans l'expression ci-dessus, nous allons Get la valeur existante de la variable privée p_Desc et modifiez la description et stockez-la dans la même variable. En bref dans une expression si vous utilisez le nom de la propriété à droite du signe égal (= ) le Obtenir La procédure est appelée et Let La procédure est exécutée lorsque le nom de la procédure de la propriété de l'objet apparaît à gauche de l'égal (= ) signe.
Insérez deux ensembles de procédures de propriété pour les variables p_Length et p_Width. Lorsque vous donnez les noms de procédure dans le Nom contrôle donne le nom dblLength et dblWidth pour indiquer à l'utilisateur que ces propriétés attendent des nombres à double précision en entrée.
Objet de classe ClsArea avec ses procédures de propriété.
Le code complété jusqu'à présent avec les procédures de propriété dblLength et dblWidth est donné ci-dessous pour référence et pour mettre à jour votre code.
Option Compare DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePrivate p_Width As DoublePublic Property Get strDesc() As String strDesc =p_Desc 'copie la valeur de p_DescEnd PropertyPublic Property Let strDesc(ByVal strNewValue As String) p_Desc =strNewValueEnd PropertyPublic Property Get dblLength( ) As Double dblLength =p_LengthEnd PropertyPublic Property Let dblLength(ByVal dblNewValue As Double) p_Length =dblNewValueEnd PropertyPublic Property Get dblWidth() As Double dblWidth =p_WidthEnd PropertyPublic Property Soit dblWidth(ByVal dblNewValue As Double) p_Width =dblNewValueEnd Property
Le programme de test avec des modifications.
Si vous avez terminé de remplir le code ci-dessus, laissez-nous apporter des modifications à notre programme de test, afin de refléter les modifications que nous avons apportées ici. L'exemple de code modifié est donné ci-dessous.
Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsArea'Property Let procédures appelées hereoArea.strDesc ="Carpet"oArea.dblLength =25oArea.dblWidth =15Debug.Print "Description", "Length", "Width"'Property Get Procedures appelées ici pour printDebug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidthSet oArea =NothingEnd Function
Lorsque vous entrez un point (.) immédiatement après le nom de l'objet oArea (oArea.), la liste des noms de procédure de propriété est affichée par VBA IntelliSense et vous pouvez sélectionner celui requis dans la liste sans le saisir manuellement.
Le but de cet objet de classe est de calculer la surface de quelque chose, comme la surface de la pièce, le tapis, le carrelage ou tout autre matériau, qui ont des valeurs de longueur et de largeur. Cela signifie que nous avons besoin d'une fonction publique pour calculer la zone des valeurs de longueur, de largeur et de description de l'élément saisies dans l'objet de classe.
Méthode Objet ClsArea :Area()
Voici le Code de la Fonction Publique :
Public Function Area() As Double Area =Me.dblLength * Me.dblWidthEnd Function
Vous pouvez insérer cette fonction à partir de Insérer Menu en saisissant Zone dans le Nom Contrôle, en sélectionnant Fonction du Type groupe d'options et Public comme portée dans le module de classe ClsArea. Complétez la fonction en saisissant la ligne du milieu.
Nous pouvons adresser directement les variables p_Length et p_Width (car la fonction Area() fait partie du module de classe) dans l'expression de calcul de la surface. Mais, nous prenons la bonne route et appelons Get Procedures dblLength et dblWidth pour le calcul. Vous avez peut-être remarqué la référence Moi. utilisé pour qualifier les procédures Get dblLength, dblWidth, comme nous avions l'habitude d'écrire dans les modules de classe Form/Report, pour faire référence à l'objet actuel en mémoire et à ses propriétés. Comme je l'ai dit plus tôt, notre objet de classe personnalisé peut avoir plusieurs instances d'objet ouvertes en mémoire en même temps et le Moi Le mot-clé fait référence à l'instance actuelle à laquelle appartient la zone de fonction().
La fonction de test avec modification.
Modifiez notre fonction de test ClassTest1() pour incorporer la sortie de la fonction Area() comme ci-dessous :
Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.strDesc ="Tapis"oArea.dblLength =25oArea.dblWidth =15Debug.Print "Description", "Length", "Width", "Area "Debug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidth, oArea.AreaSet oArea =NothingEnd Function
La modification est uniquement dans les instructions Debug.Print. Exécutez le code et vérifiez la fenêtre de débogage pour le résultat.
Deux procédures d'événement sont requises dans les modules de classe personnalisés :Class_Initialize() et Class_Terminate() .
Méthodes d'exécution automatique.
Le Class_Initialize() le programme est exécuté automatiquement lorsque nous instancions un objet avec le Nouveau Mot-clé. Ce programme peut être utilisé pour définir des valeurs par défaut dans des variables ou instancier d'autres objets en mémoire. Un objet de classe peut utiliser d'autres classes comme objet(s) enfant(s) et doit être instancié. Cet aspect, nous l'explorerons plus en détail et apprendrons comment le faire plus tard.
Le Class_Terminate() le programme s'exécute lorsque nous essayons d'effacer l'objet de la mémoire lorsque le Rien le mot-clé est exécuté dans l'instruction Set oArea =Nothing . Lorsque le programme qui utilise l'objet de classe se termine, l'instance de l'objet en mémoire est supprimée par défaut. Mais c'est une bonne pratique de programmation que nous utilisons Set oArea =Nothing comme dernière instruction exécutable dans nos programmes pour effacer l'objet de la mémoire.
Nous ajouterons les programmes ci-dessus dans notre module de classe. Ajoutez le code suivant à la fin de votre module de cours :
Private Sub Class_Initialize() p_Length =0 p_Width =0 'MsgBox "Initialize.", vbInformation, "Class_Initialize()"End SubPrivate Sub Class_Terminate() 'MsgBox "Terminate.", vbInformation, "Class_Terminate()"End Sub
Si vous souhaitez tester ces deux sous-routines, supprimez le symbole Commentaire et activez la MsgBox. Exécutez votre programme de test une fois de plus. Vous trouverez le Initialiser apparaît au début (Cliquez sur OK pour continuer) et le message Terminer message apparaît à la fin du programme de test.
Je sais ce que vous pensez maintenant, comme "tant de code pour multiplier deux variables ensemble". C'est vrai dans cette perspective, mais il est très probable que nous ayons écrit du code pour des problèmes de résolution de problèmes similaires à plusieurs reprises à chaque fois, en dupliquant le code pour les contrôles de validation et pour d'autres protections contre les erreurs logiques.
Ici, nous n'écrivons pas un programme ordinaire mais développons un objet personnalisé qui peut être utilisé plusieurs fois ou peut faire partie d'autres objets, partout où nous en avons besoin sans nous soucier de son fonctionnement, du point de vue de l'utilisateur. Microsoft Access possède de nombreux objets/fonctions intégrés que nous utilisons tout le temps sans nous soucier de son fonctionnement, en définissant leurs propriétés ou paramètres et en faisant le travail.
Nous avons un autre problème à régler, les vérifications de validation sur les valeurs saisies dans dblNewValue Paramètre dans le Let Procédures de propriété de dblLength() et dblWidth(), pour s'assurer que des valeurs valides sont attribuées aux propriétés d'objet p_Length et p_Largeur .
Les valeurs négatives ou nulles saisies sont considérées comme invalides et nous devons prendre des précautions pour nous assurer que la valeur correcte est saisie par l'utilisateur.
Effectuer des vérifications de validation.
Le Let modifié Les segments de code de procédure de propriété sont donnés ci-dessous. Modifiez votre code en conséquence.
Public Property Let dblLength(ByVal dblNewValue As Double) Do While dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values Invalid:", "dblLength()", 0) Loop p_Length =dblNewValueEnd PropertyPublic Property Let dblWidth(ByVal dblNewValue As Double) Do While dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values Invalid:", "dblwidth()", 0) Loop p_Width =dblNewValueEnd Property
Le Faire pendant. . . Boucle s'exécute à plusieurs reprises jusqu'à ce qu'une valeur valide (supérieure à 0) soit entrée dans dblNewValue par l'Utilisateur
Vérifications de validation dans la méthode publique :Area()
Nous avons besoin d'un contrôle de validation supplémentaire dans la Area() Une fonction. Si l'utilisateur appelle la fonction Area() sans entrer d'abord des valeurs valides pour la longueur et la largeur, l'utilisateur doit en être informé. Nous vérifierons si les variables p_Length et p_Width ont des valeurs valides avant d'exécuter l'expression pour le calcul de surface. Voici le code :
Public Function Area() As Double If (Me.dblLength> 0) And (Me.dblWidth> 0) Then Area =Me.dblLength * Me.dblWidth Else Area =0 MsgBox "Erreur :Longueur/Largeur Valeur(s) ) Invalide., Programme abandonné." Fin de la fonction SiFin
Le code complet de l'objet ClsArea.
Le code entièrement rempli de notre module de classe ClsArea est donné ci-dessous :
Option Compare DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePrivate p_Width As DoublePublic Property Get strDesc() As String strDesc =p_Desc 'copie la valeur de p_DescEnd PropertyPublic Property Let strDesc(ByVal strNewValue As String) p_Desc =strNewValueEnd PropertyPublic Property Get dblLength( ) As Double dblLength =p_LengthEnd PropertyPublic Property Soit dblLength(ByVal dblNewValue As Double) Tant que dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values Invalid:", "dblLength()", 0) Loop p_Length =dblNewValueEnd PropertyPublic Property Get dblWidth() As Double dblWidth =p_WidthEnd PropertyPublic Property Let dblWidth(ByVal dblNewValue As Double) Tant que dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values Invalid:", "dblwidth()", 0) Loop p_Width =dblNewValueEnd PropertyPublic Fonction Area() As Double If (Me.dblLength> 0) And (Me.dblWidth> 0) Then Area =Me.dblLength * Me.dblWidth Else Area =0 MsgBox "Erreur :valeur(s) de longueur/largeur non valides., programme abandonné." End IfEnd FunctionPrivate Sub Class_Initialize() p_Length =0 p_Width =0 'MsgBox "Initialize.", vbInformation, "Class_Initialize()"End SubPrivate Sub Class_Terminate() 'MsgBox "Terminate.", vbInformation, "Class_Terminate()"End SubProcédures et méthodes de test des propriétés.
Vous pouvez tester notre objet de classe personnalisé en entrant des valeurs négatives ou 0 comme entrée dans les propriétés dblLength, dblWidth.
Dans le programme de test, commentez les lignes (oArea.dblLength=25 et oArea.dblWidth=15) pour tester la fonction Area(). Il devrait afficher le message d'erreur que nous avons écrit dans la fonction.
Notre module de classe de calcul de surface est maintenant considéré comme terminé et nous l'avons testé et trouvé qu'il fonctionne correctement. Vous pouvez le tester davantage pour toutes les erreurs logiques que j'ai négligées. Si vous rencontrez quelque chose que je n'avais pas prévu, partagez-le avec moi.
Plan futur des tests.
Nous avons testé l'objet de classe pour un seul élément. Nous devons calculer la surface de plusieurs éléments (disons la surface de 5 chambres à coucher ou de 10 tapis de tailles différentes, etc. On nous dit qu'une fois qu'un objet est développé, nous pouvons l'instancier plusieurs fois en mémoire en lui attribuant un ensemble de valeurs différent. dans chaque instance de l'objet et peut travailler avec eux.
En plus de cela, cet objet peut être utilisé dans le cadre d'autres objets que nous développons avec moins de code car une partie de notre nouvel objet de classe est déjà développée dans le module de classe ClsArea.
La semaine prochaine, nous apprendrons à créer un tableau d'objets personnalisés pour calculer la surface de plusieurs éléments.
- Module de classe MS-Access et VBA
- Tableaux d'objets de classe MS-Access VBA
- Classe de base MS-Access et objets dérivés
- Classe de base VBA et objets dérivés-2
- Classe de base et variantes d'objets dérivés
- Ensemble d'enregistrements et module de classe MS-Access
- Accéder au module de classe et aux classes wrapper
- Transformation des fonctionnalités de la classe wrapper
- Ms-Access et les bases des objets de collection
- Module de classe MS-Access et objet de collection
- Enregistrements de table dans l'objet et le formulaire de collection
- Principes de base des objets de dictionnaire
- Principes de base des objets de dictionnaire -2
- Tri des clés d'objet et des éléments du dictionnaire
- Afficher les enregistrements du dictionnaire au formulaire
- Ajouter des objets de classe en tant qu'éléments de dictionnaire
- Mettre à jour l'élément du dictionnaire d'objets de classe sur le formulaire