- Utilisation du FileSystemObject (FSO) dans Excel VBA
- Création d’un FileSystemObject
- Utilisation des méthodes ‘Exists’
- Utiliser les méthodes ‘Get’
- GetAbsolutePathname
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- GetParentFolderName
- Utilisation des méthodes de ‘création’
- CreateFolder
- CreateTextFile
- Utilisation des méthodes ‘Copy’
- CopyFile
- CopyFolder
- Utilisation des méthodes ‘Move’
- MoveFile
- MoveFolder
- Utilisation des méthodes ‘Delete’
- DeleteFile
- DeleteFolder
- Autres méthodes de l’OFS
- OpenAsTextStream.
- BuildPath
- OpenTextFile
- Propriétés de l’OFS
- Drives
- Name
- Path
- Size
- Type
Utilisation du FileSystemObject (FSO) dans Excel VBA
Le FileSystemObject (FSO) vous donne accès à toute une série de fonctions pour accéder au système de fichiers de votre ordinateur. En utilisant cet objet, vous pouvez facilement accéder aux fichiers, aux dossiers et aux lecteurs, et aussi lire et écrire dans les fichiers.
Plusieurs des fonctions du FSO pourraient être écrites par vous en VBA traditionnel, mais elles nécessiteraient plus de codage et seraient plus difficiles à maintenir et à comprendre pour un développeur entrant. L’OFS est une API (interface de programmation d’applications) éprouvée et plus fiable que votre propre code. Il est facile à utiliser et prêt et disponible.
L’OFS fonctionne selon les normes internationales et les paramètres que vous avez sur votre ordinateur. Si vous distribuez votre application Excel dans le monde entier, alors l’utilisation de l’OFS prendra en charge toutes les différences de paramètres entre les pays, ce que votre propre code aurait du mal à faire.
L’OFS vous permettra de faire presque tout en code VBA que vous pourriez faire dans l’explorateur de fichiers de Windows. Il vous donne un accès complet au système de fichiers de Windows.
Création d’un FileSystemObject
Le FileSytemObject ne fait pas partie d’Excel VBA. Vous pouvez utiliser le FSO en créant un objet (late binding) dans VBA :
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
Alternativement, vous pouvez ajouter une référence dans VBA pour la bibliothèque FSO. C’est ce qu’on appelle la liaison précoce et elle est plus rapide que la liaison tardive, puisque l’objet ne doit pas être créé lorsque votre code est exécuté.
Pour ajouter une référence, vous devez appuyer sur Alt-F11 pour entrer dans l’éditeur Visual Basic (VBE), puis utiliser ‘Outils|Références’ dans le menu VBE. Cela affichera une fenêtre contextuelle pour vous permettre de sélectionner la référence pertinente (voir ci-dessous).
Défilez la liste des références disponibles jusqu’à ce que vous puissiez voir ‘Microsoft Scripting Runtime’. Cochez la case et cliquez sur OK, et la bibliothèque fait maintenant partie de votre application.
L’emplacement du fichier de la bibliothèque DLL est C:\Windows\SysWOW64\scrrun.dll
Si vous distribuez votre application à d’autres collègues ou à d’autres emplacements, il est essentiel qu’ils aient ce fichier à l’emplacement correct sur leur ordinateur, sinon votre code sera en erreur.
Il vaut la peine de mettre un piège à erreurs sur l’événement ‘WorkbookOpen’ en utilisant la commande Dir pour vérifier que le fichier existe. S’il est absent, alors donnez un message d’avertissement et fermez le fichier Excel.
Une fois la référence ajoutée, vous pouvez utiliser le code suivant pour créer le FSO:
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Tous les exemples de cet article utiliseront cette méthodologie pour créer le FSO.
Le FSO dispose de nombreuses méthodes et propriétés. Celles-ci sont divisées ici en sections selon ce qu’elles peuvent faire.
Utilisation des méthodes ‘Exists’
Vous pouvez utiliser une méthode FSO pour vérifier si un lecteur, un dossier ou un fichier existe. Ces méthodes sont faciles à utiliser et ne nécessitent qu’un seul paramètre.
Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub
Ces déclarations renverront toutes ‘True’ en supposant que votre ordinateur a un lecteur C :, un dossier sur celui-ci appelé ‘Temp’ et un fichier dans le dossier Temp appelé ‘testfile.txt’
Les chaînes de texte dans les paramètres ne sont pas sensibles à la casse. Vous ne pouvez pas utiliser de caractères génériques dans aucune de ces méthodes.
Vous ne pouvez pas non plus utiliser d’URL (localisateurs de ressources uniformes) pour décrire un emplacement de dossier ou de fichier. L’OFS fonctionne purement sur le système d’exploitation Windows et le système de fichiers qui s’y trouve. Pour un emplacement de serveur externe, vous devez d’abord y mapper un lecteur, puis utiliser le chemin du lecteur lui-même.
Utiliser les méthodes ‘Get’
L’OFS dispose de nombreuses méthodes pour obtenir des informations sur le fichier et le chemin, soit en divisant le chemin et le fichier, soit en obtenant des informations sur le fichier ou le dossier comme la date de création ou la date de modification.
GetAbsolutePathname
Ceci fournira un chemin complet à partir de la racine du lecteur spécifié.
La syntaxe est:
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
Ceci retournera une chaîne de caractères ‘C:\Users\Richard\Documents’. Cela s’explique par le fait que le chemin a été spécifié sous la forme C : suivi de trois points. Chaque point signifie un niveau suivant dans la structure du dossier.
GetBaseName
Cette méthode renvoie le nom d’un fichier ou d’un dossier spécifié.
La syntaxe est:
GetBaseName (path)
Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub
Ce code renverra ‘testfile’. La méthode renvoie la dernière section dans le nom du chemin. S’il s’agit d’un fichier, alors elle ne renvoie pas le suffixe du fichier.
Si le chemin ne peut pas être trouvé, alors une chaîne vide sera renvoyée.
GetDrive
Ce code vous permet d’accéder aux informations du lecteur, en fonction de la lettre du lecteur spécifiée.
La syntaxe est :
GetDrive (drivespec)
Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Set Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceEnd Sub
Cette méthode renvoie un objet lecteur basé sur le lecteur spécifié. Vous pouvez utiliser cet objet pour accéder aux informations sur le lecteur, comme l’espace libre disponible.
GetDriveName
Cette méthode séparera le nom du lecteur d’une chaîne de chemin / nom de fichier.
La syntaxe est :
GetDriveName (chemin)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
Ceci renverra ‘C:’
GetExtensionName
Ceci renverra le suffixe du fichier dans le chemin spécifié.
La syntaxe est:
GetExtensionName (path)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
Ceci renverra ‘txt’.
Si aucun fichier n’est spécifié, alors une chaîne vide sera renvoyée.
GetFile
Cette méthode renvoie un objet fichier, qui contient diverses informations sur le fichier lui-même.
La syntaxe est :
GetFile (filespec)
Sub FileInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C:\temp\testfile.txt"Set Fn = MyFSO.GetFile(Pth)MsgBox Fn.DateCreatedEnd Sub
Ceci renverra la date et l’heure de création du fichier spécifié. Si aucun fichier n’est spécifié ou si le fichier n’existe pas, vous obtiendrez une erreur ‘fichier non trouvé’.
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
Cela renverra ‘testfile.txt’.
GetFolder
Cela crée un objet dossier pour le dossier de base dans le chemin spécifié. Le chemin d’accès ne doit contenir que des noms de dossiers. Aucun nom de fichier ne doit être inclus sinon une erreur se produira.
La syntaxe est:
GetFolder (folderspec)
Sub FolderInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedEnd Sub
L’objet dossier contient diverses informations auxquelles on peut accéder. Dans ce cas, il renvoie la date de création du dossier.
Vous pouvez également utiliser cette méthode pour récupérer tous les noms de fichiers dans un dossier donné :
Sub FileNames()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)For Each Fn In Fo.Files MsgBox Fn.NameNext FnEnd Sub
Ce code va itérer dans le dossier ‘Temp’ et afficher chaque nom de fichier trouvé.
GetParentFolderName
Cette méthode va renvoyer le nom du dossier au niveau supérieur dans la hiérarchie des dossiers.
La syntaxe est :
GetParentFolderName (path)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
Ceci renverra ‘Users’ car c’est le ‘parent’ du dossier ‘richard’.
Utilisation des méthodes de ‘création’
Avec l’OFS, vous pouvez créer un nouveau dossier et un chemin et créer un fichier texte.
CreateFolder
Vous pouvez spécifier un nouveau nom de chemin de dossier à créer. Un danger de ceci est que si le dossier existe déjà, alors une erreur se produira. Vous pouvez utiliser la méthode ‘FolderExists’ pour vous assurer que cela ne se produira pas.
La syntaxe est:
CreateFolder (foldername)
Sub CreateNewFolder()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"If MyFSO.FolderExists(Pth) = False Then MyFSO.CreateFolder (Pth)End IfEnd Sub
Ce code va créer un nouveau dossier appelé ‘MyFolder’ sous le chemin existant ‘C:\temp’.
CreateTextFile
Cette méthode permet de créer un simple fichier texte et d’y écrire directement.
La syntaxe est :
CreateTextFile (nom du fichier, ])
Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Set Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Add my own text here" & vbLf & "This is the second line"Fn.CloseEnd Sub
Ce code crée un fichier texte appelé ‘Monfichier.txt’ dans le dossier ‘Temp’ du lecteur ‘C:’ et y écrit ensuite deux lignes de texte.
Notez qu’un caractère de saut de ligne est concaténé dans la chaîne de caractères en cours d’écriture.
Si le chemin vers lequel vous écrivez n’existe pas, alors une erreur se produira. Vous pouvez utiliser la méthode ‘FolderExists’ pour vérifier cela avant de créer le fichier.
Il y a un paramètre optionnel pour écraser le fichier existant si nécessaire – cela peut être True ou False. La valeur par défaut est True.
Utilisation des méthodes ‘Copy’
Vous pouvez utiliser ces méthodes pour copier un fichier ou un dossier à un autre emplacement.
CopyFile
Cette méthode copiera un fichier d’un emplacement de dossier à un autre. Notez que la copie échouera si l’emplacement de destination a l’attribut lecture seule défini.
La syntaxe est:
CopyFile source, destination,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
Ce code fera une copie de tous les fichiers texte (txt) de ‘C:\temp’ dans ‘C:\temp\myfolder\’, en écrasant le fichier si nécessaire. Le paramètre par défaut de l’option Écraser est Vrai.
Vous pouvez utiliser un caractère générique astérisque (*) pour les noms de fichiers, mais vous ne pouvez pas utiliser un caractère générique point d’interrogation ( ?) pour représenter des caractères uniques.
CopyFolder
Vous pouvez utiliser cette méthode pour copier un dossier entier d’un emplacement à un autre.
La syntaxe est:
CopyFolder source, destination,
Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub
Ce code copie tous les dossiers et fichiers sous ‘C:\temp’ dans ‘C:\users\richard’. Le nouveau dossier créé sera ‘C:\users\richard\myfolder’ car ‘C:\temp’ avait un dossier en son sein appelé ‘myfolder’.
Il y a quatre résultats possibles lors de l’utilisation de cette méthode:
- Si la destination n’existe pas, alors le dossier source et son contenu sont copiés.
- Si la destination existe déjà, alors une erreur se produit.
- Si la destination est un dossier, alors le dossier source et son contenu seront copiés. Une erreur se produira si Overwrite est défini sur False et qu’il existe déjà une copie d’un fichier dans la destination.
- Si la destination est définie en lecture seule, une erreur se produira si overwrite est défini sur false.
Cette méthode s’arrête à la première erreur qu’elle rencontre. Il n’y a pas de retour en arrière des actions qui ont réussi avant que l’erreur ne survienne.
Utilisation des méthodes ‘Move’
Ces méthodes peuvent être utilisées pour déplacer des fichiers ou des dossiers vers d’autres emplacements. Cela revient à couper d’un emplacement et à coller dans un autre emplacement. Notez que si le fichier à déplacer est ouvert, alors la méthode Move échouera avec une erreur.
MoveFile
Cette méthode est utilisée pour déplacer un fichier spécifique vers un autre emplacement. Les caractères génériques sont autorisés dans le dernier composant du chemin d’accès de la source.
La syntaxe est:
MoveFile source, destination
Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub
Ce code déplace tous les fichiers trouvés à ‘C:\temp’ dans ‘C:\temp\myfolder’.
Les dossiers source et destination doivent exister, car le dossier de destination ne se crée pas automatiquement.
Cette méthode s’arrête à la première erreur qu’elle rencontre. Il n’y a pas de retour en arrière des actions qui ont réussi avant que l’erreur ne survienne.
MoveFolder
Cette méthode déplace un dossier spécifique d’un emplacement à un autre.
La syntaxe est:
MoveFolder (source, destination)
Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub
Ce code déplace le dossier ‘mon dossier’ et son contenu vers le dossier ‘madestination’. ‘myfolder’ est effectivement supprimé et ‘mydestination’ est créé, ainsi que le contenu de ‘myfolder’.
Si le dossier de destination existe déjà, alors une erreur se produit.
Utilisation des méthodes ‘Delete’
Ces méthodes sont utilisées pour supprimer des fichiers ou des dossiers. Elles doivent être utilisées avec précaution car il n’y a pas de méthodes de retour en arrière ou d’annulation si quelque chose se passe mal.
DeleteFile
Ceci supprime des fichiers individuels ou un groupe de fichiers en utilisant des caractères génériques.
La syntaxe est :
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
Ce code supprimera tous les fichiers du dossier ‘C:\temp’
Le paramètre Force est facultatif et est défini à True ou False. S’il est défini à True, alors les fichiers en lecture seule seront supprimés. La valeur par défaut est False.
DeleteFolder
Cette méthode supprime un dossier spécifié et son contenu.
La syntaxe est:
DeleteFolder folderspec,
Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub
Ce code supprimera le dossier ‘MyDestination’ et tous les fichiers de ce dossier. Le dossier ‘temp’ restera.
Le paramètre Force est facultatif et est défini à True ou False. S’il est défini à True, alors les dossiers en lecture seule seront supprimés. La valeur par défaut est False.
Des caractères génériques peuvent être utilisés dans le dernier composant du chemin. Si le dossier n’est pas trouvé, alors une erreur se produira.
Cette méthode s’arrête à la première erreur qu’elle rencontre. Il n’y a pas de retour en arrière des actions qui ont réussi avant que l’erreur ne survienne.
Autres méthodes de l’OFS
OpenAsTextStream.
Cette méthode ouvre un fichier spécifié en tant qu’objet Text Stream et permet de le lire ou d’y écrire. L’avantage de cette méthode est qu’elle peut ouvrir tout type de fichier et extraire le texte disponible.
La syntaxe est :
OpenAsTextStream (])
Le paramètre ‘iomode’ permet la lecture seule (1), la lecture/écriture (2) et l’ajout (8). Le paramètre lecture/écriture écrase le fichier.
Le paramètre ‘format’ est défini sur -2 pour la valeur par défaut du système, -1 pour ouvrir le fichier en Unicode, et 0 pour ouvrir le fichier en ASCII (American Standard Code for Information Interchange).
Sub TextStream()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")Set ts = f.OpenAsTextStream(2)ts.Write "My new text"ts.CloseSet ts = f.OpenAsTextStream(1)s = ts.ReadLineMsgBox sts.CloseEnd Sub
Ce code obtient un fichier texte existant et le crée en tant qu’objet en utilisant la méthode ‘GetFile’. Il ouvre ensuite le flux de texte en lecture / écriture (2) et écrit une ligne de texte. Le fichier est ensuite fermé et rouvert en tant que read (1) et une ligne est lue à partir de celui-ci, qui est ensuite affichée comme une boîte de message.
Notez que la ligne lue doit être placée dans une variable avant de pouvoir être affichée dans une boîte de message.
BuildPath
Cette méthode ajoutera un nom de dossier ou de fichier à la fin d’un chemin de dossier existant. Cela ne crée qu’une chaîne de texte et ne crée pas réellement le nouveau dossier.
La syntaxe est:
BuildPath (chemin, nom)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
Ceci affichera ‘C:\\\\NouveauDossier’. Cependant, si vous voulez réellement utiliser ce dossier, vous devez utiliser la méthode ‘CreateFolder’.
OpenTextFile
Cette méthode permet d’ouvrir des fichiers et de les lire ou d’y écrire selon des paramètres définis. Elle fonctionne de manière similaire à la méthode OpenAsTextStream.
La syntaxe est :
OpenTextFile (nom de fichier, ]])
Le paramètre ‘iomode’ permet ForReading, ForWriting, et ForAppending. Le paramètre ForWriting écrase le fichier.
Le paramètre ‘create’ est une valeur booléenne. True signifie qu’un nouveau fichier sera créé si le nom de fichier spécifié n’existe pas. False signifie qu’aucun fichier ne sera créé si le nom de fichier n’est pas trouvé. La valeur par défaut est False.
Le paramètre ‘format’ peut être défini sur TristateFalse, TristateMixed, TristateTrue et TristateUseDefault selon que le fichier est ASCII ou Unicode.
Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub
Ce code va lire une ligne du fichier texte ‘monfichier.txt’.
Un avantage que la méthode OpenTextFile a par rapport à la méthode OpenAsTextStreamMethod est qu’elle a des menus déroulants pour les paramètres, qui sont plus significatifs que d’essayer de se rappeler les valeurs numériques appropriées pour les diverses options de paramètres.
Propriétés de l’OFS
Drives
Cette propriété détient une collection de lecteurs disponibles sur votre ordinateur.
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
Ce code renverra chaque lettre de lecteur disponible sur votre ordinateur.
Name
Ce code renvoie le nom d’un fichier ou d’un dossier spécifié.
Sub NameExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
Ce code donnera le nom du fichier et des informations à son sujet en utilisant la propriété Drive.
Path
La propriété Path séparera le chemin d’accès d’une spécification de fichier.
Sub PathExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
Cet exemple fonctionne de la même manière que l’exemple Name, sauf qu’il fournit maintenant le chemin du fichier.
Size
La propriété Size donnera la taille d’un dossier ou d’un fichier.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
Ce code ci-dessus retournera la taille du dossier ‘C:\temp\’.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
Ce code ci-dessus retournera la taille du fichier ‘monfichier.txt’.
Type
La propriété type renvoie le texte correspondant au type de fichier ou de dossier.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
Ce code ci-dessus renvoie le texte ‘Dossier de fichiers’.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
Ce code ci-dessus renvoie le texte ‘Document texte’.
Notez l’utilisation de ‘GetFolder’ et ‘GetFile’ dans chaque exemple.