Utilisation de VBA FileSystemObject (FSO) dans Excel - Présentation simple et exemples

Lorsque nous utilisons VBA dans Excel, l'essentiel est d'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 éléments extérieurs à Excel.

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

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érifiez si un fichier ou un dossier existe.
  • Créez ou renommez des dossiers/fichiers.
  • Obtenez une liste de tous les noms de fichiers (ou noms de sous-dossiers) dans un dossier.
  • Copiez des fichiers d'un dossier à un autre.

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

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

Bien que certaines des choses mentionnées ci-dessus puissent également être effectuées à l'aide de fonctions et de méthodes VBA traditionnelles (telles que la fonction DIR), cela conduirait à des codes plus longs et plus compliqués. FileSystemObject facilite le travail avec les fichiers et les dossiers tout en gardant le code propre et court.

Remarque : FSO ne peut être utilisé que dans Excel 2000 et les versions ultérieures.

À quels objets pouvez-vous accéder via FileSystemObject ?

Comme je l'ai mentionné ci-dessus, vous pouvez accéder et modifier des fichiers et des dossiers à l'aide de FileSystemObject dans VBA.

Le tableau ci-dessous présente les objets les plus importants auxquels vous pouvez accéder et modifier à l'aide de FSO :

Objet La description
Conduire Drive Object vous permet d'obtenir des informations sur le lecteur telles que s'il existe ou non, son nom de chemin, le type de lecteur (amovible ou fixe), sa taille, etc.
Dossier L'objet Dossier 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 à l'aide de cet objet.
Fichier L'objet fichier vous permet de travailler avec les fichiers de votre système. Par exemple, vous pouvez créer, ouvrir, copier, déplacer et supprimer des fichiers à l'aide de cet objet.
TextStream L'objet TextStream vous permet de créer ou de lire des fichiers texte.

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

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

Ne vous inquiétez pas si cela semble accablant ou difficile à comprendre. Vous obtiendrez une bien meilleure compréhension lorsque vous parcourrez les exemples que j'ai traités dans ce didacticiel.

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

Activation de FileSystemObject dans Excel VBA

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

Puisque nous avons affaire à des fichiers et des dossiers qui se trouvent en dehors de l'application Excel, nous devons d'abord créer une référence à la bibliothèque qui contient ces objets (lecteurs, fichiers, dossiers).

Il existe maintenant deux manières de commencer à utiliser FileSystemObject dans Excel VBA :

  1. Définition de la référence à la bibliothèque Microsoft Scripting Runtime (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 vais vous montrer comment procéder ensuite), je recommande d'utiliser la première méthode.

Remarque : lorsque vous activez FileSystemObject, vous pouvez accéder à tous les objets qu'il contient. Cela inclut FileSystemObject, Drive, Files, Folders, etc. Je me concentrerai principalement sur FileSystemObject dans ce didacticiel.

Définition de la référence à la bibliothèque Microsoft Scripting Runtime

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

Vous trouverez ci-dessous les étapes pour créer une référence à la bibliothèque Microsoft Scripting Runtime :

  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 permettent maintenant de vous référer aux objets FSO d'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.

Vous trouverez ci-dessous le code qui définira la variable d'objet MyFSO en tant qu'objet FileSystemObject :

Sub CreationFSO() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject End Sub

Dans ce code, j'ai d'abord déclaré la variable MyFSO en tant qu'objet de type FileSystemObject. Cela n'est possible que parce que j'ai créé une référence à la bibliothèque Microsoft Scripting Runtime. 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 de FileSystemObject. Cela signifie que maintenant je peux utiliser toutes les méthodes de FileSystemObject pour travailler avec des fichiers et des 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 sur cette nouvelle instance de FileSystemObject. Cela me permet d'utiliser cet objet pour accéder aux fichiers et 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 CreationFSO() Dim MyFSO As New FileSystemObject End Sub

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

Ce n'est pas possible lorsque vous créez la référence à partir du code (voir 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 de référence (comme dans la méthode précédente).

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

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

Sub FSODemo() Dim FSO As Object Set 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 n'afficherait pas d'IntelliSense lorsque vous travaillez avec des objets dans FSO. Pour moi, c'est un énorme point négatif et je recommande toujours d'utiliser la méthode précédente d'activation de FSO (qui consiste à définir la référence au « Microsoft Scripting Runtime »)

Exemples d'objets système de fichiers VBA

Examinons maintenant 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 True et un message "Le dossier existe" s'affiche 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 FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "Le dossier existe" Else MsgBox "Le dossier n'existe pas" End If End Sous

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

Le code ci-dessous vérifie s'il existe ou non un fichier portant le nom Test.xlsx dans le dossier spécifié.

Sub CheckFileExist() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "Le fichier existe" Sinon MsgBox "Le fichier n'existe pas " End If End Sub

Exemple 2 : créer un nouveau dossier à l'emplacement spécifié

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

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

Bien que ce code fonctionne correctement, il afficherait une erreur au 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. Si le dossier existe déjà, il affiche un message. Pour vérifier si le dossier existe, j'ai utilisé le Méthode FolderExists de l'OFS.

