Access
 sql >> Base de données >  >> RDS >> Access

Tableaux d'objets de classe Ms-Access VBA

Présentation.

La semaine dernière, nous avons eu une brève introduction d'un simple objet de classe personnalisé avec seulement deux propriétés, pour Longueur et Largeur Valeurs. Une méthode de calcul de la superficie de quoi que ce soit, avec des valeurs de longueur et de largeur. J'espère que vous avez compris les bases d'un module de classe personnalisé Ms-Access. Sinon, voici le lien :Module de classe Ms-Access et VBA. Veuillez visiter la page avant de continuer.

Les objets de module de classe permettent d'économiser beaucoup de code dans vos programmes. Lorsque vous avez trouvé quelque chose que vous faites à plusieurs reprises dans Code, pensez à un objet de module de classe. Le code répétitif peut également être transformé en une fonction utilitaire, mais pour les objets de classe, vous devez adopter une approche différente.

Pour une tâche simple, il faudra peut-être plus de code pour affiner les fonctions de l'objet module de classe, mais vos programmes de modules principaux seront simples et tout le code compliqué développé et affiné restera caché aux autres.

Mais pour l'instant, nous avons un module de classe simple en main, nous allons essayer de créer un tableau d'objets pour calculer la zone de nombreux éléments.

La sous-routine ClassArray().

L'exemple de code VBA dans le module standard crée un tableau de cinq objets de la classe ClsArea et imprime leurs valeurs de propriété et le résultat de la méthode dans la fenêtre de débogage. Copiez et collez (ou mieux si vous les saisissez, pour mieux connaître chaque ligne ce qu'ils font) le code suivant dans un module standard :

Public Sub ClassArray()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
Set tmpA = Nothing 'Remove temporary object from memory.
Next


‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

Cliquez quelque part au milieu du code et appuyez sur F5 pour exécuter le code. Entrez les valeurs pour la description, la longueur et la largeur du clavier pour 5 éléments différents, l'un après l'autre.

Un exemple d'exécution du programme est donné ci-dessous :

Description   Length        Width         Area
Door Mat       5             8             40 
Carpet         12            23            276 
Bed Room       21            23            483 
Store Room     15            25            375 
Terrace        40            50            2000 

Examen du code ligne par ligne.

Examinons le code ligne par ligne. Dans la zone de déclaration, nous avons déclaré une Variable Objet tmpA de type ClsArea. Dans la deuxième ligne déclaré un Array vide CA() de type ClsArea. Le nombre d'éléments requis sera redimensionné ultérieurement dans le programme.

Dans les deux lignes suivantes, nous avons déclaré les variables title de type String et j, L, et U variables de type Entier long.

Ensuite, la variable de titre est initialisée avec la chaîne 'ClassArray' et sera utilisée comme titre dans la fonction InputBox(). Le Pour….Suivant la boucle est définie avec une variable de contrôle j exécuter la boucle cinq fois. Après les deux prochaines lignes de commentaire, le Définir instruction instancie (alloue de la mémoire) ClsArea Class Object en mémoire avec le nom tmpA .

Les trois lignes de code suivantes servent à saisir des valeurs pour strDesc , dblLength, et dblWidth Propriétés de l'objet de classe tmpA.

Après la prochaine ligne de commentaire, l'objet de classe ClsArea (CA) est redimensionné pour 1 à j fois (1 à 1 fois) en préservant les éléments Object existants, le cas échéant (il s'agit du premier objet du tableau). Cela continuera d'augmenter, grâce au ReDim , à 1 à 2, 1 à 3, 1 à 4 et 1 à 5 en préservant les valeurs d'objet précédentes, dans le For . . . Boucle suivante. La préserve Le mot clé garantit que les objets de tableau existants ne sont pas perdus.

Remarque : L'instruction Re-Dimension augmente/diminue le nombre d'éléments d'objet spécifiés mais efface les objets existants chargés dans le tableau plus tôt, sans le Preserve mot-clé.

L'ensemble l'instruction dans la ligne suivante copie l'objet tmpA, avec ses données dans le CA(j) Objet ClsArea nouvellement créé j élément de tableau.

Ligne suivante Set tmpA =Nothing supprime l'objet temporaire de la mémoire.

La boucle For…Next répète cette action quatre fois de plus pour entrer d'autres éléments dans l'objet temporaire nouvellement instancié tmpA, l'un après l'autre, et copie l'objet dans le tableau d'objets CA.

