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