VBA
Travailler avec des fichiers et des répertoires sans utiliser FileSystemObject
Recherche…
Remarques
Scripting.FileSystemObject
est beaucoup plus robuste que les méthodes héritées de cette rubrique. Cela devrait être préféré dans presque tous les cas.
Déterminer si les dossiers et les fichiers existent
Des dossiers:
Pour déterminer si un fichier existe, transmettez simplement le nom de fichier à la fonction Dir$
et testez pour voir s'il renvoie un résultat. Notez que Dir$
prend en charge les caractères génériques, donc pour tester un fichier spécifique , le nom de pathName
transmis doit être testé pour s'assurer qu'il ne les contient pas. L'exemple ci-dessous génère une erreur - si ce n'est pas le comportement souhaité, la fonction peut être modifiée pour renvoyer simplement False
.
Public Function FileExists(pathName As String) As Boolean
If InStr(1, pathName, "*") Or InStr(1, pathName, "?") Then
'Exit Function 'Return False on wild-cards.
Err.Raise 52 'Raise error on wild-cards.
End If
FileExists = Dir$(pathName) <> vbNullString
End Function
Dossiers (méthode Dir $):
La fonction Dir$()
peut également être utilisée pour déterminer si un dossier existe en spécifiant la transmission de vbDirectory
pour le paramètre d’ attributes
facultatif. Dans ce cas, la valeur pathName
transmise doit se terminer par un séparateur de chemin ( \
), car les noms de fichiers correspondants provoqueront des faux positifs. Gardez à l'esprit que les caractères génériques ne sont autorisés qu'après le dernier séparateur de chemin. La fonction exemple ci-dessous génère une erreur d'exécution 52 - "Nom ou numéro de fichier incorrect" si l'entrée contient un caractère générique. Si ce n'est pas le comportement souhaité, décommentez le message d' On Error Resume Next
en haut de la fonction. Rappelez-vous également que Dir$
prend en charge les chemins de fichiers relatifs (c.-à ..\Foo\Bar
d ..\Foo\Bar
), ainsi la validité des résultats est garantie tant que le répertoire de travail actuel n'est pas modifié.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Uncomment the "On Error" line if paths with wild-cards should return False
'instead of raising an error.
'On Error Resume Next
If pathName = vbNullString Or Right$(pathName, 1) <> "\" Then
Exit Function
End If
FolderExists = Dir$(pathName, vbDirectory) <> vbNullString
End Function
Dossiers (méthode ChDir):
L'instruction ChDir
peut également être utilisée pour tester si un dossier existe. Notez que cette méthode modifie temporairement l'environnement dans lequel s'exécute VBA. Par conséquent, la méthode Dir$
doit être utilisée à la place. Il a l'avantage d'être beaucoup moins tolérant avec son paramètre. Cette méthode prend également en charge les chemins d'accès relatifs aux fichiers, de même que la méthode Dir$
.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Cache the current working directory
Dim cached As String
cached = CurDir$
On Error Resume Next
ChDir pathName
FolderExists = Err.Number = 0
On Error GoTo 0
'Change back to the cached working directory.
ChDir cached
End Function
Création et suppression de dossiers de fichiers
Remarque: par souci de concision, les exemples ci-dessous utilisent la fonction FolderExists de l'exemple Determining If Folders and Files Exist de cette rubrique.
L'instruction MkDir
peut être utilisée pour créer un nouveau dossier. Il accepte les chemins contenant des lettres de lecteur ( C:\Foo
), des noms UNC ( \\Server\Foo
), des chemins relatifs ( ..\Foo
) ou le répertoire de travail actuel ( Foo
).
Si le lecteur ou le nom UNC est omis (par exemple, \Foo
), le dossier est créé sur le lecteur en cours. Cela peut être ou ne pas être le même lecteur que le répertoire de travail en cours.
Public Sub MakeNewDirectory(ByVal pathName As String)
'MkDir will fail if the directory already exists.
If FolderExists(pathName) Then Exit Sub
'This may still fail due to permissions, etc.
MkDir pathName
End Sub
L'instruction RmDir
peut être utilisée pour supprimer des dossiers existants. Il accepte les chemins sous les mêmes formes que MkDir
et utilise la même relation avec le répertoire de travail et le lecteur en cours. Notez que cette instruction est similaire à la commande shell Windows rd
, elle lancera donc une erreur d'exécution 75: "Erreur d'accès au fichier / chemin" si le répertoire cible n'est pas vide.
Public Sub DeleteDirectory(ByVal pathName As String)
If Right$(pathName, 1) <> "\" Then
pathName = pathName & "\"
End If
'Rmdir will fail if the directory doesn't exist.
If Not FolderExists(pathName) Then Exit Sub
'Rmdir will fail if the directory contains files.
If Dir$(pathName & "*") <> vbNullString Then Exit Sub
'Rmdir will fail if the directory contains directories.
Dim subDir As String
subDir = Dir$(pathName & "*", vbDirectory)
Do
If subDir <> "." And subDir <> ".." Then Exit Sub
subDir = Dir$(, vbDirectory)
Loop While subDir <> vbNullString
'This may still fail due to permissions, etc.
RmDir pathName
End Sub