Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Trouver la table d'un champ
Avec cette nouvelle
astuce VBA Access , nous allons découvrir comment débusquer la
table hébergeant un
champ cherché par son
nom . Lorsqu'un
code VBA sait quel champ il doit engager dans une
requête SQL pour récupérer ses informations mais qu'il ne connaît pas la
table qui l'abrite, cette technique est donc essentielle.
Sur l'exemple illustré par la capture, l'utilisateur saisit le
nom d'un champ recherché dans une zone de texte, en haut du formulaire. Puis, il clique sur le
bouton intitulé
Trouver . Aussitôt, dans la grande zone du dessous, les
tables qui abritent ce
champ sont énumérées les unes sous les autres. Dans cet exemple, elles ne sont que deux.
Base de données Access à télécharger
Pour la découverte de cette astuce, nous suggérons d'appuyer l'étude sur une
base de données abritant
plusieurs tables hébergeant elles-mêmes un
certain nombre de champs .
Nous trouvons bien la zone de saisie pour le
champ de recherche , la zone de texte pour restituer le résultat et le bouton pour lancer le processus.
Code VBA au Clic
Pour commencer, nous devons associer une
procédure événementielle capable de se déclencher au clic sur le
bouton du formulaire .
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é Trouver ,
Dès lors, activer l'onglet Evénement de sa feuille de propriétés ,
Cliquer ensuite sur le petit bouton associé à son événement Au clic ,
Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
C'est ainsi que nous basculons dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle Trouver_Click . Son code se déclenchera au clic sur ce bouton.
La déclaration des variables
Pour trouver la table du
champ cherché , nous avons besoin d'un
objet pour
piloter la base de données en cours mais aussi de deux autres pour piloter respectivement les
tables et les
champs de cette
base .
Dans les bornes de la procédure, ajouter les déclarations et affectations suivantes :
...
Dim base As Database: Dim champ As Field
Dim table As TableDef: Dim leChamp As String
Set base = CurrentDb()
leChamp = nomChamp.Value
resultat.Value = "La ou les tables qui hébergent le champ : <strong>" & leChamp & "</strong><br/><br />"
...
Nous déclarons donc un objet (base) de
type base de données (Database), un autre (table) de
type table de base de données (TableDef) et un dernier (champ) de
type champ (Field). Enfin, nous déclarons une
variable de type texte (leChamp) pour prélever le
nom du champ cherché , inscrit dans la zone de texte sur le formulaire, qui est nommée
nomChamp .
Ensuite, nous initialisons (Set) l'
objet base sur la
base de données en cours grâce à la
fonction Access CurrentDb . Nous récoltons le
nom de champ saisi dans la
variable leChamp . Puis, nous amorçons le message d'accueil dans la zone de texte centrale (resultat) pour informer sur les résultats trouvés pour le champ indiqué.
Parcourir les tables de la base
Pour trouver le champ dans l'une des tables, nous devons parcourir ces dernières à l'aide d'une
boucle For Each . Pour cela, nous devons engager notre
objet table sur la
collection des tables de la
base de données en cours .
A la suite du code VBA, créer la boucle For Each suivante :
...
For Each table In base.TableDefs
Next table
...
C'est en effet la
propriété TableDefs héritée par l'
objet base qui représente la
collection des tables de la
base de données en cours .
Parcourir les champs de chaque table
Dans cette première boucle, nous devons en imbriquer une seconde. Son rôle et pour
chaque table est de
parcourir chaque champ à la recherche de correspondances avec le nom de champ inscrit sur le formulaire.
A l'intérieur de la première boucle, ajouter la seconde boucle For Each suivante :
...
For Each champ In table.Fields
Next champ
...
Cette fois, c'est la
propriété Fields héritée implicitement par l'
objet table qui représente la
collection des champs contenus dans la
table en cours d'analyse par la
première boucle For Each .
Tester les noms des champs
A chaque passage dans cette seconde boucle, nous devons confronter le
nom du champ en cours d'analyse avec celui inscrit sur le formulaire. S'ils coïncident, nous devons restituer le
nom de la table qui l'héberge, en cours d'analyse par la première boucle. Nous avons donc besoin d'enclencher une
instruction conditionnelle .
Dans cette seconde boucle For Each, créer l'instruction conditionnelle suivante :
...
If champ.Name = leChamp Then
resultat.Value = resultat.Value & "- " & table.Name & "<br />"
End If
...
C'est la
propriété Name exercée sur un
objet de type Field qui renvoie le
nom du champ . S'il correspond à celui stocké dans la
variable leChamp , alors nous ajoutons le
nom de la table parente à la suite des résultats dans la zone de texte nommée
resultat .
Décharger les objets
Avant de tester le code, nous devons détruire les objets pour libérer la mémoire de l'ordinateur.
A la fin du code VBA, après la double boucle, ajouter les instructions suivantes :
...
Next champ
Next table
base.Close
Set base = Nothing
Set table = Nothing
Set champ = Nothing
End Sub
...
La
méthode Close permet tout d'abord de
fermer la base de données exploitée en mémoire par le
code VBA . Ensuite les réinitialisations (Set) successives des
objets Ã
Nothing permettent de les détruire et donc de les sortir de la mémoire de l'ordinateur.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
L'exécuter par exemple avec la touche F5 du clavier,
Dans la zone de saisie du dessus, taper par exemple le nom de champ : Designation ,
Puis, cliquer sur le bouton Trouver ,
Comme vous pouvez le voir, deux tables ressortent. Si vous les ouvrez, vous constatez qu'elles hébergent effectivement chacune un champ ainsi nommé. Nous avons donc donné la solution pour
trouver les tables en fonction d'un
nom de champ cherché .