Utiliser VBA FileSystemObject (FSO) dans Excel – Présentation et exemples faciles

Lorsque nous utilisons VBA dans Excel, la plupart du temps c’est pour automatiser nos tâches.

Cela signifie également que la plupart du temps, nous travaillons avec des cellules et des plages, des feuilles de calcul, des classeurs et d’autres objets qui font partie de l’application Excel.

Mais VBA est beaucoup plus puissant et peut également être utilisé pour travailler avec des choses en dehors d’Excel.

Dans ce tutoriel, je vais vous montrer comment utiliser VBA FileSystemObject (FSO) pour travailler avec des fichiers et des dossiers sur votre système ou des lecteurs réseau.

Ce tutoriel couvre :

Qu’est-ce que VBA FileSystemObject (FSO) ?

FileSystemObject (FSO) vous permet d’accéder au système de fichiers de votre ordinateur. En l’utilisant, vous pouvez accéder et modifier les fichiers/dossiers/répertoires de votre système informatique.

Par exemple, voici certaines des choses que vous pouvez faire en utilisant FileSystemObject dans Excel VBA:

  • Vérifier si un fichier ou un dossier existe.
  • Créer ou renommer des dossiers/fichiers.
  • Avoir une liste de tous les noms de fichiers (ou noms de sous-dossiers) dans un dossier.
  • Copier des fichiers d’un dossier à un autre.

J’espère que vous avez compris l’idée.

Je couvrirai tous ces exemples ci-dessus (plus d’autres) plus tard dans ce tutoriel.

Bien que certaines des choses mentionnées ci-dessus puissent également être faites en utilisant des fonctions VBA traditionnelles (comme la fonction DIR) et des méthodes, cela conduirait à des codes plus longs et plus compliqués. FileSystemObject permet de travailler facilement avec des fichiers et des dossiers tout en gardant le code propre et court.

Note: FSO can only be used in Excel 2000 and later versions.

Quels sont tous les objets auxquels vous pouvez accéder grâce à FileSystemObject ?

Comme je l’ai mentionné ci-dessus, vous pouvez accéder et modifier les fichiers et les dossiers en utilisant le FileSystemObject en VBA.

Vous trouverez ci-dessous un tableau qui montre les objets les plus importants auxquels vous pouvez accéder et que vous pouvez modifier en utilisant FSO:

Objet Description
Drive L’objet Drive vous permet d’obtenir des informations sur le lecteur comme s’il existe ou non, son nom de chemin, son type de lecteur (amovible ou fixe), sa taille, etc.
Folder L’objet Folder vous permet de créer ou de modifier des dossiers dans votre système. Par exemple, vous pouvez créer, supprimer, renommer, copier des dossiers en utilisant cet objet.
File L’objet File vous permet de travailler avec des fichiers dans votre système. Par exemple, vous pouvez créer, ouvrir, copier, déplacer et supprimer des fichiers en utilisant cet objet.
TextStream L’objetTextStream vous permet de créer ou de lire des fichiers texte.

Chacun des objets ci-dessus possède des méthodes que vous pouvez utiliser pour travailler avec ceux-ci.

Pour vous donner un exemple, si vous voulez supprimer un dossier, vous utiliserez la méthode DeleteFolder de l’objet Folder. De même, si vous voulez copier un fichier, vous utiliserez la méthode CopyFile de l’objet File.

Ne vous inquiétez pas si cela vous semble écrasant ou difficile à comprendre. Vous aurez une bien meilleure compréhension lorsque vous passerez par les exemples que j’ai couverts dans ce tutoriel.

Juste à des fins de référence, j’ai couvert toutes les méthodes de FileSystemObject (pour chaque objet) à la fin de ce tutoriel.

Activer FileSystemObject dans Excel VBA

FileSystemObject n’est pas disponible par défaut dans Excel VBA.

Puisque nous traitons des fichiers et des dossiers qui sont en dehors de l’application Excel, nous devons d’abord créer une référence à la bibliothèque qui détient ces objets (lecteurs, fichiers, dossiers).

Maintenant, il y a deux façons de commencer à utiliser FileSystemObject dans Excel VBA:

  1. Définir la référence à la bibliothèque Microsoft Scripting Runtime Library (Scrrun.dll)
  2. Créer un objet pour faire référence à la bibliothèque à partir du code lui-même

