Stocker tous les fichiers d’un répertoire dans une table Access
Tout est dans le titre ! La question m’a été posée plusieurs fois sur le blog, pour faire suite à l’article Lister tous les fichiers d’un répertoire. Voici donc un petit bout de code qui s’occupera de stocker tous les fichiers d’un dossier dans une table Access.
Un peu de préparation
Tout d’abord, on a besoin d’une table pour stocker les fichiers (ça va aider, pour répondre à la question ! 🙂 ). La mienne est très simple :
- Un champ
Numéro Fichier
, de type NuméroAuto (donc géré automatiquement dans la suite). - Un champ
Fichier
, de type Texte / 255 caractères, pour stocker le nom des fichiers (ou leur chemin).
La table s’appelle tbl Fichiers
.
Le code
Recopiez ce qui suit dans un module standard de votre base de données.
AddBackslash()
, que vous trouverez dans cet autre article, et que vous devez aussi recopier dans un module de votre base (pourquoi pas le même module).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
' --- ' LISTE DU CONTENU D'UN DOSSIER VERS UNE TABLE ' --- ' Sub ListerFichiers( _ ByVal strDossier As String, _ Optional ByVal strExtension As String = "*.*", _ Optional blnViderTable As Boolean = False, _ Optional blnCheminComplet As Boolean = True) ' Quelques variables... Dim strFichier As String Dim rst As DAO.Recordset ' Nom de la table et du champ Const TABLE_FICHIERS = "tbl Fichiers" Const CHAMP_FICHIER = "Fichier" ' Vérifier que le dossier existe bien strDossier = AddBackslash(strDossier) If Dir(strDossier, vbDirectory) = "" Then MsgBox "Dossier introuvable !", vbExclamation Exit Sub End If ' Vider la table si nécessaire If blnViderTable Then CurrentDb.Execute "DELETE FROM [" & TABLE_FICHIERS & "];" End If ' Ouvrir la table Set rst = CurrentDb.OpenRecordset(TABLE_FICHIERS, dbOpenDynaset) ' Lister tous les fichiers du dossier strFichier = Dir(strDossier & strExtension, vbNormal) Debug.Print strDossier & strExtension While strFichier <> "" ' Stocker le nom du fichier dans la table Debug.Print "> " & strFichier rst.AddNew rst(CHAMP_FICHIER) = IIf(blnCheminComplet, _ strDossier & strFichier, _ strFichier) rst.Update ' Lire le fichier suivant strFichier = Dir Wend ' On libère les ressources rst.Close Set rst = Nothing End Sub |
Tester !
La procédure ListerFichiers
reçoit 4 paramètres, les 3 derniers étant optionnels :
- Il faut d’abord fournir le chemin du dossier à inspecter. Ce chemin peut se terminer ou non par un anti-slash (ce dernier est de toute façon ajouté automatiquement).
- Donnez ensuite l’extension des fichiers à lister. Par défaut, tous les fichiers sont listés (
*.*
), mais vous pouvez ne lister que les images JPEG (*.jpg
). - Le troisième paramètre vaut
True
si la table cible doit être vidée avant de lister les fichiers, etFalse
sinon. Tout dépend de votre application : est-ce qu’il faut repartir à vide, ou est-ce que vous souhaiter cumuler le résultat de plusieurs listes. - Enfin, le dernier paramètre vaut
True
s’il faut stocker le chemin complet du fichier (dossier + chemin), ouFalse
s’il faut stocker uniquement le nom du fichier.
Voici par exemple comment stocker tous les fichiers (chemins complets) d’un dossier quelconque :
1 2 3 4 |
Sub TestListerFichiers1() ListerFichiers "C:\Users\Hervé\Documents\Perso\Achats2013", "*.*", True MsgBox "Terminé !", vbInformation End Sub |
Et voici comment cumuler toutes les images Web (JPG, PNG et GIF) d’un dossier, en vidant la table la première fois :
1 2 3 4 5 6 |
Sub TestListerFichiers2() ListerFichiers "C:\Users\Hervé\Documents\Perso\Achats2013", "*.jpg", True ListerFichiers "C:Users\Hervé\Documents\Perso\Achats2013", "*.png", False ListerFichiers "C:Users\Hervé\Documents\Perso\Achats2013", "*.gif", False MsgBox "Terminé !", vbInformation End Sub |
EDIT: L’exploration des sous-dossiers est disponible sur cet article.
Bonjour,
Merci pour cette page qui m’a beaucoup aidée.
Par contre, le lien vers la fonction AddBackslash() ne fonctionne pas. Certainement une conséquence du crash que vous avez subi.
Merci pour le retour ! Le lien est corrigé, il devrait fonctionner maintenant.
Bonjour,
Je suis débutante en VBA, et après avoir recopier ce code, j’ai une erreur de type: Erreur d’exécution ‘424’: Objet requis ligne 28 c’est à dire à la ligne suivante:
CurrentDb.Execute « DELETE FROM [ » & TABLE_FICHIERS & « ]; »
Pouvez-vous m’aider svp ?
Merci d’avance
La constante
TABLE_FICHIERS
est bien renseignée en début de code, et donne bien le nom d’une table existante dans la base de données ?Bonjour,
Mrci de cet exemple d’un grand intéret, je souhaiterais mettre un champ textuel et ne parviens pas a faire évoluer votre code. Vous avez mentionné qu’il faudrai le changer en plusieurs endroits vous est il possible de m’aiguiller ? merci ! HenGin
Quel serait l’objectif, par exemple ?
ça marche et les commentaires sont didactiques, comme d’habitude. Très utile pour un éternel faux-débutant en VBA. Un grand merci, Hervé !
Merci également !
Merci pour le code, mais je bute maintenant sur plusieurs sous répertoires. Comment le faire de façon automatique et ne pas avoir a modifier le code a chaque sous répertoire?
Bonne question ! 🙂 Je poste en début de semaine prochaine un nouvel article qui traitera aussi les sous-répertoires. Stay tuned!
Le nouvel article est en ligne ici.
oneill > Les fonctions de fichiers d’Access gèrent uniquement des accès locaux (poste de travail ou réseau local). Par contre, elles n’accèdent pas à un serveur Web distant. Il faudrait donc soit connecter le serveur au réseau local, pour que l’accès soit transparent, soit passer par des bibliothèques externes permettant de lire des fichiers distants. Dans les 2 cas, ça peut être compliqué… 😉
Bonjour,
Je souhaite mettre les photos d’utilisateurs dans un formulaire et stocker les liens vers les images dans une table.
Simplement le dossier des images se trouve sur un serveur internet et non sur un réseau interne d’entreprise.
j’ai créé un champ text qui pointe vers le champ de la table contenant les liens vers les photos mais lorsque le formulaire s’affiche, access n’arrive pas à ouvrir le fichier pour l’afficher.
comment puis-je faire pour que les photos présentes dans le dossier web s »affichent dynamiquement pour chaque fiche ?
Merci
Oneill