Comment savoir si un fichier existe dans un dossier en VBA avec Excel ?
Dans ce tutoriel, je vais vous montrer comment vérifier qu’un fichier donné existe dans un répertoire d’enregistrement. Nous découvrirons ainsi comment utiliser les fonction Dir() et Len() de VBA.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
1. Présentation
Dans ce tutoriel, nous allons chercher à savoir si un fichier existe à un endroit donné.
Les raisons qui peuvent nous pousser à effectuer ce contrôle dans le cadre du développement d’une macro-commande en VBA sont nombreuses, nous pouvons par exemple penser à :
- Gérer plusieurs versions d’un fichier,
- Vérifier que le fichier existe avant de l’ouvrir,
- Vérifier que le fichier existe avant de le supprimer,
2. Le fichier existe-t-il ?
Pour savoir si un fichier donné existe à un endroit donné, nous allons utiliser la fonction Dir().
Celle-ci permet en effet de récupérer le nom du fichier exprimé sous la forme d’une chaîne de caractères.
Supposons que nous souhaitions savoir si le fichier test.pdf existe dans le même dossier que celui dans lequel se trouve le fichier Excel.
Nous commençons alors par stocker le chemin complet d’accès à ce fichier dans une variable nommée fichier que nous typons en tant que String :
Dim fichier As String
fichier = ActiveWorkbook.Path & "\test.pdf"
Ensuite pour tester le résultat, nous affichons le résultat renvoyé par la fonction Dir() lorsque nous lui passons comme paramètre le chemin de ce fichier :
MsgBox Dir(fichier)
Nous récupérons alors effectivement le nom du fichier de test.
En revanche, si nous modifions la variable fichier pour pointer un fichier inexistant (par exemple test2.pdf), alors Excel nous affichera une fenêtre vide :
Nous voyons donc émerger la solution à notre problématique : pour vérifier l’existence d’un fichier en VBA, il suffit de vérifier que la chaîne de caractère retournée par la fonction Dir() n’est pas nulle.
Et pour cela, nous allons simplement compter le nombre de caractères de celle-ci et vérifier que ce nombre soit supérieur à zéro :
If Len(Dir(fichier)) > 0 Then
MsgBox "Le fichier existe"
Else
MsgBox "Le fichier n'existe pas"
End If
3. Créer la fonction de contrôle
Maintenant que nous avons vu comment procéder pour déterminer si un fichier existe ou non, nous pouvons transformer la macro en une fonction, ce qui permettra de la récupérer facilement dans nos projets.
Pour cela, nous procédons aux modifications suivantes :
- Le mot-clé Sub est remplacé par Function (VBA va alors remplacer automatiquement la ligne End Sub par End Function),
- Le nom du fichier à tester est défini en tant que paramètre de la fonction,
- La fonction est typée en tant que booléen, c’est-à-dire que celle-ci renverra la valeur TRUE lorsque le fichier existe, et FALSE dans le cas contraire
- Pour finir, nous enverrons le résultat obtenu par le test comme valeur de la fonction
Function testFichier(fichier As String) As Boolean
If Len(Dir(fichier)) > 0 Then
testFichier = True
Else
testFichier = False
End If
End Function
Nous pouvons ensuite tester cette fonction à partir d’une autre procédure :
Sub test()
MsgBox testFichier(ActiveWorkbook.Path & "\test.pdf")
End Sub
Celle-ci nous retournera alors VRAI si nous effectuons le test sur le fichier test.pdf qui existe véritablement :
Et FAUX pour le fichier test2.pdf :
Sachez qu’ici nous avons appelé le chemin complet du fichier à tester, mais si celui-ci est situé dans le même dossier que le classeur dans lequel se trouve la macro, il n’est pas utile de préciser ce chemin.
Nous pourrions donc aussi bien utiliser :
Sub test()
MsgBox testFichier("test.pdf")
End Sub
Et enfin, la fonction que nous venons de créer étant une fonction publique, nous pouvons également l’utiliser directement depuis la feuille de calcul :
4. Amélioration de la fonction
Nous pouvons encore améliorer la fonction de test sur deux éléments.
Tout d’abord, nous pouvons tester si un paramètre a bien été donné, c’est-à-dire que l’argument fichier est différent d’une simple chaîne vide.
(sinon la fonction Dir() nous retournerait le premier fichier qui se trouve dans le répertoire courant - à ne pas confondre avec le répertoire d’enregistrement du classeur… -, et donc le résultat serait erroné !) :
If Len(fichier) > 0 And Len(Dir(fichier)) > 0 Then
testFichier = True
Else
testFichier = False
End If
Ensuite, il est possible que le fichier soit un fichier caché :
Dans ce cas, celui-ci existe bien, mais la fonction va retourner un résultat erroné :
Pour corriger ce problème, nous allons simplement pouvoir utiliser le paramètre optionnel attributes de la fonction Dir() qui permet de définir les attributs de fichier à utiliser :
If Len(fichier) > 0 And Len(Dir(fichier, vbHidden)) > 0 Then
testFichier = True
Else
testFichier = False
End If
5. Exemple
Dans cet exemple, nous allons souhaiter copier un fichier (test.pdf) en un nouveau fichier, qui n’existe pas :
Sub dupliquerPDF()
Dim i As Integer
i = 1
Do While testFichier("test_" & i & ".pdf")
i = i + 1
Loop
FileCopy "test.pdf", "test_" & i & ".pdf"
MsgBox "Le fichier test_" & i & ".pdf a été créé"
End Sub