Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer : 
Noms des tables d'une base externe 
Nous avons déjà appris à récolter les 
noms des tables  et des 
requêtes  d'une 
base de données . Mais c'est sur la 
base active  que nous avions entrepris ces démonstrations. Ici, nous souhaitons apporter la solution pour récupérer les 
noms des tables  d'une 
base de données externe . L'intérêt est multiple. Notamment, quand il est question de récupérer les informations d'une 
autre base de données , il faut d'abord connaître les 
tables  qui la composent.
Base de données Access à télécharger 
Pour développer cette solution, nous proposons d'appuyer l'étude sur une 
base de données Access  offrant un 
formulaire  et une 
amorce de code VBA .
Il est composé d'une 
zone de texte  horizontale, de 
deux zones de liste  et de 
deux boutons .
A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage , 
Dans les propositions, choisir le mode Création , 
La 
zone de texte  doit récolter le 
chemin d'accès à la base de données externe  à analyser. Elle est nommée 
nomBdd . Les 
deux zones de liste  doivent récolter respectivement les 
noms des tables  et des 
requêtes  de la 
base de données  désignée. Elles se nomment 
listeTables  et 
listeRequetes . Le premier des deux boutons affiche déjà une boîte de dialogue standard, au clic de l'utilisateur. Vous pouvez le constater en exécutant le formulaire. Elle doit servir à désigner un 
fichier de base de données  à étudier. C'est ce 
code VBA  qui est déjà en place.
Boîte de dialogue d'ouverture 
Nous proposons de découvrir ce code VBA à enrichir.
Sur le formulaire, cliquer sur le bouton intitulé Ouvrir  pour le sélectionner, 
Activer ensuite l'onglet Evénement  de sa feuille de propriétés , 
Puis, cliquer sur le petit bouton associé à son évènement Au clic , 
C'est ainsi que nous basculons dans l'
éditeur VBA Access  entre les bornes de la 
procédure événementielle ouvrir_Click . Nous y découvrons la présence du code permettant l'affichage de la 
boîte de dialogue standard . Nous déclarons tout d'abord un 
objet de type FileDialog  pour instancier la classe dédiée. Puis, nous réalisons cette instanciation (Set boiteD) de manière à pouvoir piloter une 
boîte de dialogue d'ouverture de fichiers  (Application.FileDialog(msoFileDialogOpen)). Il est à noter que cette instanciation est rendue possible par l'ajout en amont d'une 
librairie  bien spécifique au projet : 
Microsoft Office 16.0 Object Library . Vous pouvez le constater en cliquant sur la 
rubrique Références  dans le 
menu Outils , en haut de l'éditeur.
Ensuite, nous déclenchons l'affichage de cette boîte de dialogue (boiteD.Show). Puis, nous récupérons dans la 
variable chemin  (boiteD.SelectedItems(1)), le 
chemin d'accès  au 
fichier de la base de données  sélectionné par l'utilisateur. Si ce chemin n'est pas vide (If chemin <> "" Then), alors nous entreprenons la suite du traitement. Dès lors, nous stockons ce chemin dans la zone de texte, en haut du formulaire (nomBdd.Value = chemin).
Les variables 
Pour débuter, 
trois variables  sont nécessaires. Il s'agit en réalité de 
trois objets . Le premier doit servir à prendre possession de la 
base de données externe . Les deux suivants doivent représenter respectivement une 
table  et une 
requête  dans cette base.
Dans la partie déclarative, ajouter les déclarations suivantes :  
Private Sub ouvrir_Click() 
Dim boiteD As FileDialog: Dim chemin As String 
Dim base As Database: Dim table As TableDef: Dim requete As QueryDef  
Set boiteD = Application.FileDialog(msoFileDialogOpen) 
... 
Nous déclarons l'
objet base  comme un 
Database , soit un 
objet de base de données . Puis, nous déclarons l'
objet table  pour représenter une 
table  (TableDef) et l'
objet requete  pour représenter une 
requête  (QueryDef). En effet, dans un cas comme dans l'autre, pour dresser les listes de ces éléments, il est question de les parcourir.
Piloter la base de données choisie 
Maintenant, nous devons initialiser l'
objet base  sur la 
base de données  choisie par l'utilisateur par le biais de la boîte de dialogue.
Dans l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :  
... 
If chemin <> "" Then 
nomBdd.Value = chemin 
listeTables.RowSource = "": listeRequetes.RowSource = "" 
Set base = OpenDatabase(chemin)  
... 
Tout d'abord, nous vidons les deux zones de liste pour les purger des précédentes importations avant de procéder aux nouvelles. Pour cela, nous réinitialisons leur 
propriété RowSource  sur une chaîne vide (""). Puis, nous exploitons la 
fonction OpenDatabase  pour initialiser (Set) l'
objet base  sur la 
base de données sélectionnée  avec la boîte de dialogue.
Les tables de la base externe 
Maintenant que l'
objet base  est initialisé, il dispose de toutes les propriétés et méthodes pour piloter la 
base de données choisie . Pour récolter 
tous les noms de tables  de cette 
base externe , nous devons 
parcourir sa collection TableDefs  grâce à notre 
objet table  du même type (As TableDef), impliqué dans une 
boucle For Each .
A la suite dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :  
... 
Set base = OpenDatabase(chemin) 
For Each table In base.TableDefs 
If Left(table.Name, 4) <> "MSys" And Left(table.Name, 1) <> "~" Then 
listeTables.AddItem table.Name 
End If 
Next table  
End If 
... 
Grâce à notre 
objet  nommé 
table , nous parcourons 
chaque table  (For Each table) dans (In) la 
collection des tables  de la 
base externe  (base.TableDefs). Si le nom en cours d'analyse n'est pas préfixé des quatre premiers caractères 
MSys  (Left(table.Name, 4) <> "MSys"), signifiant qu'il ne s'agit pas d'une 
table système  et (And) si la première lettre en préfixe n'est pas un 
tilda  (Left(table.Name, 1) <> "~"), signifiant qu'il ne s'agit pas d'une table temporaire, alors nous ajoutons son nom dans la zone de liste à la suite des autres (listeTables.AddItem table.Name).
Les requêtes de la base externe 
Ensuite, pour récolter les 
noms des requêtes de la base externe , le principe est le même, à deux détails près. Il n'existe pas de requêtes système. Et ce n'est plus la collection des tables que nous devons parcourir mais la collection des requêtes (QueryDefs).
A la suite du code dans l'instruction conditionnelle, ajouter la nouvelle boucle For Each  :  
... 
Next table 
For Each requete In base.QueryDefs 
If Left(requete.Name, 1) <> "~" Then listeRequetes.AddItem requete.Name 
Next requete  
End If 
... 
Là encore et tout de même, avant d'ajouter le nom de la requête en cours d'analyse dans la zone de liste (listeRequetes.AddItem), nous nous assurons qu'il ne s'agit pas d'une requête temporaire (Left(requete.Name, 1) <> "~").
Détruire les objets de programmation 
Pour terminer et comme toujours, à l'issue du traitement, nous devons détruire les objets qui ne sont plus utilisés.
Pour cela, après l'instruction conditionnelle, ajouter les lignes VBA suivantes :  
... 
End If 
base.Close 
Set base = Nothing 
Set table = Nothing 
Set requete = Nothing  
End Sub 
... 
Nous fermons l'
objet base  grâce à sa 
méthode Close . Puis, nous détruisons les trois objets en les réinitialisant (Set) à 
Nothing . C'est ainsi que nous les libérons de la mémoire de l'ordinateur.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire Access (ALT + Tab), 
L'exécuter par exemple avec la touche F5 du clavier, 
Cliquer sur le bouton Ouvrir, 
Dans la boîte de dialogue, double cliquer sur une base de données de votre choix,  
De retour sur le formulaire, vous avez le plaisir de constater que toutes les tables et requêtes composant cette base de données a priori inconnue, sont listées dans les zones de liste prévues à cet effet. Voilà une démarche intéressante que nous exploiterons quand il sera question d'attaquer une base de données à la structure inconnue pour en extirper les informations. Car vous le savez, pour récolter les données des enregistrements, il faut parcourir les tables de la base de données. Et pour parcourir ces tables, faut-il encore connaître leurs noms pour les piloter par 
syntaxe SQL .