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 bases de données d'un dossier
Le
VBA est définitivement puissant. Avec
Access , nous avons déjà appris à accéder aux ressources de fichiers Excel et Word mais aussi aux ressources de fichiers PDF. Ici, nous proposons d'entrer dans le
coeur des
bases de données externes pour manipuler toutes leurs informations. Dans ce premier des quatre volets, nous allons démontrer comment récolter tous les
noms des bases de données hébergées par un
dossier .
Sur l'exemple complètement finalisé illustré par la capture, au clic sur un bouton matérialisé par l'icône d'un dossier, l'utilisateur récolte tous les
noms des bases de données dans une première
zone de liste , placée sur la gauche du formulaire. Dès lors, au clic sur l'un des noms ainsi importés, il récolte les
noms de tous les objets composant cette
base de données , dans quatre zones de liste distinctes, placées sur la droite. Enfin, lorsqu'il clique sur l'une des tables de la base de données choisie, il récupère
tous les enregistrements de cette dernière, dans une zone de texte enrichie, placée en bas du formulaire.
Base de données Access à télécharger
Pour développer ces techniques
VBA Access , nous suggérons d'appuyer l'étude sur une
base de données hébergeant ce
formulaire avec ces
zones de liste , prêtes à réceptionner les
informations externes .
Double cliquer sur le fichier compressé lister-autres-bdd.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 sur le bouton Activer le contenu du bandeau de sécurité,
Dans le volet de navigation sur la gauche, double cliquer sur le formulaire fParcourir ,
Ainsi, nous l'exécutons. Il offre bien les différentes
zones de liste pour
récolter les informations ainsi que la
zone de texte enrichi , sur la partie inférieure, pour récupérer les
enregistrements d'une table externe désignée. La première action de l'utilisateur doit consister à cliquer sur le
bouton à l'icône d'un dossier pour désigner un emplacement dans lequel sont hébergées des
bases de données externes à étudier. Mais à ce stade bien sûr, si vous cliquez sur ce dernier, rien ne se produit encore.
A gauche du ruban Accueil , cliquer sur la flèche du bouton Affichage ,
Dans les propositions, choisir le mode Création ,
Maintenant, si vous sélectionnez tour à tour les contrôles et que vous consultez la
feuille de propriétés , vous constatez que les
zones de liste sont respectivement nommées :
lesBases ,
lesTables ,
lesFormulaires et
lesEtats . De même, vous apprenez que la
zone de texte enrichi se nomme
lesEnregistrements . C'est par ces noms que nous piloterons ces contrôles en
VBA Access de manière à les enrichir des
informations externes .
La déclaration des variables
Pour débuter, nous avons besoin d'un
jeu de variables . Nous devons déclencher une
boîte de dialogue permettant de désigner un
dossier dans lequel sont stockées des
bases de données à analyser. Nous avons besoin de mémoriser ce
chemin et grâce à lui, nous devons piloter des
objets capables de manipuler les
fichiers et dossiers du disque . Mais avant tout et sachez-le, une
référence est nécessaire pour piloter les
boîtes de dialogue standard d'Office .
Sur le formulaire en conception, cliquer sur le bouton à l'icône du dossier pour le sélectionner,
Activer alors l'onglet Evénement de sa feuille de propriétés ,
Cliquer ensuite 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,
Nous basculons ainsi dans l'éditeur VBA Access entre les bornes de la
procédure événementielle parcourir_Click . Son code VBA se déclenchera au clic sur ce petit bouton à l'icône du dossier.
En haut de l'éditeur, cliquer sur le menu Outils puis choisir la rubrique Références ,
Comme vous le constatez, la
librairie Microsoft Office 16.0 est cochée. Elle est donc ajoutée au
projet VBA Access . C'est elle qui va nous permettre de piloter les
boîtes de dialogue standard d'Office , une fois que nous aurons déclaré les
variables que nous avons évoquées précédemment.
Cliquer sur le bouton Ok de la boîte de dialogue pour revenir sur la feuille de code,
Dans la procédure parcourir_Click , ajouter les déclarations de variables suivantes :
Private Sub parcourir_Click()
Dim boite As FileDialog: Dim chemin As String
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
End Sub
L'
objet FileDialog est précisément celui qui doit être utilisé pour
instancier la classe permettant de
piloter ces boîtes de dialogue standards . Nous stockerons le
chemin d'accès au dossier ainsi désigné par l'utilisateur dans la
variable chemin . C'est la raison pour laquelle, nous la typons comme un texte (As String). Puis, étant donné que nous allons devoir
parcourir tous les fichiers du dossier mentionné, à la recherche des
fichiers de bases de données , nous déclarons trois variables comme des objets au sens large (As Object). Le premier doit permettre d'
instancier la classe offrant les propriétés et méthodes pour manipuler les
fichiers et dossiers du système . Grâce à elle, les deux suivantes pourront pointer sur le dossier en question pour la première et sur les fichiers de ce dossier pour la seconde.
La boîte de dialogue des dossiers
Maintenant que les
variables et les
objets sont déclarés, nous allons pouvoir commencer par initialiser celui qui doit représenter la
boîte de dialogue permettant de
naviguer au travers des dossiers dans l'arborescence du disque.
A la suite du code de la procédure, ajouter les instructions VBA suivantes :
...
lesBases.RowSource = ""
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)
If chemin <> "" Then
MsgBox chemin
End If
...
Tout d'abord, nous réinitialisons la zone de liste nommée
lesBases pour la purger des précédentes importations, si d'aventure plusieurs clics successifs avaient été effectués sur le bouton à l'icône du dossier. Il est à noter que pour pouvoir la piloter ainsi, sa
propriété Origine source est réglée Ã
Liste valeurs et non sur Tables/Requêtes. Elle est ainsi indépendante et nous pouvons la manipuler en VBA.
Ensuite, nous initialisons (Set) l'objet
boite grâce à la
propriété FileDialog de l'
objet Application et à son
argument msoFileDialogFolderPicker . C'est ainsi qu'il hérite des propriétés et méthodes pour piloter ces boîtes. D'ailleurs dans l'enchaînement, nous exploitons la
méthode héritée Show pour afficher la
boîte de dialogue des dossiers . Le chemin au dossier désigné par l'utilisateur (boite.SelectedItems(1)) est ainsi stocké dans la
variable chemin . En effet, c'est la
collection SelectedItems de cet
objet boite qui renvoie un tableau de tous les dossiers choisis par l'opérateur. Comme nous n'avons pas autorisé la multi-sélection, nous savons que ce chemin est rangé en première position (1) dans la collection.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire Access (ALT + Tab),
Exécuter ce dernier en enfonçant la touche F5 du clavier par exemple,
Cliquer alors sur le petit bouton à l'icône d'un dossier,
Dans la boîte de dialogue, désigner un dossier contenant des bases de données Access ,
Dès lors, cliquer sur le bouton Ok de la boîte de dialogue Standard,
Comme vous pouvez le voir, la réponse est fournie par une autre boîte de dialogue déclenchée par la
fonction VBA MsgBox . Elle restitue le
chemin d'accès complet au dossier désigné par l'utilisateur. C'est ce chemin que nous devons exploiter pour pointer sur le
répertoire à piloter et Ã
parcourir par le code VBA pour restituer tous les
noms de fichiers des bases de données dans la
zone de liste nommée
lesBases .
Accéder aux fichiers d'un dossier
La deuxième instanciation doit désormais intervenir dans la branche de l'
instruction conditionnelle . En effet, nous avons choisi de vérifier que l'utilisateur n'avait pas cliqué sur le bouton Annuler et donc, qu'il avait bien désigné un dossier (If chemin <> "" Then).
Revenir dans l'éditeur VBA Access ,
Passer l'instruction du MsgBox en commentaire en la préfixant d'une apostrophe ('),
Dans les bornes de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
acces.Value = chemin
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)
...
Il y a deux zones de texte masquées sur ce formulaire. Elles se nomment respectivement
acces et
laBdd . Dans la première (acces), nous stockons le
chemin d'accès au dossier désigné. Nous le verrons, ces données seront utiles pour les développements qui suivront. Ensuite et nous en avons l'habitude désormais, nous exploitons la
fonction VBA CreateObject avec l'
argument scripting.filesystemobject pour instancier la classe permettant de
manipuler les fichiers et dossiers du système. C'est ainsi que nous initialisons (Set) notre
objet objetFichier . Dès lors, il offre instantanément la
méthode getfolder à laquelle nous passons le
chemin d'accès au dossier (chemin) pour initialiser l'
objet leDossier .
Parcourir les fichiers du dossier sélectionné
C'est cet objet qui va maintenant offrir une propriété héritée, ou plutôt une collection permettant de désigner
tous les fichiers du dossier ainsi spécifié. Et c'est ainsi que doit entrer en action une
boucle For Each pour les passer en revue tour à tour. Pour cela, nous devons utiliser l'
objet chaqueFichier que nous avions déclaré à cet effet.
A la suite de l'instruction conditionnelle, créer la boucle For Each suivante :
...
For Each chaqueFichier In leDossier.Files
If (Right(chaqueFichier.Name, 6) = ".accdb") Then
lesBases.AddItem chaqueFichier.Name
End If
Next chaqueFichier
...
C'est donc la
collection héritée Files qui retourne un tableau de
tous les fichiers contenus dans le dossier. Nous les parcourons tous grâce à notre
objet chaqueFichier qui prend son type au moment de cette affectation implicite. Mais à chaque passage, nous émettons un critère pour vérifier que l'
extension du fichier en cours d'analyse est bien celle d'une
base de données Access . Pour cela, nous exploitons la
fonction VBA Right afin d'analyser les six derniers caractères. Si cette condition est honorée, nous ajoutons le nom du fichier à la suite dans la
zone de liste déroulante , grâce à sa
méthode AddItem .
Décharger les objets
Pour finir et comme vous le savez, à l'issue du traitement, nous devons décharger les objets qui ne sont plus utilisés, afin de libérer les ressources.
Après l'instruction conditionnelle englobant la boucle, ajouter les instructions suivantes :
...
End If
Set boite = Nothing
Set chaqueFichier = Nothing
Set objetFichier = Nothing
Set leDossier = Nothing
End Sub
...
Il ne nous reste plus qu'à tester le code qui rappelons-le n'est qu'une étape de l'application finale.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
Cliquer sur le petit bouton à l'icône du dossier,
Dans la boîte de dialogue standard, pointer sur un dossier contenant des bases de données,
Puis, valider en cliquant sur le bouton Ok,
De retour sur le formulaire et comme vous pouvez l'apprécier, la zone de liste rend effectivement compte de
toutes les bases de données figurant dans le
dossier choisi par l'utilisateur.
Dans le prochain volet, nous exploiterons ces travaux préliminaires. Il sera question d'être en mesure de
questionner la base de données cliquée par l'utilisateur dans la première zone de liste, pour restituer
toutes les tables et requêtes qu'elle renferme, dans deux autres zones de liste prévues à cet effet.
Le
code VBA Access complet que nous avons construit pour récupérer
tous les noms des bases de données externes , est le suivant :
Private Sub parcourir_Click()
Dim boite As FileDialog: Dim chemin As String
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
lesBases.RowSource = ""
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)
If chemin <> "" Then
'MsgBox chemin
acces.Value = chemin
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)
For Each chaqueFichier In leDossier.Files
If (Right(chaqueFichier.Name, 6) = ".accdb") Then
lesBases.AddItem chaqueFichier.Name
End If
Next chaqueFichier
End If
Set boite = Nothing
Set chaqueFichier = Nothing
Set objetFichier = Nothing
Set leDossier = Nothing
End Sub