Bien que ces deux méthodes fonctionnent (et je vous montrerai comment faire ensuite), je recommande d’utiliser la première méthode.

Note : Lorsque vous activez FileSystemObject, vous pouvez accéder à tous les objets qu’il contient. Cela inclut le FileSystemObject, le lecteur, les fichiers, les dossiers, etc. Je me concentrerai principalement sur le FileSystemObject dans ce tutoriel.

Mise en place de la référence à la bibliothèque d’exécution des scripts de Microsoft

Lorsque vous créez une référence à la bibliothèque d’exécution des scripts, vous permettez à Excel VBA l’accès à toutes les propriétés et méthodes des fichiers et du dossier. Une fois que c’est fait, vous pouvez faire référence à l’objet fichiers/dossiers/lecteurs à partir de l’Excel VBA (tout comme vous pouvez faire référence aux cellules, aux feuilles de calcul ou aux classeurs).

Voici les étapes pour créer une référence à la bibliothèque d’exécution des scripts de Microsoft :

  1. Dans l’éditeur VB, cliquez sur Outils.
  2. Cliquez sur Références.
  3. Dans la boîte de dialogue Références qui s’ouvre, faites défiler les références disponibles et cochez l’option ‘Microsoft Scripting Runtime’.
  4. Cliquez sur OK.

Les étapes ci-dessus vous permettraient maintenant de faire référence aux objets FSO depuis Excel VBA.

Création d’une instance de FileSystemObject dans le code

Une fois que vous avez défini la référence à la bibliothèque Scripting FileSystemObject, vous devez créer une instance de l’objet FSO dans votre code.

Une fois celui-ci créé, vous pouvez l’utiliser en VBA.

Voici le code qui va définir la variable objet MyFSO comme un objet de type FileSystemObject :

Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub

Dans ce code, j’ai d’abord déclaré la variable MyFSO comme un objet de type FileSystemObject. Cela n’est possible que parce que j’ai créé une référence à la bibliothèque d’exécution de Microsoft Scripting. Si la référence n’est pas créée, cela va vous donner une erreur (car Excel ne reconnaîtrait pas ce que signifie FileSystemObject).

Dans la deuxième ligne, deux choses se produisent :

  1. Le mot clé NEW crée une instance du FileSystemObject. Cela signifie que maintenant je peux utiliser toutes les méthodes de FileSystemObject pour travailler avec les fichiers et les dossiers. Si vous ne créez pas cette instance, vous ne pourrez pas accéder aux méthodes de FSO.
  2. Le mot clé SET définit l’objet MyFSO à cette nouvelle instance de FileSystemObject. Cela me permet d’utiliser cet objet pour accéder aux fichiers et aux dossiers. Par exemple, si j’ai besoin de créer un dossier, je peux utiliser la méthode MyFSO.CreateFolder.

Si vous le souhaitez, vous pouvez également combiner les deux déclarations ci-dessus en une seule comme indiqué ci-dessous :

Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub

Un grand avantage de l’utilisation de cette méthode (qui consiste à définir la référence à la bibliothèque d’exécution de Microsoft Scripting) est que lorsque vous utilisez les objets FSO dans votre code, vous serez en mesure d’utiliser la fonctionnalité IntelliSense qui montre les méthodes et les propriétés associées à un objet (comme indiqué ci-dessous).

Ce n’est pas possible lorsque vous créez la référence à partir du code (couvert ensuite).

Créer un objet à partir du code

Une autre façon de créer une référence à FSO est de le faire à partir du code. Dans cette méthode, vous n’avez pas besoin de créer une référence (comme fait dans la méthode précédente).

Lorsque vous écrivez le code, vous pouvez créer un objet à partir du code et faire référence au Scripting.FileSystemObject.

Le code ci-dessous crée un objet FSO et en fait ensuite un type FileSystemObject.

Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub

Bien que cela puisse sembler plus pratique, un gros inconvénient de l’utilisation de cette méthode est qu’elle ne montrerait pas un IntelliSense lorsque vous travaillez avec des objets dans FSO. Pour moi, c’est un énorme négatif et je recommande toujours d’utiliser la méthode précédente d’activation de l’OFS (qui consiste à définir la référence au ‘Microsoft Scripting Runtime’)

