formateur informatique

Compter tous les objets d'une base de données Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Compter tous les objets d'une base de données Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Compter tous les objets d'une BDD

Avec cette nouvelle astuce VBA Access, nous allons apprendre à compter tous les objets composant une base de données et ce, avec grande simplicité. Mais nous allons le découvrir, pour les tables et les requêtes, un ajustement par le code VBA sera nécessaire. Quoiqu'il en soit, ce principe est intéressant quand il est question de parcourir ou de questionner les différents éléments d'une base de données, en fonction de leurs catégories.

Base de données Access à télécharger
Pour le développement de cette nouvelle astuce, nous suggérons d'appuyer les travaux sur une base de données hébergeant de nombreux objets comme des tables, des requêtes ou encore des macros. En consultant le volet de navigation sur la gauche de l'écran, vous remarquez que cette base de données est effectivement constituée d'un grand nombre d'objets. On note la présence de tables, de requêtes, de formulaires, d'une macro et d'un module VBA. Seuls les états manquent à l'appel.
  • Dans ce volet de navigation, double cliquer sur le formulaire F_trouver pour l'exécuter,
Formulaire Access pour compter les objets de la base de données

Ce formulaire est doté d'une grande zone de texte paramétrée avec le format texte enrichi pour permettre quelques facéties de mise en forme, grâce à des balises Html. Cette zone se nomme liste. Le bouton intitulé Fermer permet simplement de fermer le formulaire. Le bouton intitulé Lister doit dresser le décompte de tous les objets par catégorie dans cette zone de texte enrichi. Il est déjà associé à une procédure événementielle pour déclencher un code VBA au clic. Mais elle est fort naturellement encore vide à ce stade. Nous proposons de le constater.

L'objet CurrentDb
VBA Access offre l'objet CurrentDb. Celui-ci pointe sur la base de données en cours. Il la chapote. En conséquence, il permet d'atteindre ses objets enfants par voie hiérarchique, comme ses tables et ses requêtes.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode création,
  • Sur le formulaire en conception, cliquer sur le bouton intitulé Lister pour le sélectionner,
  • Activer alors l'onglet Evénement de sa feuille de propriétés,
  • Puis, cliquer sur le petit bouton associé à son événement Au clic,
Comme une procédure lui est déjà attachée, nous basculons directement dans l'éditeur VBA Access entre les bornes de cette dernière. Elle se nomme lister_Click. Son code se déclenchera au clic sur ce bouton nommé lister.
  • Dans la procédure événementielle, ajouter les instructions VBA suivantes :
...
liste.Value = ""

liste.Value = liste.Value & "Nombre de tables : " & CurrentDb.TableDefs.Count & " (Avec tables système)"
liste.Value = liste.Value & "<br />Nombre de requêtes : " & CurrentDb.QueryDefs.Count & " (Avec requêtes temporaires)"
...


Nous réinitialisons tout d'abord le contenu de la zone de texte enrichi (liste.Value= "") pour la purger d'un potentiel précédent décompte. La propriété TableDefs de l'objet CurrentDb représente la collection des tables dans la base de données en cours. La propriété QueryDefs représente la collection de ses requêtes. C'est ainsi et dans les deux cas que la méthode enfant Count renvoie respectivement le nombre de tables et le nombre de requêtes, présentes dans cette base de données. Vous notez l'emploi de la balise Html <br /> pour créer un saut de ligne entre les deux informations.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
  • Puis, l'exécuter par exemple avec la touche F5 du clavier,
  • Dès lors, cliquer sur le bouton intitulé Lister,
Les décomptes sont a priori correctement retournés, mais en apparence seulement.

Compter les tables et requêtes de la base de données en VBA Access

Si vous consultez le volet de navigation sur la gauche, vous dénombrez 8 tables alors que notre code VBA en compte 23. De même, il compte 57 requêtes alors qu'elles ne sont en réalité que 43. Cela tient à la présence des tables système et des requêtes temporaires qui sont des objets masqués pour l'utilisateur mais pas pour le code VBA. Nous proposons de le constater.
  • Cliquer droit sur la barre de titre du volet de navigation,
  • Dans le menu contextuel, choisir la commande Options de navigation,
  • En bas de la boîte de dialogue qui suit, cocher la case : Afficher les objets système,
  • De même, cocher la case : Afficher les objets masqués,
Afficher les objets masqués et les tables système dans Access
  • Cliquer sur le bouton Ok pour revenir sur le formulaire,
Maintenant, si vous consultez la section des tables en haut du volet de navigation, vous remarquez l'apparition d'un nombre conséquent de nouvelles tables.

Afficher les tables du système dans le volet de navigation Access

Elles sont toutes préfixées du terme MSys. Il s'agit des tables système. Si vous les intégrez au décompte, vous tombez bien sur le même résultat que le code VBA, soit 23 tables. Nous verrons dans un deuxième temps comment contourner ce défaut, pour réajuster les décomptes sur les tables et requêtes utilisateur effectivement présentes dans cette base de données.

L'objet CurrentProject
A l'instar de l'objet CurrentDb, Access offre l'objet CurrentProject. Vous l'avez compris, il désigne le projet en cours. Et c'est grâce à lui que nous pouvons atteindre les collections de tous les autres objets.
  • A la suite du code VBA, ajouter les instructions VBA suivantes :
...
liste.Value = liste.Value & "<br />Nombre de formulaires :" & CurrentProject.AllForms.Count
liste.Value = liste.Value & "<br />Nombre d'états : " & CurrentProject.AllReports.Count
liste.Value = liste.Value & "<br />Nombre de macros : " & CurrentProject.AllMacros.Count
liste.Value = liste.Value & "<br />Nombre de modules VBA :" & CurrentProject.AllModules.Count
...


