formateur informatique

Obtenir tous les noms des champs de tables en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Obtenir tous les noms des champs de tables en VBA 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    Vidos astuces Instagram
Sujets que vous pourriez aussi aimer :


Parcourir les champs d'une table

Avec l'astuce VBA Access précédente, nous avons appris à parcourir tous les enregistrements d'une table, en les restituant progressivement sur un formulaire, les uns en dessous des autres. Ici, nous récidivons pour apprendre à parcourir tous les champs d'une table par le code VBA.

Parcourir les champs d-une table Access par le code VBA

Sur l'exemple illustré par la capture, l'utilisateur clique sur un bouton de formulaire, placé à droite d'une zone de texte multiligne. Et aussitôt, les noms des champs d'une table ciblée apparaissent effectivement et progressivement les uns en-dessous des autres.

Base de données Access à télécharger
Pour la découverte de cette nouvelle astuce VBA Access, nous proposons de récupérer une base de données hébergeant ce formulaire.
  • Télécharger le fichier compressé parcourir-champs-table.rar en cliquant sur ce lien,
  • Puis, le décompresser dans le dossier de votre choix,
  • Ensuite, double cliquer sur le fichier résultant pour l'ouvrir dans Access,
  • Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
  • Dans le volet de navigation sur la gauche, double cliquer sur le formulaire fParcourir,
Ainsi, nous l'affichons en mode exécution. Mais bien sûr à ce stade, si vous cliquez sur le bouton Récupérer, rien ne se produit encore.

Déclencher un code VBA au Clic
Nous devons commencer par associer une procédure VBA au bouton lorsque l'utilisateur clique dessus.
  • 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 Récupérer pour le sélectionner,
  • Puis, activer l'onglet Evénement de sa feuille de propriétés,
Si elle n'est pas visible dans votre environnement, vous pouvez l'afficher en cliquant sur le bouton Feuille de propriétés dans le ruban Conception de formulaires ou Création pour les versions plus anciennes.
  • Dès lors, cliquer sur le petit bouton de son événement Au clic,
  • Dans la boîte de dialogue qui suit, choisir le Générateur de code et valider par Ok,
De fait, nous basculons dans l'éditeur VBA Access entre les bornes de la procédure événementielle recuperer_Click. Son code se déclenchera au clic sur le bouton.

La déclaration des variables
Comme il est de coutume, nous devons maintenant enchaîner avec la déclaration des variables nécessaires au développement. Et parmi elles figurent des variables d'objets de base de données.
  • Dans les bornes de la procédure, ajouter les déclarations et affectations suivantes :
...
Dim base As Database: Dim table As TableDef
Dim champ As Field
Dim debut: Dim compteur As Byte

donnees.Value = "": compteur = 0
...


Les trois premières variables sont des variables objets de base de données. La première est nommée base et elle est déclarée comme un objet de type Database. Son rôle est de prendre possession de la base de données en cours pour piloter ses éléments. Mais pour cela, encore faut-il que nous instanciions cette classe qui nous permettra d'hériter des propriétés et méthodes nécessaires. La deuxième est typée comme un objet TableDef. Elle doit piloter une table à définir. La troisième est typée comme un Field pour piloter les champs de cette table à définir. Enfin, la variable debut non typée doit prélever l'indice de temps grâce à la fonction Timer. L'objectif est de restituer les informations parcourues à intervalles de temps réguliers. La variable compteur doit cumuler les champs dénombrés pour livrer une information de synthèse. C'est la raison pour laquelle elle est typée comme un entier court (Byte).

Ensuite, par affectations, nous vidons la zone de texte multiligne (donnees.Value = "") si d'aventure d'autres essais avaient été réalisés en amont. Et nous initialisons le compteur sur une valeur nulle tant qu'aucun champ n'a encore été dénombré.

Piloter les objets de base de données
Il est temps d'affecter les objets de base de données pour piloter la base en cours et accéder aux informations de ses tables.
  • A la suite du code de la procédure, ajouter les deux initialisations suivantes :
...
Set base = CurrentDb()
Set table = base.TableDefs("Parc")
...


Avec la fonction CurrentDb, nous instancions (Set) la classe permettant d'hériter des propriétés et méthodes pour piloter la base de données en cours. Et pour preuve sur la ligne qui suit, grâce à la propriété TableDefs, nous pointons sur la table dont le nom lui est passé en paramètre. De fait et désormais, la variable table pointe sur cette table avec pour elle aussi, les propriétés et méthodes nécessaires pour la piloter.

Parcourir tous les champs d'une table
C'est maintenant une boucle For Each qui doit permettre de dénouer le problème qui suit. Son rôle est de parcourir chaque objet enfant, soit chaque champ ici, d'un objet parent donc de la table précédemment pointée en l'occurrence.
  • A la suite de la procédure, ajouter les instructions VBA suivantes :
...
For Each champ In table.Fields

Next champ

