Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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,
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.
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,
- 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.
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.
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...,
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: <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.