formateur informatique

Noms des tables et requêtes d'une autre base de données

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Noms des tables et requêtes d'une autre base de données
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 :


Tables d'une autre base de données

Avec le volet précédent, nous avons appris à récolter tous les noms de bases de données externes d'un dossier précis par le code VBA Access, pour les afficher sur un formulaire. Ici, nous poursuivons le développement de l'application tendant à démontrer que nous sommes en mesure d'accéder à toutes les ressources de ces fichiers externes.

Listes des tables et requêtes d-une autre base de données en VBA Access

Sur l'exemple illustré par la capture, depuis un formulaire, l'utilisateur clique tout d'abord sur un petit bouton matérialisé par l'icône d'un dossier. Il affiche ainsi une boîte de dialogue Office Standard. Grâce à elle, il désigne un dossier contenant des bases de données Access. A validation, il obtient la liste de tous les noms de ces bases de données dans une première zone de liste, placée sur la gauche du formulaire. Dès lors, s'il clique sur l'une de ces bases de données, le code VBA l'analyse pour extraire tous les noms de ses tables et requêtes dans deux autres zones de liste, placées sur la droite. Dans un prochain volet, nous verrons comment récolter ses formulaires et états.

Base de données Access à télécharger
Mais avant cela et pour résoudre ce cas, nous proposons de récupérer les travaux du volet précédent qui avaient consisté à récolter les noms des bases de données hébergées par un dossier précis.
  • Télécharger le fichier compressé tables-requetes-bdd-externe.rar en cliquant sur ce lien,
  • Le décompresser dans le dossier de votre choix,
  • Double cliquer sur le fichier résultant pour l'ouvrir dans Access,
  • Cliquer ensuite sur le bouton Activer le contenu du bandeau de sécurité,
  • Puis, dans le volet de navigation, double cliquer sur le formulaire fParcourir pour l'exécuter,
Lister les noms de bases de données externes sur un formulaire VBA Access

Maintenant, si vous cliquez sur le petit bouton à l'icône du dossier et que vous désignez un dossier hébergeant des bases dans la boîte de dialogue qui suit, vous récoltez tous les noms de ces bdd dans la première zone de liste du formulaire. Ce sont les travaux que nous avons aboutis à l'occasion du volet précédent. Mais à ce stade bien sûr, si vous cliquez sur l'un de ces noms de base de données dans la première liste, aucune extraction de ses noms de tables et requêtes ne se produit encore.

Les objets de base de données
Pour accéder aux objets des bases de données externes par le code VBA Access, nous avons tout d'abord besoin de déclarer une variable objet représentant une autre instance d'Access. Pour cela, cet objet devra instancier sa classe. Et sur ce dernier, nous avons besoin de déclarer des objets représentant respectivement une table et une requête de cette base de données externe. C'est ainsi que nous pourrons les parcourir toutes pour les restituer dans les zones de liste.
  • 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 la première zone de liste pour la sélectionner,
Comme l'indique sa feuille de propriétés, ce contrôle se nomme lesBases. Celles de réception pour accueillir les noms des tables et requêtes, se nomment respectivement lesTables et lesRequetes.
  • Activer l'onglet Evénement de sa feuille de propriétés,
  • Puis, cliquer sur le petit bouton associé à son événement Au clic,
  • Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par Ok,
Ainsi, nous basculons dans l'éditeur VBA Access entre les bornes de la procédure événementielle lesBases_Click. Son code se déclenchera dès que l'utilisateur cliquera sur l'un des noms de bases de données, récoltés dans cette première zone de liste déroulante.

Juste en-dessous, vous notez la présence de la procédure parcourir_Click. Nous l'avons développée à l'occasion du volet précédent pour justement récolter tous ces noms de bases de données, hébergées par un dossier choisi par l'utilisateur.
  • Dans la procédure lesBases_Click, ajouter les déclarations de variables suivantes :
...
Dim autreBdd As Access.Application
Dim chemin As String: Dim nomFichier As String
Dim table As TableDef: Dim requete As QueryDef
Dim i As Integer
...