base.Close

Set table = Nothing
Set base = Nothing
...


Dans une boucle For Each, chaque élément à gauche de l'instruction (champ de type Field) doit être du même type que l'élément à droite (table.Fields). C'est la raison pour laquelle, nous exploitons la collection Fields de l'objet table afin de parcourir tous ses champs un à un. Juste après la boucle et par anticipation, soit une fois que le traitement sera terminé, nous fermons la base de données (Close) et détruisons ses objets (Nothing) pour libérer la mémoire.

Lister les noms des champs
A chaque passage dans cette boucle, nous devons maintenant récupérer chaque nom de champ en cours d'analyse pour les restituer dans la zone de texte multiligne, les uns en en-dessous des autres.
  • Pour cela, dans les bornes de la boucle, ajouter les instructions VBA suivantes :
...
donnees.Value = donnees.Value & champ.Name & "<br />"
compteur = compteur + 1
...


Dans le contenu de la zone de texte (donnees.Value), nous associons le contenu précédent (= donnees.Value &), au nom du champ en cours d'analyse par la boucle grâce à la propriété Name (champ.Name). La balise Html (<br />) permet de réaliser un retour à la ligne pour les placer tous les uns en-dessous des autres. En effet, le format de cette zone de texte est réglé sur texte enrichi pour accepter les opérations de mise en forme et les actions au clavier. Et dans ce contexte, ces actions sont retranscrites par des balises Html comme pour les pages Web.

A ce stade, nous pouvons réaliser un essai.
  • Enregistrer les modifications (CTRL + S) et revenir sur le formulaire (ALT + Tab),
  • L'enregistrer à son tour (CTRL +S), puis l'exécuter avec la touche F5 du clavier,
  • Dès lors, cliquer sur le bouton Récupérer,
Connaître les noms des champs de tables en VBA Access

Les quatre noms de champs sont effectivement parcourus avec succès, comme vous pouvez l'apprécier.

Boucle avec temporisation
Enfin, pour une restitution progressive rendant visuellement compte du processus enclenché, nous proposons de délivrer ces noms au coup par coup. Et pour cela, dans la boucle For Each, nous devons imbriquer une boucle de temps pour marquer des temporisations entre chaque restitution. Et nous l'avions annoncé, c'est la fonction VBA Timer qui est désormais à l'honneur.
  • Dans les bornes de la boucle For Each et à la suite, insérer les instructions VBA suivantes :
...
debut = Timer
Do While Timer < debut + 0.7
DoEvents
Loop
...


Dans la variable debut et grâce à la fonction Timer, nous prélevons le temps qu'il est à la milliseconde près. De fait, le test suivant consiste à vérifier que 7 dixièmes de secondes se sont écoulés (Do While Timer < debut + 0.7). Tant que ce critère n'est pas vérifié, la fonction DoEvents est employée pour tourner dans le vide et dans le laps de temps, de rendre la main à l'utilisateur et au processeur. C'est seulement une fois ce délai passé que la boucle reprend sa marche et que le nom du champ suivant est extrait et inscrit dans la zone de texte.

Pour finir, nous devons restituer l'information de synthèse sur le nombre de champs rencontrés. Bien sûr, cette instruction ne peut intervenir que lorsque tous les champs ont été passés en revue, soit une fois la boucle terminée.
  • Après la boucle et avant la clôture des objets de BDD, ajouter les instructions VBA suivantes :
...
donnees.Value = donnees.Value & "<br />===================<br/><br />"
donnees.Value = donnees.Value & "Cette table héberge " & compteur & " champs."
...
  • Enregistrer les modifications (CTRL + S) et revenir sur le formulaire,
  • Puis, cliquer sur le bouton Récupérer,
Cette fois, les noms de champs apparaissent bien à intervalles réguliers et à l'issue, la synthèse sur le nombre total est fournie.

Dans l'une des prochaines astuces, nous verrons comment parcourir toutes les tables d'une base de données. Comme nous savons déjà parcourir tous les enregistrements et champs d'une table, nous serons donc en mesure de parcourir tous les champs et enregistrements de toutes les tables.

Le code VBA Access complet que nous avons bâti pour parcourir tous les champs de la table, est le suivant :

Private Sub recuperer_Click()
Dim base As Database: Dim table As TableDef
Dim champ As Field
Dim debut: Dim compteur As Byte

donnees.Value = "": compteur = 0

Set base = CurrentDb()
Set table = base.TableDefs("Parc")

For Each champ In table.Fields
donnees.Value = donnees.Value & champ.Name & "<br />"
compteur = compteur + 1
debut = Timer
Do While Timer < debut + 0.7
DoEvents
Loop
Next champ

donnees.Value = donnees.Value & "<br />===================<br/><br />"
donnees.Value = donnees.Value & "Cette table héberge " & compteur & " champs."

base.Close

Set table = Nothing
Set base = Nothing

End Sub


 
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