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 .