Nous déclarons la variable autreBdd comme un objet de type Access.Application. Mais nous le verrons, pour piloter une base externe, elle devra néanmoins instancier la classe appropriée. Nous déclarons ensuite les variables table et requete respectivement comme des objets de type TableDef et QueryDef. Le premier représente une table de base de données tandis que le second représente une requête. Les variables chemin et nomFichier sont plus usuelles. Elles sont d'ailleurs typées comme des textes (As String). Elles doivent récolter le chemin d'accès à la base de données à piloter ainsi que son nom de fichier. En effet, c'est en la désignant précisément que nous pourrons en prendre possession. Enfin, la variable i est une anticipation pour le prochain volet. Nous l'utiliserons comme variable de boucle pour parcourir les collections des formulaires et des états de la base de données désignée.

Le chemin d'accès à la base de données
Après un clic dans la première zone de liste, nous pourrons facilement récolter le nom de la base de données désignée. Mais celui-ci n'inclut pas son chemin d'accès qui est absolument nécessaire. Souvenez-vous cependant, après réception des noms de fichiers, nous l'avons stocké dans une zone de texte masquée et nommée acces.

Zones de texte masquées sur formulaire Access pour stocker des informations en VBA

Elle est accompagnée d'une autre zone de texte invisible. Elle est nommée laBdd. Nous l'utiliserons pour conserver le nom de la base de données cliquée. Ces informations portables seront aussi utiles pour les développements à venir.
  • Après les déclarations de variables, ajouter les trois instructions VBA suivantes :
...
nomFichier = lesBases.Value
laBdd.Value = nomFichier
chemin = acces.Value & "\" & nomFichier
...


C'est la propriété Value de la zone de liste nommée lesBases qui retourne le nom de l'élément cliqué. Ici donc, il s'agit du nom de la base de données choisie. Comme nous l'annoncions, nous stockons ensuite cette information dans la zone de texte masquée et nommée laBdd. Puis, nous assemblons (&) l'emplacement (acces.Value) avec le nom du fichier pour reconstituer le chemin d'accès complet à la base de données.

Créer une instance de base de données
Maintenant que les informations nécessaires sont connues et qu'un objet dédié est déclaré, nous allons pouvoir instancier la classe permettant à la variable autreBdd de piloter la base de données choisie par l'utilisateur dans la zone de liste.
  • A la suite du code de la procédure, ajouter les instructions VBA suivantes :
...
Set autreBdd = CreateObject("Access.Application")
autreBdd.OpenCurrentDatabase chemin
autreBdd.Visible = False
...


Nous l'avons déjà exploitée à maintes reprises. C'est la fonction VBA CreateObject qui permet d'instancier une classe. Avec cette valeur en paramètre (Access.Application), nous initialisons (Set) notre objet autreBdd sur une nouvelle instance d'Access. De fait, il hérite de propriétés et méthodes pour la piloter. C'est ainsi que nous exploitons tout d'abord sa méthode OpenCurrentDatabase pour lui spécifier en argument (chemin), la base de données à manipuler. Puis, comme nous souhaitons que ces traitements de récolte d'informations se fassent en arrière-plan, nous réglons sa propriété Visible à false.

Parcourir les tables d'une autre base
Grâce à cette instance fraîchement créée, nous allons pouvoir accéder à la collection TableDefs de la base de données qu'elle représente. Cette collection renferme tout simplement l'ensemble de ses tables.
  • A la suite du code de la procédure, ajouter les instructions VBA suivantes :
...
lesTables.RowSource = ""

For Each table In autreBdd.CurrentDb.TableDefs
If Left(table.Name, 4) <> "MSys" Then
lesTables.AddItem table.Name
End If
Next table
...


Tout d'abord, nous exploitons la propriété RowSource de la zone de liste lesTables afin de vider son potentiel précédent contenu (=""). Ainsi, à chaque clic de l'utilisateur sur une autre base de données, ses tables remplaceront les précédentes. C'est alors que nous amorçons une boucle For Each sur la variable table afin de parcourir la collection des tables. Notre instance offre la méthode CurrentDb pour pointer sur la base de données ainsi désignée. Et cette méthode permet d'atteindre la collection TableDefs pour descendre jusqu'au coeur des objets, en l'occurrence les tables ici.