Sub CreateFolder() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "Le dossier existe déjà" Sinon MyFSO.CreateFolder ("C:\Users\ sumit\Desktop\Test") End If End Sub

Exemple 3 : obtenir une liste de tous les fichiers d'un dossier

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

Sub GetFileNames() Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test") pour chaque MyFile dans MyFolder.Files Debug.Print MyFile.Name Next MyFile End Sub

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

Comme je l'ai mentionné ci-dessus dans ce didacticiel, lorsque vous référencez la 'Microsoft Scripting Runtime Library', vous pouvez utiliser FileSystemObject ainsi que tous les autres objets (tels que les fichiers et les dossiers).

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 répertorié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 décrite dans l'exemple ci-dessus. Au lieu de fichiers, dans ce code, nous avons utilisé des sous-dossiers.

Sub GetSubFolderNames() Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test") pour chaque MySubFolder Dans MyFolder.SubFolders Debug.Print MySubFolder.Name Next MySubFolder End 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 FileSystemObject Dim SourceFile As String Dim DestinationFolder As String Set MyFSO = New Scripting.FileSystemObject SourceFile = "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 ne suffit pas de donner le nom du dossier de destination lorsque vous copiez un fichier. Vous devez également spécifier le nom du fichier. Vous pouvez utiliser le même nom de fichier ou le modifier. Dans l'exemple ci-dessus, j'ai copié le fichier et 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 FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C:\Users\sumit\Desktop\Source" DestinationFolder = "C:\Users\ sumit\Desktop\Destination" Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder(SourceFolder) Pour chaque MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\ " & MyFile.Name, Overwritefiles:=False Next MyFile End 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' était False (c'est True par défaut). Cela garantit que si vous avez déjà le fichier dans le dossier, il n'est pas copié (et vous verrez une erreur). Si vous supprimez « Overwritefiles » ou définissez cette valeur sur True, au cas où il y aurait des fichiers dans le dossier de destination portant le même nom, ceux-ci seraient écrasés.

Conseil de pro : Lors de la copie de fichiers, il y a toujours un risque d'écrasement des fichiers. Une bonne idée, dans ce cas, est d'ajouter l'horodatage avec 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 souhaitez copier les fichiers d'une certaine extension uniquement, 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 FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C:\Users\sumit\Desktop\Source" DestinationFolder = "C:\Users\ sumit\Desktop\Destination" Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder(SourceFolder) pour chaque MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile (MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End If Next MyFile End Sub

Méthodes FileSystemObject (FSO)

Voici les méthodes que vous pouvez utiliser pour chaque objet. Ceci est juste à titre de référence et ne vous inquiétez pas trop à ce sujet. L'utilisation de certains d'entre eux a été montrée dans les exemples couverts ci-dessus.

Méthodes OFS Pour l'objet La description
DriveExists Conduire Vérifie si le lecteur existe ou non
GetDrive Conduire Renvoie une instance de l'objet lecteur en fonction du chemin spécifié
Obtenir le nom du lecteur Conduire Réexécute le nom du lecteur
Chemin de construction Dossier de fichiers Générer un chemin à partir d'un chemin existant et d'un nom
Copier un fichier Dossier de fichiers Copie un fichier
GetAbsolutePathName Dossier de fichiers Renvoie la représentation canonique du chemin
ObtenirNomBase Dossier de fichiers Renvoie le nom de base à partir d'un chemin. Par exemple, "D:\TestFolder\TestFile.xlsm" renverra TextFile.xlsm
ObtenirNomTemp Dossier de fichiers Générer un nom pouvant être utilisé pour nommer un fichier temporaire
Copiez le dossier Dossier Copie un dossier d'un emplacement à un autre
Créer le dossier Dossier Crée un nouveau dossier
Supprimer le dossier Dossier Supprime le dossier spécifié
Le dossier existe Dossier Vérifie si le dossier existe ou non
ObtenirDossier Dossier Renvoie une instance de l'objet dossier en fonction du chemin spécifié
Obtenir le nom du dossierParent Dossier Renvoie le nom du dossier parent en fonction du chemin spécifié
ObtenirDossierSpécial Dossier Obtenez l'emplacement de divers dossiers système.
DéplacerDossier Dossier Déplace un dossier d'un emplacement à un autre
Supprimer le fichier Fichier Supprime un fichier
Le fichier existe Fichier Vérifie si un fichier existe ou non
ObtenirNomExtension Fichier Renvoie l'extension de fichier
ObtenirFichier Fichier Renvoie l'instance d'un objet fichier en fonction du chemin spécifié
ObtenirNomFichier Fichier Renvoie le nom du fichier
ObtenirVersionFichier Fichier Renvoie la version du fichier
DéplacerFichier Fichier Déplace un fichier
CréerFichierTexte Fichier Crée un fichier texte
GetStandardStream Fichier Récupérer le flux d'entrée, de sortie ou d'erreur standard
OuvrirFichierTexte Fichier Ouvrir un fichier en tant que TextStream

Vous contribuerez au développement du site, partager la page avec vos amis

wave wave wave wave wave