VBA FileSystemObject Examples

Maintenant, plongeons et regardons quelques exemples pratiques d’utilisation de FileSystemObject dans Excel.

Exemple 1 : Vérifier si un fichier ou un dossier existe

Le code suivant vérifiera si le dossier portant le nom ‘Test’ existe ou non (à l’emplacement spécifié).

Si le dossier existe, la condition IF est vraie et elle affiche un message – ‘Le dossier existe’ dans une boîte de message. Et s’il n’existe pas, il affiche un message – ‘Le dossier n’existe pas’.

Sub CheckFolderExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Exists"Else MsgBox "The Folder Does Not Exist"End IfEnd Sub

De même, vous pouvez également vérifier si un fichier existe ou non.

Le code ci-dessous vérifie s’il y a un fichier avec le nom Test.xlsx dans le dossier spécifié ou non.

Sub CheckFileExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "The File Exists"Else MsgBox "The File Does Not Exist"End IfEnd Sub

Exemple 2 : Créer un nouveau dossier dans l’emplacement spécifié

Le code ci-dessous créerait un dossier avec le nom ‘Test’ dans le lecteur C de mon système (vous devrez spécifier le chemin sur votre système où vous voulez créer le dossier).

Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub

Bien que ce code fonctionne bien, il afficherait une erreur dans le cas où le dossier existe déjà.

Le code ci-dessous vérifie si le dossier existe déjà et crée un dossier si ce n’est pas le cas. Dans le cas où le dossier existe déjà, il affiche un message. Pour vérifier si le dossier existe, j’ai utilisé la méthode FolderExists de l’OFS.

Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Already Exist"Else MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End IfEnd Sub

Exemple 3 : Obtenir une liste de tous les fichiers dans un dossier

Le code ci-dessous afficherait les noms de tous les fichiers dans le dossier spécifié.

Sub GetFileNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MyFile In MyFolder.Files Debug.Print MyFile.NameNext MyFileEnd Sub

Ce code est un peu plus complexe que ceux que nous avons déjà vus.

Comme je l’ai mentionné plus haut dans ce tutoriel, lorsque vous faites référence à la ‘Microsoft Scripting Runtime Library’, vous pouvez utiliser FileSystemObject ainsi que tous les autres objets (tels que Files et Folders).

Dans le code ci-dessus, j’utilise trois objets – FileSystemObject, File, et Folder. Cela me permet de parcourir chaque fichier dans le dossier spécifié. J’utilise ensuite la propriété name pour obtenir la liste de tous les noms de fichiers.

Notez que j’utilise Debug.Print pour obtenir les noms de tous les fichiers. Ces noms seront listés dans la fenêtre immédiate de l’éditeur VB.

Exemple 4 : obtenir la liste de tous les sous-dossiers d’un dossier

Le code ci-dessous donnera les noms de tous les sous-dossiers du dossier spécifié. La logique est exactement la même que celle couverte dans l’exemple ci-dessus. Au lieu de fichiers, dans ce code, nous avons utilisé des sous-dossiers.

Sub GetSubFolderNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderDim MySubFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.NameNext MySubFolderEnd Sub

Exemple 5 : Copier un fichier d’un endroit à un autre

Le code ci-dessous copiera le fichier du dossier ‘Source’ et le copiera dans le dossier ‘Destination’.

Sub CopyFile()Dim MyFSO As FileSystemObjectDim SourceFile As StringDim DestinationFolder As StringSet MyFSO = New Scripting.FileSystemObjectSourceFile = "C:\Users\sumit\Desktop\Source\SampleFile.xlsx"DestinationFolder = "C:\Users\sumit\Desktop\Destination"MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "\SampleFileCopy.xlsx"End Sub

Dans le code ci-dessus, j’ai utilisé deux variables – SourceFile et DestinationFolder.

Le fichier source contient l’adresse du fichier que je veux copier et la variable DestinationFolder contient l’adresse du dossier dans lequel je veux que le fichier soit copié.

Notez qu’il n’est pas suffisant de donner le nom du dossier de destination lorsque vous copiez un fichier. Vous devez également préciser le nom du fichier. Vous pouvez utiliser le même nom de fichier ou vous pouvez également le changer. Dans l’exemple ci-dessus, j’ai copié le fichier et je l’ai nommé SampleFileCopy.xlsx

