En VBA, il est très simple de vérifier si un fichier existe. On peut utiliser une combinaison de deux fonctions VBA: Len() et Dir().
La fonction Dir() retourne le nom du fichier testé si ce fichier existe (en tant qu'une chaîne de caractères – String
). Si le fichier n'existe pas, la fonction retourne une chaîne vide.
On va ensuite tester avec la fonction Len() la longueur de ce résultat obtenu. La fonction Len() retourne comme résultat le nombre de caractères dans une chaîne de caractères. Dans notre cas, la conclusion est la suivante:
Si le résultat combiné de ces deux fonctions est >0
, le ficher existe. Dans le cas contraire, le fichier testé n'existe pas.
Et voici le code VBA sous forme d'une fonction que vous pouvez utiliser tel quel dans votre projet et qui vous permettra de vérifier si le fichier existe ou pas…
Fonction VBA pour tester l’existence d’un fichier
La fonction suivante utilise un paramètre de type String
( nommé MonFichier
): le chemin complet vers le fichier (c'est à dire le chemin & le nom du fichier dont vous voulez tester l'existence.
Le résultat retourné par cette fonction est un Booléen: il correspond à une des valeurs suivantes: True
(si le fichier existe) ou False
(si le fichier n'existe pas).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Public Function FichierExiste(MonFichier As String) 'par Excel-Malin.com ( https://excel-malin.com ) On Error GoTo Erreur If MonFichier <> "" And Len(Dir(MonFichier)) > 0 Then FichierExiste = True Else FichierExiste = False End If Exit Function Erreur: FichierExiste = CVErr(xlErrRef) End Function |
Remarques:
- Si la valeur du paramètre
MonFichier
est vide ou=""
, la fonction retournera comme résultatFalse
car un fichier sans chemin et sans nom n'existe pas - Si
MonFichier
contient uniquement le nom de fichier sans le chemin, la fonction vérifiera son existence dans le dossier actif - En cas de situation où le code ne peut pas vérifier si le fichier existe – ce qui arrive par exemple quand l'utilisateur n'a pas le droit d'accès à l'emplacement où doit se trouver le fichier en fonction – la fonction retournera l'erreur
#REF!
. Dans ce cas, vous serez au courant que la fonction ne peut ni confirmer, ni infirmer l'existence du fichier…
Exemple pratique de vérification de l’existence d’un fichier
Le code VBA qui suit illustre l'utilisation de la fonction FichierExiste
dont le code se trouve plus haut. Il s'agit d'une simple procédure qui fait appel à la fonction FichierExiste
pour vérifier l'existence du fichier "C:\Dossier_test\fichier_test.docx". Un message (MsgBox
) est ensuite affiché avec le résultat de la vérification.
Attention, pour pouvoir faire fonctionner ce code, vous aurez besoin de copier les deux codes VBA dans votre projet: la fonction FichierExiste
ET la procédure TestSiFichierExiste
. Si vous voulez faire des tests, vous pouvez modifier le code de la procédure TestSiFichierExiste
– le nom du fichier, l'action à exécuter au cas où le fichier existe (ou pas),… Le code de la fonction FichierExiste
est générique et ne doit pas être modifié.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub TesteSiFichierExiste() 'par Excel-Malin.com ( https://excel-malin.com ) Dim MonFichier As String MonFichier = "C:\Dossier_test\fichier_test.docx" 'nom de fichier à modifier selon vos besoins If FichierExiste(MonFichier) = True Then MsgBox "Le fichier existe..." Else MsgBox "Le fichier n'existe pas..." End If End Sub |
Pourquoi vérifier si le fichier existe?
Si votre but exact est de vérifier l'existence d'un fichier, la question ne se pose même pas. Par contre, vous pouvez utiliser ce test dans vos projets pour vérifier si les fichiers avec lesquels vous devez travailler existent. Pourquoi? On pourrait simplement dire qu'il s'agit d'une bonne pratique dans la programmation (peu importe le langage de programmation utilisé). Mais en réalité, la raison principale est simple: pour vous éviter des problèmes! À vous et aux autres.
En sachant si le fichier existe, vous pouvez inclure dans votre code l'action à effectuer si le fichier n'existe pas. Si, par exemple, vous essayez d'ouvrir un fichier qui n'existe pas, votre code VBA va se bloquer (si les erreurs ne sont pas gérées expressément). Par contre si vous savez en avance que le fichier n'existe pas, vous pouvez décider vous-même quoi faire (par exemple le copier à partir d'un autre endroit ou le créer directement) – et votre code VBA continuera à tourner sans problème.
Cela vous permet également de loguer l'activité et des éventuels problèmes lors de l'exécution de vos projets.
Et pour finir, il est parfois utile, avant de créer ou d'exporter un fichier de savoir si un fichier avec le même nom existe déjà. Vous pouvez alors directement décider dans votre code quelle sera la suite (changer nom, déplacer le fichier existant dans un autre dossier, etc.). Et c'est toujours mieux que d'écraser un fichier existant de votre collègue! 🙂
Pour aller plus loin en VBA
Vous venez de voir le code qui vous permettra de tester en VBA l'existence d'un fichier. Il est également possible de tester en VBA si un dossier existe.
- Le tutoriel sur la gestion des fichiers en VBA pourrait aussi vous intéresser.
- Code VBA: vérifier si un dossier existe
- Code VBA: supprimer des dossiers et fichiers
- Comment utiliser la fonction RECHERCHEV en VBA
- Sinon, vous pouvez trouver des informations supplémentaires sur la fonction Dir() sur la page internet qui lui est dédiée sur le site de Microsoft.
- N'hésitez pas à consulter d'autres Codes sources VBA proposés par Excel-Malin.com
- Et si vous êtes à la recherche d'un support d'apprentissage, une sélection de livres sur Excel et sur VBA est à votre disposition… Tout le monde y trouvera son compte.
11 commentaires sur “Code VBA: Vérifier si le fichier existe ou pas”
merci pour le tuto
Super utile merci
J'utilise ce code depuis quelques mois et je vous en remercie.
Aujourd'hui, je n'arrive pas à l'appliquer à un nouveau fichier et je ne vois ce qui cloche.
J'ai ce message :
"Erreur d'exécution '52:
Nom ou numéro de fichier incorrect"
Et dans mon Module, cette ligne est surlignée en mode débogage :
" If Len(Dir(MonFichier)) > 0 Then"
Avez-vous déjà rencontré le problème ?
Voilà le code de ma macro où MonFichier est utilisé :
"Dim MonFichier As String
MonFichier = CHEMIN_BILAN_A
If FichierExiste(MonFichier) = False Then
MsgBox "Accès au fichier impossible." & vbCr & "Veuillez vérifier l'existence du fichier et la justesse de son chemin d'accès : " & vbCr & vbCr & CHEMIN_BILAN_A, vbOKOnly + vbExclamation, "ANOMALIE DÉTECTÉE"
Else
If FichOuvert(BILAN_A) Then
' Ne rien faire
Else
Workbooks.Open Filename:= _
CHEMIN_BILAN_A _
, UpdateLinks:=3, ReadOnly:=True
ActiveWindow.Visible = False
End If
End If
Bonjour,
Petite info si vous chercher un fichier qui est cacher sa retourne FALSE pour pallier à sa remplacer :
If Len(Dir(MonFichier)) > 0 Then
par
If Len(Dir(MonFichier, vbDirectory + vbHidden)) > 0 Then
Cordialement 😉
Bonjour,
Comment faire pour que le nom du fichier soit associé à une cellule?
Exemple: Si dans Sheet 1, Cellule C3 de mon classeur actif j'ai une liste déroulante de noms.
Lorsque je lance la macro je souhaiterai que celle ci m'indique si un classeur portant le même nom que la valeur de la cellule C3 existe.
Sub Send_Session_Test()
Dim Path As String
Dim Filename As String
Dim DirFile As String
Dim Dir As String
Dim wksht As Worksheet
Set wksht = ActiveSheet
Path = "C:\Users\Simon\Programs\"
Filename = "C:\Users\Simon\Programs\ & wksht.Cells (3, 3).Value"
If Filename = True Then
MsgBox "This workbook exist"
Else
MsgBox "This workbook doesn't exist"
End If
End Sub
Merci
Simon
Bonjour Simon,
ce code fera l'affaire:
Attention, dans votre code:
–
Dir
ne peut pas être le nom d'une variable. Il s'agit d'une fonction VBA existante– dans
Filename = "C:\Users\Simon\Programs\ & wksht.Cells (3, 3).Value"
, les guillemets sont ma placés. Cela devrait être:Filename = "C:\Users\Simon\Programs\" & wksht.Cells (3, 3).Value
J'espère que cela vous aidera.
Cordialement, Martin
Attention à la fonction Dir qui est un faux ami, surtout pour tester l'existence d'un fichier :
Msgbox dir(Source)
Si pour une raison quelconque la variable Source est vide,
Dir renverra le premier fichier correspondant au répertoire courant
Ce qui fait que la source inexistante existe ….
Bonjour.
Une très bonne remarque!
Je dois avouer que depuis le temps que je l'utilise, je ne m'en suis même pas rendu compte…
J'ai adapté le code VBA et les explication sur la page.
Merci!
Cordialement, Martin
Bonjour,
Merci pour cette astuce. Personnellement, je n'aurais pas exactement fait cela.
Le problème de tester les deux conditions dans la même clause "if" est que tout doit être interprété avant d'exécuter la clause "then".
En effet ici, si le nom du fichier (avec son chemin) est une chaine vide, rien ne sert d'aller plus loin et de faire un teste avec Dir().
Je préfère définir deux clause "if" en cascade, comme ceci…
If MonFichier vbNullString Then If Dir(MonFichier) vbNullString Then FichierExiste=True Else FichierExiste=False Else FichierExiste=False
Ce qui peut s'écrire de façon plus compacte…
If MonFichier vbNullString Then FichierExiste=(Dir(MonFichier) vbNullString) Else FichierExiste=False
Bonne journée
Paolo
Bonjour Paolo,
merci pour votre commentaire.
En effet, il y a toujours moyen de faire plus avec moins et être plus concis. Mais le but de ce site est de montrer, expliquer, apprendre à tous.
Et une grande partie des nombreux visiteurs de ce site sont des débutants en VBA.
Or, je ne suis pas sûr que le code
If MonFichier vbNullString Then FichierExiste=(Dir(MonFichier) vbNullString) Else FichierExiste=False
bien que concis et fonctionnel soit très pédagogique 😉
Donc je préfère montrer le code le plus lisible possible afin que le maximum des visiteurs le comprennent…
Cordialement, Martin
Bonjour j'aime bien votre code mais je voudrais le complexifier pour mon utilisation.
Je m'explique :
Je veut rechercher un fichier dont je ne connais que les 8 premiers caractères , l'extension et le début du chemin
exemple , je cherche le fichier d:\claviers\fr\azertyui 001.jpg
mais je ne connais que d:\claviers\?\azertyui?.jpg
dans le dossier clavier il peut y avoir plusieurs sous dossier
le début du nom du fichier contiendra toujours 8 caractères mais le reste du nom sera aléatoire
le début du nom du fichier sera dans un cellule avec liste déroulante (B2 par exemple)
je souhaite associer le code à un bouton pour lancer la recherche
et le fichier doit s'ouvrir comme si on cliquait dessus directement (donc pour une photo , avec la visionneuse photo de windows par défaut)
est ce possible de faire un code pour cela ?
merci d'avance