Ce sont donc les propriétés AllForms, AllReports, AllMcros et AllModules qui représentent respectivement la collection des formulaires dans l'application en cours, celle des états ainsi que celle des macros et celle des modules. Et comme précédemment, c'est la propriété Count qui permet de les dénombrer.

Maintenant, si vous cliquez de nouveau sur le bouton Lister du formulaire, vous constatez que nous obtenons bien les renseignements demandés. Nous en savons donc un peu plus sur cette base de données et avec plus de précision. Et cette fois, tous les nouveaux décomptes sont justes.

Compter tous les objets de la base de données Access

Nous pourrions d'ailleurs exploiter ces collections pour questionner une base de données distante et connaître les objets qu'elle embarque. Pour cela et comme nous l'avons démontré à l'occasion d'astuces précédentes, il faut instancier une classe d'Access. Cette instanciation livre à l'objet toutes les propriétés et méthodes pour piloter cette base externe.

Compter sans les objets masqués
Maintenant, nous souhaitons revenir sur les deux dénombrements faussés, ceux des tables et des requêtes, en raison de la présence d'objets masqués. La propriété Count ne peut pas être paramétrée pour les ignorer. En conséquence, l'idée consiste à parcourir chacune de ces deux collections grâce à des boucles For Each, pour tester les préfixes des noms d'objets tour à tour et les exclure du décompte s'ils correspondent à des objets masqués.

Pour animer ces boucles, nous avons besoin d'objets représentant les tables et les requêtes. Pour piloter ces objets particuliers, nous avons besoin d'ajouter une référence au projet.
  • En haut de l'éditeur VBA Access, cliquer sur le menu Outils,
  • En haut de la liste des propositions, choisir l'option Références,
  • Dans la boîte de dialogue, cocher la case : Microsoft Office 16.0 Access database engine...,
Ajouter la référence à Access dans le projet pour piloter tous les objets de la base de données

C'est cette classe qui permet de piloter tous les objets d'une base de données Access. Le numéro (16.0 ici) dépend de la version d'Office installée sur votre ordinateur.
  • Valider cette intégration par le bouton Ok,
Maintenant que cette classe est ajoutée au projet, nous pouvons notamment déclarer les objets pour piloter les tables et les requêtes.
  • En haut de la procédure de code, ajouter les instructions VBA suivantes :
Private Sub lister_Click()
Dim table As TableDef: Dim requete As QueryDef
Dim compteur As Byte


liste.Value = "": compteur = 0
...


Nous déclarons donc les objets table et requete, respectivement comme une table au sens large (TableDef) et comme une requête au sens large (QueryDef). Puis, nous déclarons la variable compteur comme un entier court. Nous l'utiliserons pour dénombrer les tables et requêtes effectives dans cette base de données.

Parcourir toutes les tables
Maintenant que nous disposons des outils nécessaires, nous pouvons engager la première boucle For Each destinée à parcourir toutes les tables de la base de données en cours.
  • Après les affectations, ajouter les instructions VBA suivantes :
...
liste.Value = "": compteur = 0

For Each table In CurrentDb.TableDefs
If (Left(table.Name, 4) <> "MSys") Then compteur = compteur + 1
Next table

liste.Value = "Nombre de tables : <strong>" & compteur & "</strong>"

...


Nous parcourons donc chaque table (For Each table) dans (In) la collection des tables (CurrentDb.TableDefs) de la base de données en cours. Pour chacune et grâce à la fonction Left, nous testons (If) si les quatre premières lettres (4) ne correspondent pas (<>) à la suite des lettres d'une table système ("MSys"). Si ce test est un succès (Then), nous en déduisons qu'il s'agit d'une table effective et nous l'ajoutons au décompte (compteur = compteur + 1).

Parcourir les requêtes
Désormais, nous devons faire de même avec les requêtes. Mais le préfixe est différent pour les requêtes temporaires. Il ne concerne que le premier caractère. Nous devons vérifier s'il s'agit d'un tilda (~).
  • A la suite des précédentes instructions, ajouter les lignes VBA suivantes :
...
liste.Value = "Nombre de tables : <strong>" & compteur & "</strong>"

compteur = 0
For Each requete In CurrentDb.QueryDefs
If (Left(requete.Name, 1) <> "~") Then compteur = compteur + 1
Next requete

liste.Value = liste.Value & "<br />Nombre de requêtes:&nbsp;<strong>" & compteur &"</strong><br /><br />"

...


Nous réinitialisons tout d'abord le compteur (compteur = 0). Nous parcourons ensuite toutes les requêtes (For Each requete) dans la collection des requêtes de la base de données en cours (In CurrentDb.QueryDefs). Cette fois, nous réalisons le test d'inégalité sur le premier caractère (Left(requete.Name, 1)). S'il ne s'agit pas d'un tilda (<> "~"), nous en déduisons (Then) que la requête est effective et nous l'ajoutons au décompte (compteur =compteur + 1). Notez enfin l'emploi de la balise Html Strong pour passer en gras l'information numérique sur le décompte.

Maintenant, si vous cliquez de nouveau sur le bouton Lister du formulaire, vous avez le plaisir de constater que tous les dénombrements sont justes, bien que nous ayons aussi conservé les anciennes statistiques sur les tables et les requêtes.

Compter les nombres de tables et de requêtes utilisateur dans la base de données Access en VBA

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn