Fic Hiers

Embed Size (px)

Citation preview

  • 7/22/2019 Fic Hiers

    1/29

    Manipulation des fichiers en VBA

    par Christophe WARIN

    Date de publication : 7/12/2006

    Dernire mise jour : 7/12/2006

    A travers ce document, je vous propose d'tudier les diffrentes techniquesde manipulation des fichiers en VBA. Au sommaire : Gestion des disques,des dossiers, des fichiers Manipulation des fichiers textes Recherche defichiers

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    2/29

  • 7/22/2019 Fic Hiers

    3/29

    I - Le FileSystemObject

    I-A - Introduction

    VBA propose des mthodes pour travailler sur les fichiers. Ces fonctions de bases telles que Dir, Name, etc. ont uncomportement proche des commandes DOS. Malheureusement, elles sont beaucoup trop limites et permettent,hlas, que trs peu d'actions ou bien alors au prix d'un code lourd maintenir. Afin d'tendre les possibilits en cequi concerne la manipulation des fichiers et des rpertoires, Microsoft mis au point un ensemble d'objetsregroups au sein de la librairie Microsoft Scripting Runtime. Cet ensemble de classe hirarchique possde uneunique racine : le FileSystemObject, plus communment connu sous le nom de FSO.

    Bien qu'il s'agisse en fait du nom d'une classe, il n'est pas rare de voir le mot FSO dsigner la techniqued'accs aux fichiers dans sa globalit.

    La hirarchie des objets de cette librairie peut tre compare celle de l'explorateur Windows : des fichiers inclusdans des dossiers qui eux-mmes sont inclus dans des disques. Le FSO peut alors tre illustr par le poste detravail : il donne accs aux disques.

    Etant donn que le FSO est la base de tout ce modle, il ne peut driver d'aucun objet. Par consquent, il doit treinstanci par le mot cl New. Les autres objets seront instanci par des fonctions de cet lment matre (oud'autres sous-lments).

    Dim oFSO As Scripting.FileSystemObjectDim oDrv As Scripting.Drive'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation d'un objet enfantSet oDrv = oFSO.Drives(1)

    N'oubliez pas d'ajouter la rfrence Microsoft Scripting Runtime votre projet sans quoi une erreur sera leve.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 3 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    4/29

    I-B - Gestion des disques

    La collection Drives de l'objet FileSystemObject donne accs l'ensemble des disques reconnus par le systmed'exploitation. Chaque disque correspond alors un objet Drive distinct et son identifiant au sein de la collection estdtermin par sa lettre d'accs (C, D, E, etc.).

    Bien entendu, vous ne pouvez pas agir en criture sur cette collection. L'ajout et la suppression d'objet y est doncimpossible.

    I-B-1 - Accder un disque

    La mthode DriveExists expose par la classe FileSystemObject teste l'existence d'un disque en fonction de sonnom.

    Dim oFSO As Scripting.FileSystemObjectDim oDrv As Scripting.Drive'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation d'un objet drive correspondant au disque CIf oFSO.DriveExists( "C") Then

    Set oDrv = oFSO.GetDrive("C")Else

    MsgBox "Ce disque n'existe pas"End If

    Une autre possibilit est d'utiliser directement la rfrence la collection Drives :

    Dim oFSO As Scripting.FileSystemObjectDim oDrv As Scripting.Drive'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation d'un objet drive correspondant au disque CIf oFSO.DriveExists( "C") Then

    Set oDrv = oFSO.Drives("C")Else

    MsgBox "Ce disque n'existe pas"End If

    Si le disque n'existe pas, les deux mthodes lveront la mme erreur : erreur n5, appel de procdure incorrect.

    Attention, il s'agit d'accder ici un disque ou plutt une unit de disque. Si aucun CD n'est prsent dans lelecteur de CD-ROM, aucune erreur ne sera gnre. A ce stade, on ne sait pas si l'unit est accessible.

    I-B-2 - Lister les disques

    Une boucle For Each permet d'numrer l'ensemble des units de disques :

    Dim oFSO As Scripting.FileSystemObjectDim oDrv As Scripting.Drive'Instanciation du FSOSet oFSO = New Scripting.FileSystemObjectFor Each oDrv In oFSO.Drives

    MsgBox oDrv.DriveLetterNext oDrv

    I-B-3 - Les proprits des disques

    Manipulation des fichiers en VBA par Christophe WARIN

    - 4 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    5/29

    DriveLetter : Lettre utilis par le systme d'exploitation pour accder au disque. Il s'agit de la cl de la collectionDrives. Exemple : D

    DriveType : Type du disque (CDRom,Fixed,RamDisk,Remote,Removable,UnknownType)

    FileSystem : Type du systme de fichier du disque. Exemple : NTFS.

    AvailableSpace, FreeSpace : Espace disponible et espace libre en octets

    IsReady : Boolen indiquant si l'unit de disque est disponible. Dans le cas d'un lecteur de CD-ROM, ellepermettra de savoir si un disque est prsent ou pas.

    Path : Chemin de l'unit de disque. Exemple : "D :"

    RootFolder : Retourne un objet Folder correspondant au dossier racine du disque. C'est cet objet qui donne accs l'ensemble des autres dossiers prsent sur le disque. Le path de ce dossier est alors : Drive.Path & \. ExempleD:\

    SerialNumber : Numro de srie du disque. Exemple : 1154367849

    ShareName : Retourne une chane de caractres correspondant au nom de partage du disque. Cette chaine seranulle si le disque n'est pas partag. Exemple : Partage_Donnees

    VolumeName : Retourne le nom du volume (et non de l'unit) dans une chane de caractres. Exemple : Donnees

    TotalSize : Taille du disque en octets

    Les objetsDrivene possde pas de mthodes.

    I-B-4 - Quelques exemples de traitements sur les disques

    Voici un exemple de fonction permettant de connatre le nombre de lecteur de CD-ROM (virtuels compris) installssur la machine :

    Function NBLecteurCd() As IntegerDim oFSO As Scripting.FileSystemObjectDim oDrv As Scripting.Drive'Instanciation du FSO

    Set oFSO = New Scripting.FileSystemObjectFor Each oDrv In oFSO.DrivesIf oDrv.DriveType = CDRom Then NBLecteurCd = NBLecteurCd + 1

    Next oDrvEnd Function

    Autre exemple : Retourner la lettre du disque dur contenant le plus de place disponible. Cela peut s'avrer pratiquepour une sauvegarde.

    Function LecteurLibre() As StringDim oFSO As Scripting.FileSystemObjectDim oDrv As Scripting.DriveDim intFree As Double'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Parcours les disques

    Manipulation des fichiers en VBA par Christophe WARIN

    - 5 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    6/29

    For Each oDrv In oFSO.Drives'Si c'est un disque dur et s'il contient un filesystem valide (format)If oDrv.DriveType = Fixed And oDrv.IsReady Then

    'Si la taille libre est suprieure intFree, alors remplacer

    If oDrv.FreeSpace > intFree ThenintFree = oDrv.FreeSpaceLecteurLibre = oDrv.DriveLetter

    End IfEnd If

    Next oDrvEnd Function

    Comme vous pouvez le constater dans cet exemple, la manipulation des objets FSO donne un code structur de lamme faon qu'avec DAO : le mme objet est appel de nombreuses fois. Pour cette raison, il est largementconseill de factoriser le code avec des blocs With.

    Function LecteurLibre() As StringDim oFSO As Scripting.FileSystemObjectDim oDrv As Scripting.Drive

    Dim intFree As Double'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Parcours les disquesFor Each oDrv In oFSO.Drives

    With oDrv'Si c'est un disque dur et s'il contient un filesystem valide (format)If .DriveType = Fixed And .IsReady Then

    'Si la taille libre est suprieure intFree, alors remplacerIf .FreeSpace > intFree Then

    intFree = .FreeSpaceLecteurLibre = .DriveLetter

    End IfEnd If

    End WithNext oDrvEnd Function

    I-C - Gestion des dossiers

    Comme pour les disques, nous allons respecter le mme plan. Dans un premier temps nous allons voir commentaccder un dossier et nous traiterons ensuite de l'ensemble des mthodes et proprits des objets Folder.

    I-C-1 - Accder un dossier

    L'accs un dossier (entendez par l instancier un objet Folder), peut se faire de deux manires :

    Directement depuis l'objet FSO Via un dossier parent

    Prenons le cas de l'accs par FSO. La mthode GetFolder(Chemin) retourne un objet Folder correspondant auchemin pass en paramtre.

    Dim oFSO As Scripting.FileSystemObjectDim oFld As Folder

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Accde au dossierSet oFld = oFSO.GetFolder("D:\Windows")

    Si le dossier n'existe pas, une erreur 76 (Chemin d'accs introuvable) sera leve. Elle doit tre traite.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 6 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    7/29

    On Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oFld As Folder

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Accde au dossierSet oFld = oFSO.GetFolder("D:\Windows0")

    fin:

    Exit Function

    err:'Gestion de l'erreur 76If err.Number = 76 Then

    MsgBox "Ce dossier n'existe pas"Else

    MsgBox "Erreur inconnue"End If

    Resume fin

    A noter que l'erreur 76 peut aussi tre vite en vrifiant l'existence du dossier depuis le FSO. (MthodeFolderExists)

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Accde au dossierIf oFSO.FolderExists( "D:\Windows0") Then

    Set oFld = oFSO.GetFolder("D:\Windows0")Else

    MsgBox "Ce dossier n'existe pas"End If

    Cependant, rien ne garantit que le dossier ne soit pas supprim entre le test et la tentative d'accs. Selon moi, lagestion de l'erreur 76 l'aide d'On Error est donc imprative.

    Comme indiqu au dbut de ce chapitre, l'autre technique consiste utiliser la hirarchie des dossiers au sein dusystme de fichiers. Chaque objet Folder possde une proprit SubFolders regroupant ses sous-dossiers. Dansle cas de D:\Windows. Windowsest un dossier enfant du dossier D:\ (le RootFolder de l'objet Drive D)

    Dim oFSO As Scripting.FileSystemObjectDim oDrv As DriveDim oFld As Folder

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation du disqueSet oDrv = oFSO.GetDrive("D")'Accde au dossier Windows de DSet oFld = oDrv.RootFolder.SubFolders("Windows")

    Certes, premire vue cela semble plus complexe (ou tout du moins plus lourd). Cependant, du fait que l'accs audisque est distinct de celui du dossier, nous serons capables de connatre le niveau d'erreur en cas d'chec. End'autres termes, est-ce le disque D qui est indisponible ou bien le rpertoire Windows inexistant ?

    On Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oDrv As DriveDim oFld As Folder

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation du disqueSet oDrv = oFSO.GetDrive("D")'Accde au dossier Windows de DSet oFld = oDrv.RootFolder.SubFolders("Windows")

    Manipulation des fichiers en VBA par Christophe WARIN

    - 7 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    8/29

    fin:

    Exit Function

    err:Select Case err.Number

    Case 5: MsgBox "Le disque n'est pas disponible"Case 76: MsgBox "Le dossier n'existe pas dans ce disque"Case Else: MsgBox "Erreur inconnue"

    End Select

    Resume fin

    I-C-2 - Crer un dossier

    Comme pour l'accs, il est possible d'utiliser deux techniques diffrentes pour crer un dossier :

    Depuis le FSO directement Depuis un autre objet Folder (via sa collection SubFolders)

    Depuis le FSO :

    On Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oDrv As DriveDim oFld As Folder

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Cre le repertoireSet oFld=oFSO.CreateFolder ("D:\Essai")

    fin:Exit Function

    err:Select Case err.Number

    Case 58: MsgBox "Le dossier existe dj"Case 76: MsgBox "Chemin incorrect"Case Else: MsgBox "Erreur inconnue"

    End Select

    Resume fin

    Si le chemin est incorrect (rpertoire parent inexistant, disque inexistant), une erreur 76 (Chemin introuvable) estleve. Si le dossier existe dj, l'opration choue avec l'erreur 58 (Le fichier existe dj). L'objet oFld retourn parla mthode CreateFolder est rutilisable immdiatement dans la suite du code.

    Depuis la collection SubFolders :

    On Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oDrv As Drive

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject

    'Instanciation du disqueSet oDrv = oFSO.GetDrive("D")'Cre le repertoireoDrv.RootFolder.SubFolders.Add ("Essai")

    fin:Exit Function

    Manipulation des fichiers en VBA par Christophe WARIN

    - 8 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    9/29

    err:Select Case err.Number

    Case 5: MsgBox "Le disque n'est pas disponible"

    Case 58: MsgBox "Le dossier existe dj"Case 76: MsgBox "Chemin incorrect"Case Else: MsgBox "Erreur inconnue"

    End Select

    Resume fin

    La diffrence rside une nouvelle fois dans la gestion d'erreur.

    I-C-3 - Les attributs des dossiers

    Si vous tes familier avec DAO, vous vous rappelez sans doute de la proprit Attributes des diffrents objets.Pour rappel, il s'agit de l'addition logique de plusieurs valeurs qualifiants un objet.

    Par exemple, un dossier peut tre cach, cach ET archiv, etc.

    Les valeurs possibles sont :

    Normal ReadOnly : Dossier en lecture seule Hidden : Dossier cach System : Dossier systme Archive : Dossier archiv Compressed : Dossier compress

    Ci-dessous quelques tests possibles :

    'Teste si le dossier est cachIf oFld.Attributes And Directory Then MsgBox "Cach"'Teste si me dossier est cach et en lecture seuleIf oFld.Attributes And (Hidden + ReadOnly) Then MsgBox "Cach et en lecture seule"

    La proprit Attributes est en lecture/criture, cela signifie que vous pouvez modifier les attributs du dossier.

    Exemple pour retirer le mode cach d'un dossier :

    If oFld.Attributes And Hidden ThenoFld.Attributes = oFld.Attributes - Hidden

    End If

    I-C-4 - Les proprits de l'objet Folder

    Attributes : Comme vu prcdemment, attributs du dossier.

    DateCreated : Date de cration du dossier

    DateLastAccessed : Date du dernier accs au dossier

    DateLastModified : Date de dernire modification

    Manipulation des fichiers en VBA par Christophe WARIN

    - 9 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    10/29

    Drive : Objet Drive correspondant l'unit de disque d'o est issu le dossier.

    Files : Collection regroupant les fichiers du dossier

    IsRootFolder : Boolen qui dfinit si le dossier est le dossier racine de son unit de disque.

    Name : Nom du dossier. Exemple : Windows

    ParentFolder : Objet Folder correspondant au dossier parent. Si le dossier est un dossier RootFolder cetteproprit retourne Nothing.

    Path : Chemin complet d'accs au dossier. Exemple : D:\Windows

    ShortName : Nom court sur 8 caractres maximum. Exemple ESSAI1~1

    ShortPath : Chemin complet d'accs au dossier o chaque composant respecte la norme voque pourShortName. Exemple D:\ABCDEF1~1\ ESSAI1~1

    Size : Taille totale du dossier en octets. Il s'agit de la somme de la taille de tous les fichiers prsents dans ledossier et ses sous-dossiers.

    SubFolders : Collection d'objet Folder regroupant les sous-dossiers.

    Type : Type du dossier. Dans tous les cas tests, il s'agit de FileFolder.

    I-C-5 - Les mthodes de l'objet Folder

    I-C-5-a - Copy

    La mthode Copy copie le dossier et son contenu dans un autre (existant ou non).

    Syntaxe :

    Copy(Destination As String, [OverWriteFiles As Boolean = Vrai])

    Destination correspond au chemin valide de destination de la copie. Si OverWriteFiles est True, les fichiersdj prsents dans le rpertoire de destination sont crass s'ils portent le mme nom.

    Exemple :

    oFld.Copy "D:\Essai2", True

    Si le chemin de destination est incorrect, une erreur 76 (Chemin introuvable) est leve. Si OverWriteFiles est False et que la destination possde dj des fichiers du mme nom, une erreur 58 (Le fichier existe dj) estgnre.

    La mthode CopyFolder de l'objet FSO reproduit le mme comportement.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 10 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    11/29

    Exemple :

    oFSO.CopyFolder( "D:\Essai","D:\Essai2",True)

    I-C-5-b - Delete

    La mthode Delete supprime le dossier spcifi.

    Syntaxe :

    Delete([Force As Boolean = Faux])

    Le paramtre Force plac True force la suppression des fichiers en lecture seule prsents dans le dossier et sessous-dossiers. Si Force est False et que certains fichiers sont en lecture seule, une erreur 70 (Permissionrefuse) est gnre. Il en va de mme si un fichier est ouvert.

    Exemple :

    oFld.Delete False

    Il est possible d'utiliser une autre mthode pour supprimer un dossier : la mthode DeleteFolder de l'objetFileSystemObject.

    Exemple :

    oFSO.DeleteFolder "D:\Essai", False

    I-C-5-c - Move

    La mthode Move dplace le dossier spcifi vers une autre destination.

    Syntaxe :

    Move(Destination As String)

    Comme pour la mthode Delete, il ne faut pas qu'un fichier soit ouvert. Si c'est le cas l'erreur 70 sera leve.

    Exemple :

    oFld.Move "D:\essai2"

    Il est possible de dplacer un dossier vers un autre. Toutefois, il ne faut pas que son contenu existe dj dans lacible sans quoi une erreur 58 sera leve.

    L encore, il existe un quivalent utilisable depuis l'objet FSO avec la mthode MoveFolder

    Exemple :

    Manipulation des fichiers en VBA par Christophe WARIN

    - 11 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    12/29

    oFSO.MoveFolder "D:\Essai", "D:\Essai2"

    I-C-5-d - CreateTextFile

    La mthode CreateTextFile permet de crer un fichier texte. Elle sera tudie en dtails plus loin dans ce tutoriel.

    I-C-6 - Les dossiers spciaux

    La mthode GetSpecialFolder permet d'accder des rpertoires particuliers.

    Syntaxe :

    GetSpecialFolder(SpecialFolder As SpecialFolderConst) As Folder

    Les valeurs possibles de SpecialFolder sont :

    WindowsFolder : Dossier o Windows est install SystemFolder : Dossier System (dans Windows) TemporaryFolder : Dossier o stocker les fichiers temporaires

    I-D - La gestion des fichiers

    Il s'agit l de l'lment le plus bas de la hirarchie. Chaque fichier est rprsent par un objet File au sein de lacollection Files d'un objet Folder.

    I-D-1 - Accder un fichier

    Une nouvelle fois, deux mthodes peuvent tre utilises pour retourner un objet File.

    A l'aide de la mthode GetFile du FileSystemObject Depuis la collection Files d'un objet Folder

    Depuis FSO :

    On Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oFl As Scripting.File

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation de l'objet FileSet oFl = oFSO.GetFile("D:\Essai\MonFichier.txt" )

    fin:Exit Function

    err:Select Case err.Number

    Case 53: MsgBox "Le fichier est introuvable"Case Else: MsgBox "Erreur inconnue"

    End Select

    Resume fin

    Manipulation des fichiers en VBA par Christophe WARIN

    - 12 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    13/29

    Attention, si le chemin d'accs au fichier est incorrect, l'erreur 53 (Fichier introuvable) est leve.

    La mthode FileExists permet de tester l'existence du fichier.

    On Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oFl As Scripting.File

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation de l'objet FileIf oFSO.FileExists( "D:\Essai\MonFichier.txt" ) Then

    Set oFl = oFSO.GetFile("D:\Essai\MonFichier.txt" )End If

    fin:Exit Function

    err:Select Case err.Number

    Case 53: MsgBox "Le fichier est introuvable"Case Else: MsgBox "Erreur inconnue"

    End Select

    Resume fin

    Depuis un dossier :

    On Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oFld As Scripting.FolderDim oFl As Scripting.File

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Instanciation du dossier

    Set oFld = oFSO.GetFolder("D:\Essai")'Instanciation de l'objet FileSet oFl = oFld.Files("MonFichier.txt" )

    fin:Exit Function

    err:Select Case err.Number

    Case 76: MsgBox "Le dossier n'existe pas"Case 53: MsgBox "Le fichier est introuvable dans ce dossier"Case Else: MsgBox "Erreur inconnue"

    End Select

    Resume fin

    I-D-2 - Les proprits de l'objet File

    Attributes : Attributs du fichier. Identique la proprit Attributes des dossiers.

    DateCreated : Date de cration du fichier

    DateLastAccessed : Date de dernier accs au fichier

    DateLastModified : Date de dernire modification

    Drive : Objet Drive correspondant l'unit de disque d'o est issu le fichier.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 13 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    14/29

    Name : Nom du fichier. Exemple : monfichier.txt

    ParentFolder : Objet Folder correspondant au dossier contenant le fichier.

    Path : Chemin complet d'accs au fichier. Exemple : D:\Windows\monfichier.txt

    ShortName : Nom court respectant la norme 8.3 (8 caractres pour le nom, 3 pour l'extension). Exemple :MONFIC~1.TXT

    ShortPath : Chemin complet d'accs au dossier o chaque composant respecte la norme voque pourShortName. Exemple D:\ABCDEF1~1\ MONFIC~1.TXT

    Size : Taille en octet du fichier

    Type : Type du fichier. Exemple : Document Texte. C'est ce type qui est affich dans l'explorateur Windows.

    I-D-3 - Les mthodes de l'objet File

    I-D-3-a - Copy

    La mthode Copy copie le fichier vers une autre destination

    Syntaxe :

    Copy(Destination As String, [OverWriteFiles As Boolean = Vrai])

    Destination correspond au chemin valide de destination de la copie. Si un fichier portant le mme nom existe dj,il sera cras l'unique condition qu'OverWriteFiles soit gal True.

    Exemple :

    oFl.Copy "D:\Essai2\monfichier.txt" , True

    Si le chemin de destination est incorrect, une erreur 76 (Chemin introuvable) est leve. Si OverWriteFiles est False et que le fichier est dj prsent, une erreur 58 (Le fichier existe dj) est gnre.

    La mthode CopyFile de l'objet FSO reproduit le mme comportement.

    Exemple :

    oFSO.CopyFile( "D:\Essai\monfichier.txt" ,"D:\Essai2\ monfichier.txt ",True)

    I-D-3-b - Delete

    La mthode Delete supprime le fichier.

    Syntaxe :

    Manipulation des fichiers en VBA par Christophe WARIN

    - 14 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    15/29

    Delete([Force As Boolean = Faux])

    Le paramtre Force plac True force la suppression du fichier mme s'il est en lecture seule. S'il est gal False et que le fichier est en lecture seule, une erreur 70 (Permission refuse) est gnre. Cette mme erreursera leve si le fichier est ouvert.

    Exemple :

    oFl.Delete False

    Il est aussi possible d'utiliser la mthode DeleteFile du FSO.

    Exemple :

    oFSO.DeleteFile "D:\Essai\monfichier.txt" , False

    I-D-3-c - Move

    La mthode Move dplace le fichier vers une autre destination.

    Syntaxe :

    Move(Destination As String)

    Exemple :

    oFl.Move "D:\essai2\monfichier.txt"

    Autre possibilit : la mthode MoveFile du FileSystemObject

    Exemple :

    oFSO.MoveFile "D:\Essai\ monfichier.txt ", "D:\Essai2\ monfichier.txt "

    Ces mthodes peuvent tre utilises pour renommer un fichier.

    Exemple :

    oFSO.MoveFile "D:\Essai\ monfichier.txt ", "D:\Essai\ Old_monfichier.txt "

    I-D-3-d - OpenAsTextStream

    Cette mthode permet d'ouvrir un fichier texte. Elle sera dcrite plus loin dans ce document.

    I-E - Les mthodes du FSO

    L'objet FileSystemObject offre quelques mthodes intrressantes. Certaines d'entres-elles ont dj t tudiesplus haut.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 15 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    16/29

    I-E-1 - BuildPath

    La fonction BuildPath cre un chemin valide partir d'un nom de dossier et d'un nom de fichier.

    Syntaxe :

    BuildPath(Path As String, Name As String) As String

    Exemple :

    Dim oFSO As Scripting.FileSystemObject'Instanciation du FSOSet oFSO = New Scripting.FileSystemObjectMsgBox oFSO.BuildPath("D:\Essai", "monFichier.txt" )

    Retourne : D:\Essai\monFichier.txt

    I-E-2 - GetDriveName, GetFileName, GetBaseName, GetExtensionName

    Ces fonctions extraient respectivement le disque, le nom complet, le nom et l'extension d'un fichier partir duchemin pass en paramtre.

    Exemple :

    Dim oFSO As Scripting.FileSystemObjectDim strChemin As StringstrChemin = "D:\Essai\monfichier.txt"

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObjectDebug.Print oFSO.GetDriveName(strChemin)Debug.Print oFSO.GetBaseName(strChemin)Debug.Print oFSO.GetFileName(strChemin)Debug.Print oFSO.GetExtensionName(strChemin)

    Retour :

    D:monfichiermonfichier.txttxt

    I-E-3 - GetParentFolder

    La fonction GetParentFolder retourne le chemin d'accs du rpertoire parent d'un fichier (ou d'un dossier).

    Exemple :

    Debug.Print oFSO.GetParentFolderName("D:\Essai\)

    Retour :

    D:\Essai

    Manipulation des fichiers en VBA par Christophe WARIN

    - 16 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    17/29

    I-E-4 - GetTempName

    La fonction GetTempName retourne un nom de fichier temporaire depuis le systme d'exploitation.

    Exemple :

    Dim oFSO As Scripting.FileSystemObjectDim strChemin As String'Instanciation du FSOSet oFSO = New Scripting.FileSystemObjectDebug.Print oFSO.GetTempName

    Retour :

    rad6AE46.tmp

    Les fichiers temporaires sont utiliss pour stocker et traiter des donnes sur le disque dur de l'ordinateur.L'utilisation de cette fonction permet d'obtenir un nom de fichier libre.

    I-E-5 - Tester l'existence d'un chemin

    Bien que le FileSystemObject offre plusieurs mthodes pour tester l'existence d'un dossier, il est difficile en casd'erreur de savoir quelle partie du chemin pose problme en cas d'erreur. Imaginons ce chemin :

    D:\Essai\Essai2\Essai3

    Essai2 n'existe pas. FolderExists renverra faux mais l'utilisateur ignorera si c'est cause d'Essai, Essai2, ouEssai3.

    Je vous propose la fonction ci-dessous plus complte permettant d'identifier le dossier l'origine de l'erreur.

    Function TestChemin(strChemin As String) As BooleanOn Error GoTo errDim oFSO As Scripting.FileSystemObjectDim oFld As Scripting.FolderDim oDrv As Scripting.DriveDim strDossiers() As StringDim i As Integer'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject

    'Accde au disqueSet oDrv = oFSO.Drives(oFSO.GetDriveName(strChemin))'Instancie le dossier racineSet oFld = oDrv.RootFolder'Dcoupe le chemin en dossierstrDossiers = Split(strChemin, "\")'Tente d'accder chaque sous dossierFor i = 1 To UBound(strDossiers) - 1

    Set oFld = oFld.SubFolders(strDossiers(i))Next iTestChemin = Truefin:

    Exit Function

    err:Select Case err.Number

    Case 5: MsgBox "Le disque n'existe pas"Case 76: MsgBox "Impossible de trouver le dossier : " & strDossiers(i)Case Else: MsgBox "Erreur inconnue"

    Manipulation des fichiers en VBA par Christophe WARIN

    - 17 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    18/29

    End SelectResume fin

    End Function

    Manipulation des fichiers en VBA par Christophe WARIN

    - 18 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    19/29

    II - Les fichiers textes

    II-A - Introduction

    Les fichiers textes sont constitues de lignes spares par deux caractres : retour chariot et changement delignes : VbCrLf

    Deux techniques peuvent tre utilises pour lire et crire dans de tels fichiers. La premire est historique via lamthode Open de VB. La seconde fait appel la librairie Microsoft Scripting Runtime et plus particulirementses objets TextStream.

    II-B - Accs squentiel

    Ce type d'accs est historique dans le sens o pendant longtemps il tait le seul disponible en Visual Basic. Lefichier est ouvert via la mthode Open et est rfrenc ensuite par un numro de fichier.

    Trois modes d'ouverture sont disponibles :

    Input : lecture seule Output : criture (le fichier est vid chaque ouverture) Append : criture en ajout

    Exemple :

    Open "D:\essai\monfichier.txt" For Input As 1

    1 correspond ici au numro de fichier. Un mme numro ne peut tre rutilis tant que le fichier qu'il rfrencen'est pas ferm. Pour remedier ce problme et obtenir un numro de fichier toujours valide, la fonction Freefilepeut tre utilise.

    Dim intFic As IntegerintFic = FreeFileOpen "D:\essai\monfichier.txt" For Input As intFic

    Les numros de fichier entre 1 et 255 donnent un accs exclusif au fichier. Il ne peut pas tre ouvert par une autreapplication. En revanche, un numro entre 256 et 511 donne un accs partag.

    FreeFile sans paramtre retourne un numro infrieur 255. Pour obtenir un numro compris entre 256 et 511, il

    faut utiliser : FreeFile (1)

    Quelque soit le mode d'ouverture, la fermeture se fait toujours via la mthode Close.

    Close intFic

    II-B-1 - Lecture

    La lecture d'une ligne se fait via la mthode Line Input #. Le contenu est alors envoy dans une variable de typeString.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 19 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    20/29

    Exemple :

    Dim intFic As IntegerDim strLigne As StringintFic = FreeFileOpen "D:\essai\monfichier.txt" For Input As intFicLine Input #intFic, strLigneMsgBox strLigneClose intFic

    Cet exemple ne lit qu'une seule ligne : la premire. Pour lire la totalit du fichier, il faut itrer l'opration jusqu' lafin du fichier. La fonction EOF (End Of File) permet de savoir si la fin du fichier a t atteinte.

    Dim intFic As IntegerDim strLigne As StringintFic = FreeFileOpen "D:\essai\monfichier.txt" For Input As intFicWhile Not EOF(intFic)

    Line Input #intFic, strLigneMsgBox strLigneWendClose intFic

    Comme vous pouvez le constater, il n'y a pas de notion de movenext . Le passage la ligne suivante est grautomatiquement par Line Input #.

    II-B-2 - Ecriture

    L'criture dans un fichier ouvert en mode Output ou Append est assure par la fonction Print #.

    Exemple :

    Dim intFic As Integer

    intFic = FreeFileOpen "D:\essai\monfichier.txt" For Output As intFicPrint #intFic, "Une ligne"Close intFic

    L'appel de Print # place automatiquement VbCrLf la fin de la ligne chaque appel.

    Rappel : En mode Output, le contenu du fichier est cras. Si vous souhaitez ajouter votre texte en fin de fichier,utilisez le mode Append.

    II-C - Accs direct

    L'accs direct est trs proche de l'accs squentiel. La diffrence se situe au niveau de la structure du fichier. Dansle premier cas, nous avions un fichier o chaque ligne tait une phrase. L'accs direct est reserv au fichier dedonnes. Ce genre de fichier peut tre obtenu lorsque vous exportez une table Access dans un fichier texte. Ils'agit en fait d'une suite d'enregistrements o chaque colonne possde une longueur fixe.

    Par exemple :

    Numro du client sur 3 caractres, Nom sur 10 caractres, Prnom sur 10 autres caractres.

    001NORD PAUL 002MARIE ANNE

    Manipulation des fichiers en VBA par Christophe WARIN

    - 20 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    21/29

    Le fichier sera ouvert en mode Random. La fonction Get permet de lire un enregistrement et d'envoyer soncontenu dans une variable. Pour que cela fonctionne correctement, il faut que la variable possde la mmestructure que l'enregistrement. Cette structure est obtenue l'aide du bloc Type.

    Type tClientNum As String * 3Nom As String * 10Prenom As String * 10

    end type

    La fonction Get permet de dfinir quel enregistrement lire. On peut par exemple lui indiquer de lire le deuximeclient. Pour cela, il faut que VBA sache quel octet commence l'enregistrement 2 dans le fichier. Le mot cl Lenspcifi dans l'instruction Open permettra de dfinir la taille d'un enregistrement. Ds lors, en connaissant cettetaille, Get sera capable de savoir o commencer sa lecture.

    Exemple :

    Dim intFic As IntegerDim client As tClientintFic = FreeFileOpen "D:\essai\monfichier.txt" For Random As intFic Len = Len(client)Get intFic, 1, clientMsgBox client.NumGet intFic, 2, clientMsgBox client.NumClose intFic

    Ici, chaque enregistrement possde la taille de la variable client (dfinie par la structure Type tclient).

    Quant l'criture, elle se fait de la mme manire avec l'instruction Put :

    Dim intFic As IntegerDim client As tClientintFic = FreeFileOpen "D:\essai\monfichier.txt" For Random As intFic Len = Len(client)'Fixe les informations du clientWith client

    .Num = "003"

    .Nom = "JEAN"

    .Prenom = "PAUL"End With'Ecrit la donnePut intFic, 3, clientClose intFic

    En spcifiant un numro d'enregistrement dj utilis, vous crasez la donne prcdente. Pour tre certaind'ajouter un nouvel enregistrement, il faut que l'indice soit gal au nombre d'enregistrements dj prsents + 1. La

    fonction LOF (Length Of File) retourne la taille du fichier en octets. En divisant cette taille par la longueur dechaque enregistrement, on obtient aisment le nombre d'lments.

    L'ajout devient alors :

    Dim intFic As IntegerDim client As tClientDim intNum As IntegerintFic = FreeFileOpen "D:\essai\monfichier.txt" For Random As intFic Len = Len(client)'Fixe les informations du clientWith client

    .Num = "003"

    .Nom = "JEAN"

    .Prenom = "PAUL"End With

    Manipulation des fichiers en VBA par Christophe WARIN

    - 21 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    22/29

    'Compte le nombre d'enregistrementsintNum = LOF(intFic) / Len(client)'Ajoute la donnePut intFic, intNum + 1, client

    Close intFic

    II-D - Les TextStream

    Vous l'avez sans doute remarqu, la manipulation de fichier texte en VBA est trs limite. Pour combler cemanque, les dveloppeurs ont souvent accs aux objets TextStream de la librairie Microsoft Scripting Runtime.

    Mme si l'accs est toujours squentiel, la programmation est grandement simplfie et parait plus naturelle.

    II-D-1 - Ouvrir un fichier texte

    La mthode OpenTextFile de l'objet FileSystemObject permet d'ouvrir ou crer un fichier texte.

    Syntaxe :

    OpenTextFile(FileName As String, [IOMode As IOMode = ForReading], [Create As Boolean = Faux],[Format As Tristate = TristateFalse]) As TextStream

    Le paramtre FileName correspond au chemin du fichier. IOMode spcifie le mode d'ouverture : ForReading (lecture), ForWriting (criture), ForAppending (Ajout) Lorsque Create est True, le fichier est cr s'il n'existe pas. Si Format est True, le texte est en Unicode, sinon, il s'agit du codage ASCII.

    Exemple :

    Dim oFSO As Scripting.FileSystemObjectDim oTxt As Scripting.TextStream'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject

    Set oTxt = oFSO.OpenTextFile("D:\Essai\monfichier.txt" , ForReading)

    Une nouvelle fois, il faut choisir entre lecture et criture. Impossible d'utiliser les deux modes simultanment.

    La mthode CreateTextFile peut aussi tre utilise si le fichier n'existe pas encore.

    Syntaxe :

    CreateTextFile(FileName As String, [Overwrite As Boolean = Vrai], [Unicode As Boolean = Faux]) AsTextStream

    Dans ce cas, le paramtre OverWrite crase un fichier existant s'il est gal True.

    Une dernire technique peut tre utilise pour instancier un objet TextStream : utiliser la mthodeOpenAsTextStream depuis un objet File.

    Exemple :

    Manipulation des fichiers en VBA par Christophe WARIN

    - 22 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    23/29

    Dim oFSO As Scripting.FileSystemObjectDim oFl As Scripting.FileDim oTxt As Scripting.TextStream'Instanciation du FSO

    Set oFSO = New Scripting.FileSystemObjectSet oFl = oFSO.GetFile("D:\Essai\monfichier.txt" )Set oTxt = oFl.OpenAsTextStream(ForReading)

    II-D-2 - Lecture

    La lecture d'un fichier texte se fait en positionnant le paramtre IOMode ForReading lors de l'ouverture.

    Plusieurs mthodes permettent de lire un ensemble de caractres :

    Read(X) : lit X caractres ReadLine : lit toute la ligne

    ReadAll : lit tout le fichier

    La lecture se fait partir de la position courante. Celle-ci est recalcule chaque appel d'une de ces mthodes.Les proprits Line et Column permettent de la connatre. Si l'ouverture vous lisez 3 caractres, la positioncourante devient :

    line(ligne) = 1 column(colonne) = 4

    La proprit AtEndOfLine permet de savoir si vous tes la fin de la ligne. Quant la proprit AtEndOfStream,elle dtermine si vous tes la fin du fichier.

    Exemple pour une lecture ligne ligne :

    Dim oFSO As Scripting.FileSystemObjectDim oFl As Scripting.FileDim oTxt As Scripting.TextStream'Instanciation du FSOSet oFSO = New Scripting.FileSystemObjectSet oFl = oFSO.GetFile("D:\Essai\monfichier.txt" )Set oTxt = oFl.OpenAsTextStream(ForReading)With oTxt

    While Not .AtEndOfStreamMsgBox .ReadLine

    WendEnd With

    La mthode Skip(X) permet de dplacer la position courante de X caractres. La mthode SkipLine permet de

    sauter une ligne.

    Exemple pour une lecture un caractre sur deux :

    Dim oFSO As Scripting.FileSystemObjectDim oFl As Scripting.FileDim oTxt As Scripting.TextStream'Instanciation du FSOSet oFSO = New Scripting.FileSystemObjectSet oFl = oFSO.GetFile("D:\Essai\monfichier.txt" )Set oTxt = oFl.OpenAsTextStream(ForReading)With oTxt

    While Not .AtEndOfStreamMsgBox .Read(1)

    .Skip 1Wend

    Manipulation des fichiers en VBA par Christophe WARIN

    - 23 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    24/29

    End With

    N'oubliez pas que les sauts de lignes sont aussi des caractres.

    II-D-3 - Ecriture

    Que le fichier soit ouvert en mode ForAppending ou ForWriting n'influe pas sur les mthodes utiliser :

    Write(Text) : crit le texte partir de la position courante WriteLine(Text) : crit le texte dans une nouvelle ligne WrtieBlankLine(X) : crit X lignes vides.

    Exemple :

    Dim oFSO As Scripting.FileSystemObjectDim oFl As Scripting.FileDim oTxt As Scripting.TextStreamDim i As Integer'Instanciation du FSOSet oFSO = New Scripting.FileSystemObjectSet oFl = oFSO.GetFile("D:\Essai\monfichier.txt" )Set oTxt = oFl.OpenAsTextStream(ForWriting)With oTxt

    For i = 0 T o 1 0.WriteLine i

    Next iEnd With

    II-D-4 - Fermeture

    La fermeture d'un objet TextStream est simplement obtenue avec l'appel de sa mthode Close.

    Exemple :

    Txt.Close

    Manipulation des fichiers en VBA par Christophe WARIN

    - 24 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    25/29

    III - La recherche de fichiers

    La recherche de fichiers peut se faire de plusieurs manires. Sans appel une rfrence externe, il faut utiliser lamthode Dir de VBA. Malheureusement, c'est trs rudimentaire. Je vous propose deux types de recherche :

    la recherche rcursive en utilisant le FileSystemObject la recherche optimise en utilisant l'objet FileSearch Office

    III-A - Recherche recursive en utilisant le FSO

    L'ide : parcourir chaque dossier depuis la racine du disque. Vrifier si le fichier recherch est prsent. Rpterl'opration pour chacun des sous-dossiers.

    Un exemple possible :

    Sub Explorer(p_strFichier As String, p_strCheminDepart As String, Optional p_oFld AsScripting.Folder)On Error GoTo err

    Dim oFSO As Scripting.FileSystemObjectDim oFld As Scripting.FolderDim oFl As FileIf p_oFld Is Nothing Then

    'Instanciation du FSOSet oFSO = New Scripting.FileSystemObject'Accde au rpertoire du dpart de rechercheSet p_oFld = oFSO.GetFolder(p_strCheminDepart)

    End IfSet oFl = p_oFld.Files(p_strFichier)MsgBox oFl.Path

    SubDir:

    'Explore les sous-dossiersFor Each oFld In p_oFld.SubFoldersExplorer p_strFichier, p_strCheminDepart, oFldDoEvents

    Next oFld

    fin:Exit Sub

    err:Select Case err.Number

    Case 53: Resume SubDirCase Else:

    MsgBox "Erreur inconnue"Resume fin

    End Select

    End Sub

    Qui sera lanc par :

    Explorer "monfichier.txt" , "d:\"

    III-B - L'objet FileSearch

    Fournit par l'objet Access.Application , l'objet FileSearch permet de rechercher des documents sur n'importe queldisque de l'ordinateur. Il utilise le mcanisme de recherche propre Windows ce qui en fait un outil beaucoup pluspuissant que la recherche rcurssive vu prcdemment.

    Un objet FileSearch est retourn par la proprit Access.Application . L'ajout de la rfrence Microsoft Office X

    Manipulation des fichiers en VBA par Christophe WARIN

    - 25 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    26/29

    Object Library n'est pas indispensable. Toutefois, si vous ne la dclarez pas, vous ne pourrez pas utiliser lesconstantes prdfinies ni bnficier de la fonction IntelliSence (Aide la saisie)

    III-B-1 - Recherche basique

    Prenons l'exemple ci-dessous :

    Dim oFS As Office.FileSearchSet oFS = Application.FileSearchWith oFS

    .NewSearch

    .FileType = msoFileTypeAllFiles

    .FileName = "monfichier.txt"

    .LookIn = "D:\Essai"

    .ExecuteMsgBox .FoundFiles.Count

    End With

    Comme indiqu plus haut, l'objet est accessible via la proprit du mme nom dans Application. La mthodeNewSearch dclare une nouvelle recherche et rinitialise les critres leur valeur par dfaut. La propritFileType permet de paramtrer le type des fichiers recherchs. Il est ainsi possible de restreindre la rechercheuniquement aux fichiers Word, aux fichiers Access, etc. Le nom du fichier recherch est affecter la propritFileName. LookIn spcifie le chemin du dossier dans lequel la recherche sera effectue. En dfinissantSearchSubFolders True, elle sera tendue aux sous-rpertoires.

    Appelez la mthode Execute pour dmarrer la recherche. Les fichiers trouvs sont retourns sous la forme d'unecollection de noms de fichiers : FoundFiles. Comme pour toute collection, la proprit Count donne le nombred'lments.

    Voici un exemple de parcours de la collection :

    Dim oFS As Office.FileSearchDim i As IntegerSet oFS = Application.FileSearch

    With oFS.NewSearch.FileType = msoFileTypeAllFiles.FileName = "monfichier.txt".LookIn = "D:\Essai"

    .ExecuteFor i = 1 To .FoundFiles.Count

    MsgBox .FoundFiles(i)Next i

    End With

    III-B-2 - Recherche complexe

    L'objet FileSearch offre des possibilits tendues par la dfinition de filtre. Il est possible d'associer plusieurs filtres une recherche.

    Soit le besoin suivant :

    Je recherche tous les fichiers Word ou Excel dans le rpertoire Essai modifi entre le 12/10/06 et le 15/10/06

    Avec les proprits vues plus haut, il est impossible de traduire le critre sur la date.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 26 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    27/29

    Pour cela il faut faire appel la collection PropertyTests de l'objet FileSearch. Chaque objet de cette collectioncorrespond un prdicat compos de :

    Un nom de proprit (Name) Sa valeur (Value), une seconde valeur optionnelle (SecondValue) Un oprateur (Condition) Un oprateur logique pour dfinir comment sera valu ce critre par rapport aux autres.

    En fait, la collection PropertyTests correspond cet cran :

    Menu Fichier, Ouvrir, Recherche Avance

    Ici le prdicat pour la date sera :

    Nom de la proprit : Modifi le

    Oprateur : msoConditionAnytimeBetween (Date comprise entre #)

    Valeur : 12/10/06

    Manipulation des fichiers en VBA par Christophe WARIN

    - 27 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    28/29

    Seconde Valeur : 15/10/2006

    Dans l'cran affich plus haut, il tait affich date avant le # et date aprs le# . VBA offre l'oprateur Dateentre #

    La mthode Add permet d'ajouter un objet PropertyTest :

    With oFS.NewSearch.FileType = msoFileTypeExcelWorkbooks + msoFileTypeWordDocuments.LookIn = "D:\Essai"With .PropertyTests

    .Add Name:="Modifi le", _Condition:=msoConditionAnytimeBetween, _Value:="10/10/2006", SecondValue:="15/10/2006", _Connector:=msoConnectorAnd

    End With.ExecuteFor i = 1 To .FoundFiles.Count

    MsgBox .FoundFiles(i)Next i

    End With

    La liste des proprites et des oprateurs est trs longue. Il est difficile de toutes les exposer ici. Je vous proposeplutt d'tudier les diffrentes valeurs des numrations via l'explorateur d'objets. Leur traduction est trs simple.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 28 -http://warin.developpez.com/access/fichiers/

    http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182
  • 7/22/2019 Fic Hiers

    29/29

    IV - Conclusion

    Vous voil maintenant prt faire face la plupart des problmes concernant les fichiers en VBA.

    N'hsitez pas consulter les pages sources Access et Visual Basic, elles regroupent plusieurs exemples d'importde donnes via des fichiers textes.

    Si vous ne parvenez pas utiliser les lments donns dans ce document et avant de poser toute question sur leforum Access, vrifiez que vous avez bien ajout les rfrences ncessaires. Il s'agit de :

    Microsoft Scripting Runtime pour le FileSystemObject Microsoft Office X.0 Object Library pour l'objet FileSearch (Recherche de fichiers)

    Je tiens remercier tous ceux qui ont particip ce document de par leur relecture et leurs prcieux conseils.

    Manipulation des fichiers en VBA par Christophe WARIN

    - 29 -htt // i d l / /fi hi /

    http://access.developpez.com/sourceshttp://vb.developpez.com/sourceshttp://vb.developpez.com/sourceshttp://www.developpez.net/forums/forumdisplay.php?f=38http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://warin.developpez.com/access/fichiers/http://warin.developpez.com/access/fichiers/http://www.developpez.net/forums/profile.php?mode=viewprofile&u=54182http://www.developpez.net/forums/forumdisplay.php?f=38http://vb.developpez.com/sourceshttp://access.developpez.com/sources