Cependant et nous l'avions déjà constaté, parmi ces tables figurent des tables système. Elles sont préfixées de l'intitulé MSys. Elles ne sont pas visibles par l'utilisateur mais elles sont tout à fait accessibles par le code VBA. C'est pourquoi à chaque passage dans la boucle, donc pour chaque nom de table, nous engageons la fonction Left pour tester les quatre premiers caractères de chacun. Si le préfixe n'est pas trouvé (<> "MSys"), alors nous exploitons la méthode AddItem de notre zone lesTables pour ajouter ce nouveau nom, à la suite dans l'énumération. Nous pouvons d'ores et déjà tester la récolte des noms de tables d'une base de données externe.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
  • Exécuter ce dernier en enfonçant par exemple la touche F5 du clavier,
  • Sur le formulaire, cliquer sur le bouton à l'icône du dossier,
  • Dans la boîte de dialogue, ouvrir un dossier offrant des Bdd et valider par le bouton Ok,
  • De retour sur le formulaire, cliquer sur un nom de base dans la zone de liste,
Récupérer et lister les noms de tables d-une autre base de données en VBA Access

Comme vous pouvez l'apprécier, à chaque clic sur une base de données ainsi récoltée, ce sont tous les noms de ses tables qui sont instantanément importés dans la deuxième zone de liste.

Parcourir les requêtes d'une autre base
Pour finaliser ce deuxième volet, nous devons maintenant récolter toutes les requêtes de la base de données externe. La méthode est similaire. Mais il ne s'agit plus de parcourir la collection des tables (TableDefs). Il est question de parcourir la collection des requêtes (QueryDefs).
  • Revenir dans l'éditeur VBA Access,
  • A la suite du code VBA, ajouter les instructions suivantes :
...
lesRequetes.RowSource = ""

For Each requete In autreBdd.CurrentDb.QueryDefs
If Left(requete.Name, 1) <> "~" Then
lesRequetes.AddItem requete.Name
End If
Next requete
...


Tout d'abord et comme précédemment, nous vidons premièrement la zone de liste nommée lesRequetes des potentielles précédentes entrées. Ensuite, nous parcourons (For Each) la collection des requêtes (QueryDefs) dans cette base de données. Si le nom est préfixé d'un tilda (~), nous savons qu'il s'agit d'une requête embarquée par Access et nous ne la retenons pas. Dans le cas contraire, nous ajoutons (AddItem) chaque nom de requête dans la zone de liste.

Pour finir et comme vous le savez, nous devons décharger les objets qui ne sont plus utilisés.
  • A la fin du code VBA, après la dernière boucle, ajouter les instructions suivantes :
...
Set table = Nothing
Set requete = Nothing
autreBdd.Quit
Set autreBdd = Nothing
...


C'est ainsi que nous libérons proprement la mémoire de l'ordinateur.
  • Enregistrer les modifications et revenir sur le formulaire toujours en exécution,
  • Puis, cliquer tour à tour sur l'une ou l'autre base de données dans la première zone de liste,
Récupérer et lister les noms de requêtes d-une base de données externe en VBA Access

A chaque demande, nous récoltons effectivement tous les noms de tables et requêtes qui composent la base de données ainsi désignée.

Le code VBA Access complet que nous avons construit pour mener à bien cette deuxième étape, est le suivant :

Private Sub lesBases_Click()
Dim autreBdd As Access.Application
Dim chemin As String: Dim nomFichier As String
Dim table As TableDef: Dim requete As QueryDef
Dim i As Integer

nomFichier = lesBases.Value
laBdd.Value = nomFichier
chemin = acces.Value & "\" & nomFichier

Set autreBdd = CreateObject("Access.Application")
autreBdd.OpenCurrentDatabase chemin
autreBdd.Visible = False

lesTables.RowSource = ""

For Each table In autreBdd.CurrentDb.TableDefs
If Left(table.Name, 4) <> "MSys" Then
lesTables.AddItem table.Name
End If
Next table

lesRequetes.RowSource = ""

For Each requete In autreBdd.CurrentDb.QueryDefs
If Left(requete.Name, 1) <> "~" Then
lesRequetes.AddItem requete.Name
End If
Next requete

Set table = Nothing
Set requete = Nothing
autreBdd.Quit
Set autreBdd = Nothing

End Sub


 
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