formateur informatique

Accéder aux tables d'une base de données Access externe

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Accéder aux tables d'une base de données Access externe
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    Vidéos astuces Instagram
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. Formulaire Access pour récupérer les noms des tables depuis une autre base de données

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,
Importer les noms des tables et requêtes d-une base de données Access externe

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.

 
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