Présentation.
Il arrive parfois qu'un module de classe particulier doive être instancié plus d'une fois, pour utiliser un ensemble de valeurs similaire pour une application particulière.
Par exemple, notre module de classe ClsArea, que nous avons conçu pour calculer la surface de moquette des chambres, est un candidat pour des applications similaires. Supposons que nous aimerions savoir combien de carreaux de sol nous devons poser dans une pièce, nous devrions également pouvoir saisir les valeurs de longueur et de largeur de Tile, en plus des valeurs de dimension de Floor. Étant donné que Floor et Tile ont des valeurs de propriété similaires en entrée, nous pouvons utiliser deux instances du module de classe ClsArea, une instance pour la zone FLOOR et la seconde pour la zone TILE. Floor-Area / Tile-Area donne le nombre total de tuiles pour une pièce particulière.
Deux instances du même module de classe.
Nous pouvons le faire en créant deux instances différentes du module de classe ClsArea dans le programme de module standard s'il n'y a qu'une seule pièce.
Public Sub FloorTiles() Dim FLOOR As ClsArea Dim TILES As ClsArea Dim flrArea As Double, tilearea As Double Dim lngTiles As Long Set FLOOR = New ClsArea Set TILES = New ClsArea FLOOR.strDesc = "Bed Room1" FLOOR.dblLength = 25 FLOOR.dblWidth = 15 flrArea = FLOOR.Area() TILES.strDesc = "Off-White" TILES.dblLength = 2.5 TILES.dblWidth = 1.25 tilearea = TILES.Area() lngTiles = flrArea / tilearea Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc Set FLOOR = Nothing Set TILES = Nothing End Sub
Manipulation d'un tableau d'objets.
Mais que se passe-t-il si nous devons appliquer la méthode ci-dessus pour un ensemble de plusieurs pièces avec différentes tailles ou couleurs de carreaux ? La réponse à cela est de créer un nouveau module de classe avec deux instances du même ClsArea Classe, une instance pour Floor, et l'autre pour les tuiles Propriétés. Les deux instances sont enveloppées dans un nouveau module de classe.
Laissez-nous faire.
- Ouvrez votre base de données et affichez la fenêtre d'édition de code (ALT+F11).
- Sélectionnez le module de cours de Insérer menu.
- Modifier le nom Valeur de la propriété à ClsTiles .
- Copiez et collez le code VBA suivant dans le module de classe ClsTiles et enregistrez le code :
Option Compare Database Option Explicit Private pFLOOR As ClsArea Private pTILES As ClsArea Private Sub Class_Initialize() Set pFLOOR = New ClsArea Set pTILES = New ClsArea End Sub Private Sub Class_Terminate() Set pFLOOR = Nothing Set pTILES = Nothing End Sub Public Property Get Floor() As ClsArea Set Floor = pFLOOR End Property Public Property Set Floor(ByRef NewValue As ClsArea) Set pFLOOR = NewValue End Property Public Property Get Tiles() As ClsArea Set Tiles = pTILES End Property Public Property Set Tiles(ByRef NewValue As ClsArea) Set pTILES = NewValue End Property Public Function NoOfTiles() As Long NoOfTiles = pFLOOR.Area() / pTILES.Area() End Function
Les deux instances, pFLOOR et pTILES sont déclarées comme propriétés privées de l'objet de classe ClsTiles.
Le Class_Initialize() La sous-routine instancie les deux objets en mémoire lorsque le ClsTiles Le module de classe est instancié dans le programme utilisateur.
Le Class_Terminate() La sous-routine supprime les deux instances (pFLOOR et pTILES) de la mémoire lorsque l'instance du module de classe ClsTiles est définie sur Nothing dans le programme utilisateur.
Le Obtenir et Définir Les procédures de propriété permettent la récupération et l'affectation de valeurs, depuis et vers l'instance pFLOOR respectivement, dans l'objet de classe ClsTiles.
La prochaine procédure de propriété Get et Set permet les mêmes opérations dans l'instance pTILES de la classe ClsArea.
Nous avons ajouté une nouvelle fonction NoOfTiles() dans le nouveau module de classe, pour calculer le nombre de tuiles, en fonction de la surface au sol et de la dimension des tuiles.
Écrivons un programme et apprenons l'utilisation de plusieurs instances du même objet de classe, dans un nouveau module de classe :ClsTiles.
- Copiez et collez le code VBA suivant dans un module standard :
Public Sub TilesCalc() Dim FTiles As ClsTiles Dim TotalTiles As Long Set FTiles = New ClsTiles FTiles.Floor.strDesc = "Warehouse" FTiles.Floor.dblLength = 100 FTiles.Floor.dblWidth = 50 FTiles.Tiles.dblLength = 2.5 FTiles.Tiles.dblWidth = 1.75 TotalTiles = FTiles.NoOfTiles() Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles" Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles End Sub
- Gardez la fenêtre de débogage ouverte (CTRL+G) pour imprimer les données de test.
- Cliquez quelque part au milieu du code VBA et appuyez sur F5 Clé pour exécuter le code. Le résultat est imprimé sur la fenêtre de débogage.
Si vous souhaitez calculer les besoins en carreaux de plusieurs pièces ou pièces de plusieurs étages d'un immeuble de grande hauteur, vous devez exécuter le programme ci-dessus plusieurs fois et noter les valeurs, ce qui est pratiquement très difficile.
Recherche des besoins en carrelage de plusieurs pièces.
Maintenant, écrivons un autre programme pour trouver les exigences en tuiles de plusieurs pièces, avec un tableau de ClsTiles Objets en saisissant les valeurs de propriété directement à partir du clavier.
- Copiez et collez le code VBA suivant dans un module standard.
Public Sub TilesCalc2() Dim tmpFT As ClsTiles Dim FTiles() As ClsTiles Dim j As Long, L As Long, H As Long For j = 1 To 3 Set tmpFT = New ClsTiles 'Floor dimension With tmpFT.Floor .strDesc = InputBox(Str(j) & ") Floor Desc", , 0) .dblLength = InputBox(Str(j) & ") Floor Length", , 0) .dblWidth = InputBox(Str(j) & ") Floor Width", , 0) End With 'Tile Dimension With tmpFT.Tiles .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0) .dblLength = InputBox(Str(j) & ") Tile Length", , 0) .dblWidth = InputBox(Str(j) & ") Tile Width", , 0) End With ReDim Preserve FTiles(1 To j) As ClsTiles Set FTiles(j) = tmpFT Set tmpFT = Nothing Next 'Take Printout L = LBound(FTiles) H = UBound(FTiles) Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles" For j = L To H With FTiles(j) Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles End With Next 'Remove all objects from memory For j = L To H Set FTiles(j) = Nothing Next End Sub
- Gardez la fenêtre de débogage ouverte pour y imprimer la sortie.
- Exécutez le code comme avant et entrez les valeurs pour les dimensions du sol et des carreaux pour trois pièces.
Comme vous pouvez le voir dans le code ci-dessus, les deux valeurs des dimensions Room et Tile vont dans la même instance Class Object Array, côte à côte.
Le programme ci-dessus est une démo qui ne s'exécute que pour trois ensembles de valeurs dans For. . . Boucle suivante. Il peut être modifié avec une boucle conditionnelle qui s'exécute le nombre de fois requis jusqu'à ce qu'un code d'arrêt conditionnel mette fin au programme.
Le programme peut être modifié pour enregistrer chaque ensemble de valeurs de données et de résultats de calcul dans un tableau pour référence future.
Une Classe Wrapper est un Conteneur Classe pour les instances d'autres classes, structures de données ou collection d'instances d'autres objets. Ici, nous l'avons utilisé pour contenir deux instances de la même classe Object.
Liste de tous les liens sur ce sujet.
- 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
- 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