Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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.
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,
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 .
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,
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,
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