Exemple 6 : Copier tous les fichiers d’un dossier à un autre

Le code ci-dessous copiera tous les fichiers du dossier Source vers le dossier de destination.

Sub CopyAllFiles()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=FalseNext MyFileEnd Sub

Le code ci-dessus copiera tous les fichiers du dossier source vers le dossier de destination.

Notez que dans la méthode MyFSO.CopyFile, j’ai spécifié que la propriété ‘Overwritefiles’ est False (elle est True par défaut). Cela permet de s’assurer que dans le cas où vous avez déjà le fichier dans le dossier, il n’est pas copié (et vous verrez une erreur). Si vous supprimez ‘Overwritefiles’ ou le définissez sur True, au cas où il y aurait des fichiers dans le dossier de destination avec le même nom, ceux-ci seraient écrasés.

Conseil de pro : Lors de la copie de fichiers, il y a toujours une chance d’écraser des fichiers. Une bonne idée, dans ce cas, est d’ajouter l’horodatage en même temps que le nom. Cela garantira que les noms sont toujours différents et vous pouvez facilement suivre quels fichiers ont été copiés à quel moment.

Si vous voulez copier les fichiers d’une certaine extension seulement, vous pouvez le faire en utilisant une instruction IF Then pour vérifier si l’extension est xlsx ou non.

Sub CopyExcelFilesOnly()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End IfNext MyFileEnd Sub

Méthodes de FileSystemObject (FSO)

Voici les méthodes que vous pouvez utiliser pour chaque objet. Ceci est juste à titre de référence et ne s’en préoccupe pas trop. L’utilisation de certaines d’entre elles a été montrée dans les exemples couverts ci-dessus.

.

.

.

.

.

.

.

Méthodes FSO Pour objet Description
DriveExists Drive Vérifie si le lecteur existe ou non
GetDrive Drive Retourne une instance de l’objet lecteur basée sur le chemin spécifié
GetDriveName Drive Retourne le nom du lecteur
BuildPath File/Folder Génère un chemin à partir d’un chemin existant et d’un nom
CopyFile File/Folder Copie un fichier
GetAbsolutePathName File/Folder Retourne la représentation canonique du chemin
GetBaseName File/Folder Retourne le nom de base d’un chemin. Par exemple, « D:\TestFolder\TestFile.xlsm » retournera TextFile.xlsm
GetTempName Fichier/Dossier Génère un nom qui peut être utilisé pour nommer un fichier temporaire
CopyFolder Dossier Copie un dossier d’un emplacement à un autre. autre
CreateFolder Dossier Création d’un nouveau dossier
DeleteFolder Dossier Suppression du dossier spécifié
FolderExists Dossier Vérifie si le dossier existe ou non
GetFolder Dossier Retourne une instance de l’objet dossier sur la base du chemin spécifié
GetParentFolderName Folder Retourne le nom du dossier parent en fonction du chemin spécifié
GetSpecialFolder Folder Retourne l’emplacement de divers dossiers système.
MoveFolder Dossier Déplace un dossier d’un emplacement à un autre
DeleteFile File Supprime un fichier
FileExists Fichier Vérifie si un fichier existe ou non
GetExtensionName Fichier Retourne l’extension du fichier
GetFile Fichier Retourne l’instance d’un objet de fichier basé sur le chemin spécifié
GetFileName File Retourne le nom du fichier
GetFileVersion File Retourne la version du fichier
MoveFile File Déplace un fichier
CreateTextFile File Création d’un fichier texte
GetStandardStream File Récupère l’entrée standard, sortie ou d’erreur standard
OpenTextFile File Ouvrir un fichier en tant que TextStream

Vous aimerez peut-être aussi les tutoriels Excel suivants :

  • Obtenir une liste de noms de fichiers à partir de dossiers & Sous-dossiers (en utilisant Power Query).
  • Obtenir la liste des noms de fichiers d’un dossier dans Excel (avec et sans VBA).
  • Comprendre les types de données Excel VBA (variables et constantes).
  • Créer une fonction définie par l’utilisateur (UDF) dans Excel VBA.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.