Les deux lignes suivantes, après la ligne de commentaire, trouvent la plage d'index du tableau d'objets (recherche les numéros d'index les plus bas et les plus élevés.

Le prochain Debug.Print L'instruction imprime une ligne d'en-tête dans 14 zones de colonnes dans la fenêtre de débogage. Le Pour . . . Suivant boucle avec le L et U les plages de numéros d'index de tableau liés exécutent les instructions internes pour accéder à chaque objet de Array CA, avec numéro d'index dans la variable de contrôle j.

La référence d'objet actuelle est définie dans With. . . Terminer par plutôt que de répéter le nom de l'objet CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth et CA(j).Area pour imprimer les valeurs de propriété de l'objet et les résultats de la zone de méthode() dans la fenêtre de débogage.

Supprimez le symbole de commentaire du "Stop pour créer une pause dans le programme sur l'instruction Stop. Exécutez à nouveau le code et entrez les détails de 5 éléments afin de pouvoir expérimenter avec l'objet Array. Vous pouvez adresser de manière sélective n'importe quelle propriété d'objet, avec le numéro d'index de tableau, pour modifier ou imprimer n'importe quelle valeur dans la fenêtre de débogage, comme indiqué ci-dessous.


L'instruction Set CA(j) =Nothing au sein du Pour. . . La boucle suivante efface les objets du tableau, un par un, de la mémoire.

Transmettez le tableau d'objets de classe comme paramètre de fonction.

Nous pouvons transmettre le tableau d'objets de classe en tant que paramètre à un programme, comme nous l'avons fait avec le type de données défini par l'utilisateur.

Créons un sous-programme d'impression simple, en coupant le code de section d'impression du programme principal et en le plaçant dans le nouveau programme.

Copiez le code de la sous-routine ClassArray(), collez-le dans le même module standard et changez le nom en ClassArray2(), comme indiqué ci-dessous.

Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

Le code ClassArray2 sans section d'impression.

Créez une nouvelle sous-routine comme indiqué ci-dessous :

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

End Sub

Mettez en surbrillance la section d'impression jusqu'à l'instruction "Stop" dans le programme ClassArray2(), coupez la zone de code en surbrillance et collez-la sous le Dim instructions dans ClassPrint() Programme. La version modifiée des deux codes est donnée ci-dessous :

Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea
     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

Call ClassPrint(CA) ‘Pass the Object Array to print routine

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub

Le programme ClassPrint().

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

'Printing Section
'Print the Array Contents into the Debug Window.
L = LBound(clsPrint)
U = UBound(clsPrint)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With clsPrint(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

End Sub

Vérifiez les changements de code dans les deux programmes et effectuez les corrections, le cas échéant. Cliquez au milieu du code ClassArray2() et appuyez sur F5 pour exécuter le programme.

L'instruction Call du premier programme transmet le tableau d'objets de classe CA en tant que paramètre ByRef à la sous-routine ClassPrint(). Le programme imprime les propriétés de l'objet et appelle la fonction Area() pour calculer et renvoyer la valeur à imprimer.

La semaine prochaine, nous apprendrons à utiliser notre module de classe ClsArea en tant que classe de base pour créer un nouvel objet de classe VBA afin de calculer le volume de quelque chose.

  1. Module de classe MS-Access et VBA
  2. Tableaux d'objets de classe MS-Access VBA
  3. Classe de base MS-Access et objets dérivés
  4. Classe de base VBA et objets dérivés-2
  5. Classe de base et variantes d'objets dérivés
  6. Ensemble d'enregistrements et module de classe MS-Access
  7. Accéder au module de classe et aux classes wrapper
  8. Transformation des fonctionnalités de la classe wrapper
  9. Ms-Access et les bases des objets de collection
  10. Module de classe MS-Access et objet de collection
  11. Enregistrements de table dans l'objet et le formulaire de collection
  12. Principes de base des objets de dictionnaire
  13. Principes de base des objets de dictionnaire -2
  14. Tri des clés d'objet et des éléments du dictionnaire
  15. Afficher les enregistrements du dictionnaire au formulaire
  16. Ajouter des objets de classe en tant qu'éléments de dictionnaire
  17. Mettre à jour l'élément du dictionnaire d'objets de classe sur le formulaire