Académique Documents
Professionnel Documents
Culture Documents
A travers ce document, je vous propose d'tudier les diffrentes techniques de manipulation des fichiers en VBA. Au sommaire : Gestion des disques, des dossiers, des fichiers Manipulation des fichiers textes Recherche de fichiers
I - Le FileSystemObject I-A - Introduction I-B - Gestion des disques I-B-1 - Accder un disque I-B-2 - Lister les disques I-B-3 - Les proprits des disques I-B-4 - Quelques exemples de traitements sur les disques I-C - Gestion des dossiers I-C-1 - Accder un dossier I-C-2 - Crer un dossier I-C-3 - Les attributs des dossiers I-C-4 - Les proprits de l'objet Folder I-C-5 - Les mthodes de l'objet Folder I-C-5-a - Copy I-C-5-b - Delete I-C-5-c - Move I-C-5-d - CreateTextFile I-C-6 - Les dossiers spciaux I-D - La gestion des fichiers I-D-1 - Accder un fichier I-D-2 - Les proprits de l'objet File I-D-3 - Les mthodes de l'objet File I-D-3-a - Copy I-D-3-b - Delete I-D-3-c - Move I-D-3-d - OpenAsTextStream I-E - Les mthodes du FSO I-E-1 - BuildPath I-E-2 - GetDriveName, GetFileName, GetBaseName, GetExtensionName I-E-3 - GetParentFolder I-E-4 - GetTempName I-E-5 - Tester l'existence d'un chemin II - Les fichiers textes II-A - Introduction II-B - Accs squentiel II-B-1 - Lecture II-B-2 - Ecriture II-C - Accs direct II-D - Les TextStream II-D-1 - Ouvrir un fichier texte II-D-2 - Lecture II-D-3 - Ecriture II-D-4 - Fermeture III - La recherche de fichiers III-A - Recherche recursive en utilisant le FSO III-B - L'objet FileSearch III-B-1 - Recherche basique III-B-2 - Recherche complexe IV - Conclusion
-2http://warin.developpez.com/access/fichiers/
Etant donn que le FSO est la base de tout ce modle, il ne peut driver d'aucun objet. Par consquent, il doit tre instanci par le mot cl New. Les autres objets seront instanci par des fonctions de cet lment matre (ou d'autres sous-lments).
Dim oFSO As Scripting.FileSystemObject Dim oDrv As Scripting.Drive 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Instanciation d'un objet enfant Set oDrv = oFSO.Drives(1)
N'oubliez pas d'ajouter la rfrence Microsoft Scripting Runtime votre projet sans quoi une erreur sera leve.
-3http://warin.developpez.com/access/fichiers/
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 le lecteur de CD-ROM, aucune erreur ne sera gnre. A ce stade, on ne sait pas si l'unit est accessible.
-4http://warin.developpez.com/access/fichiers/
DriveLetter : Lettre utilis par le systme d'exploitation pour accder au disque. Il s'agit de la cl de la collection Drives. 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, elle permettra 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 & \. Exemple D:\ SerialNumber : Numro de srie du disque. Exemple : 1154367849 ShareName : Retourne une chane de caractres correspondant au nom de partage du disque. Cette chaine sera nulle 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 objets Drive ne possde pas de mthodes.
Autre exemple : Retourner la lettre du disque dur contenant le plus de place disponible. Cela peut s'avrer pratique pour une sauvegarde.
Function LecteurLibre() As String Dim oFSO As Scripting.FileSystemObject Dim oDrv As Scripting.Drive Dim intFree As Double 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Parcours les disques
-5http://warin.developpez.com/access/fichiers/
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 Then intFree = oDrv.FreeSpace LecteurLibre = oDrv.DriveLetter End If End If Next oDrv End Function
Comme vous pouvez le constater dans cet exemple, la manipulation des objets FSO donne un code structur de la mme faon qu'avec DAO : le mme objet est appel de nombreuses fois. Pour cette raison, il est largement conseill de factoriser le code avec des blocs With.
Function LecteurLibre() As String Dim oFSO As Scripting.FileSystemObject Dim oDrv As Scripting.Drive Dim intFree As Double 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Parcours les disques For 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 remplacer If .FreeSpace > intFree Then intFree = .FreeSpace LecteurLibre = .DriveLetter End If End If End With Next oDrv End Function
On Error GoTo err Dim oFSO As Scripting.FileSystemObject Dim oFld As Folder 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Accde au dossier Set oFld = oFSO.GetFolder("D:\Windows0") fin: Exit Function err: 'Gestion de l'erreur 76 If 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. (Mthode FolderExists)
'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Accde au dossier If 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, la gestion 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 du systme de fichiers. Chaque objet Folder possde une proprit SubFolders regroupant ses sous-dossiers. Dans le cas de D:\Windows. Windows est un dossier enfant du dossier D:\ (le RootFolder de l'objet Drive D)
Dim oFSO As Scripting.FileSystemObject Dim oDrv As Drive Dim oFld As Folder 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Instanciation du disque Set oDrv = oFSO.GetDrive("D") 'Accde au dossier Windows de D Set oFld = oDrv.RootFolder.SubFolders("Windows")
Certes, premire vue cela semble plus complexe (ou tout du moins plus lourd). Cependant, du fait que l'accs au disque est distinct de celui du dossier, nous serons capables de connatre le niveau d'erreur en cas d'chec. En d'autres termes, est-ce le disque D qui est indisponible ou bien le rpertoire Windows inexistant ?
On Error Dim oFSO Dim oDrv Dim oFld GoTo err As Scripting.FileSystemObject As Drive As Folder
'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Instanciation du disque Set oDrv = oFSO.GetDrive("D") 'Accde au dossier Windows de D Set oFld = oDrv.RootFolder.SubFolders("Windows") -7http://warin.developpez.com/access/fichiers/
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
Depuis le FSO :
On Error Dim oFSO Dim oDrv Dim oFld GoTo err As Scripting.FileSystemObject As Drive As Folder
'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Cre le repertoire Set 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) est leve. Si le dossier existe dj, l'opration choue avec l'erreur 58 (Le fichier existe dj). L'objet oFld retourn par la mthode CreateFolder est rutilisable immdiatement dans la suite du code. Depuis la collection SubFolders :
On Error GoTo err Dim oFSO As Scripting.FileSystemObject Dim oDrv As Drive 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Instanciation du disque Set oDrv = oFSO.GetDrive("D") 'Cre le repertoire oDrv.RootFolder.SubFolders.Add ("Essai") fin: Exit Function
-8http://warin.developpez.com/access/fichiers/
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 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 Then oFld.Attributes = oFld.Attributes - Hidden End If
-9http://warin.developpez.com/access/fichiers/
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 cette proprit 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 pour ShortName. 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 le dossier 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.
Destination correspond au chemin valide de destination de la copie. Si OverWriteFiles est True, les fichiers dj 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) est gnre. La mthode CopyFolder de l'objet FSO reproduit le mme comportement.
- 10 http://warin.developpez.com/access/fichiers/
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 ses sous-dossiers. Si Force est False et que certains fichiers sont en lecture seule, une erreur 70 (Permission refuse) 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'objet FileSystemObject. 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 la cible sans quoi une erreur 58 sera leve. L encore, il existe un quivalent utilisable depuis l'objet FSO avec la mthode MoveFolder Exemple :
- 11 http://warin.developpez.com/access/fichiers/
I-C-5-d - CreateTextFile
La mthode CreateTextFile permet de crer un fichier texte. Elle sera tudie en dtails plus loin dans ce tutoriel.
Les valeurs possibles de SpecialFolder sont : WindowsFolder : Dossier o Windows est install SystemFolder : Dossier System (dans Windows) TemporaryFolder : Dossier o stocker les fichiers temporaires
Depuis FSO :
On Error GoTo err Dim oFSO As Scripting.FileSystemObject Dim oFl As Scripting.File 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Instanciation de l'objet File Set 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
- 12 http://warin.developpez.com/access/fichiers/
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 err Dim oFSO As Scripting.FileSystemObject Dim oFl As Scripting.File 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Instanciation de l'objet File If 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 err Dim oFSO As Scripting.FileSystemObject Dim oFld As Scripting.Folder Dim oFl As Scripting.File 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject 'Instanciation du dossier Set oFld = oFSO.GetFolder("D:\Essai") 'Instanciation de l'objet File Set 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
- 13 http://warin.developpez.com/access/fichiers/
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 pour ShortName. 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.
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 :
- 14 http://warin.developpez.com/access/fichiers/
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 erreur sera leve si le fichier est ouvert. Exemple :
oFl.Delete 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"
I-D-3-d - OpenAsTextStream
Cette mthode permet d'ouvrir un fichier texte. Elle sera dcrite plus loin dans ce document.
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 FSO Set oFSO = New Scripting.FileSystemObject MsgBox oFSO.BuildPath("D:\Essai", "monFichier.txt")
Retourne : D:\Essai\monFichier.txt
Retour :
D: monfichier monfichier.txt txt
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
- 16 http://warin.developpez.com/access/fichiers/
I-E-4 - GetTempName
La fonction GetTempName retourne un nom de fichier temporaire depuis le systme d'exploitation. Exemple :
Dim oFSO As Scripting.FileSystemObject Dim strChemin As String 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject Debug.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.
- 17 http://warin.developpez.com/access/fichiers/
- 18 http://warin.developpez.com/access/fichiers/
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 rfrence n'est pas ferm. Pour remedier ce problme et obtenir un numro de fichier toujours valide, la fonction Freefile peut tre utilise.
Dim intFic As Integer intFic = FreeFile Open "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 autre application. 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 type String.
- 19 http://warin.developpez.com/access/fichiers/
Exemple :
Dim intFic As Integer Dim strLigne As String intFic = FreeFile Open "D:\essai\monfichier.txt" For Input As intFic Line Input #intFic, strLigne MsgBox strLigne Close intFic
Cet exemple ne lit qu'une seule ligne : la premire. Pour lire la totalit du fichier, il faut itrer l'opration jusqu' la fin du fichier. La fonction EOF (End Of File) permet de savoir si la fin du fichier a t atteinte.
Dim intFic As Integer Dim strLigne As String intFic = FreeFile Open "D:\essai\monfichier.txt" For Input As intFic While Not EOF(intFic) Line Input #intFic, strLigne MsgBox strLigne Wend Close intFic
Comme vous pouvez le constater, il n'y a pas de notion de movenext . Le passage la ligne suivante est gr automatiquement 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 = FreeFile Open "D:\essai\monfichier.txt" For Output As intFic Print #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.
- 20 http://warin.developpez.com/access/fichiers/
Le fichier sera ouvert en mode Random. La fonction Get permet de lire un enregistrement et d'envoyer son contenu dans une variable. Pour que cela fonctionne correctement, il faut que la variable possde la mme structure que l'enregistrement. Cette structure est obtenue l'aide du bloc Type.
Type tClient Num As String * 3 Nom As String * 10 Prenom As String * 10 end type
La fonction Get permet de dfinir quel enregistrement lire. On peut par exemple lui indiquer de lire le deuxime client. Pour cela, il faut que VBA sache quel octet commence l'enregistrement 2 dans le fichier. Le mot cl Len spcifi dans l'instruction Open permettra de dfinir la taille d'un enregistrement. Ds lors, en connaissant cette taille, Get sera capable de savoir o commencer sa lecture. Exemple :
Dim intFic As Integer Dim client As tClient intFic = FreeFile Open "D:\essai\monfichier.txt" For Random As intFic Len = Len(client) Get intFic, 1, client MsgBox client.Num Get intFic, 2, client MsgBox client.Num Close 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 Integer Dim client As tClient intFic = FreeFile Open "D:\essai\monfichier.txt" For Random As intFic Len = Len(client) 'Fixe les informations du client With client .Num = "003" .Nom = "JEAN" .Prenom = "PAUL" End With 'Ecrit la donne Put intFic, 3, client Close intFic
En spcifiant un numro d'enregistrement dj utilis, vous crasez la donne prcdente. Pour tre certain d'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 de chaque enregistrement, on obtient aisment le nombre d'lments. L'ajout devient alors :
Dim intFic As Integer Dim client As tClient Dim intNum As Integer intFic = FreeFile Open "D:\essai\monfichier.txt" For Random As intFic Len = Len(client) 'Fixe les informations du client With client .Num = "003" .Nom = "JEAN" .Prenom = "PAUL" End With
- 21 http://warin.developpez.com/access/fichiers/
'Compte le nombre d'enregistrements intNum = LOF(intFic) / Len(client) 'Ajoute la donne Put intFic, intNum + 1, client Close intFic
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.FileSystemObject Dim oTxt As Scripting.TextStream 'Instanciation du FSO Set 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]) As TextStream
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 mthode OpenAsTextStream depuis un objet File. Exemple :
- 22 http://warin.developpez.com/access/fichiers/
Dim oFSO As Scripting.FileSystemObject Dim oFl As Scripting.File Dim oTxt As Scripting.TextStream 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject Set 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 position courante 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.FileSystemObject Dim oFl As Scripting.File Dim oTxt As Scripting.TextStream 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject Set oFl = oFSO.GetFile("D:\Essai\monfichier.txt") Set oTxt = oFl.OpenAsTextStream(ForReading) With oTxt While Not .AtEndOfStream MsgBox .ReadLine Wend End 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.FileSystemObject Dim oFl As Scripting.File Dim oTxt As Scripting.TextStream 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject Set oFl = oFSO.GetFile("D:\Essai\monfichier.txt") Set oTxt = oFl.OpenAsTextStream(ForReading) With oTxt While Not .AtEndOfStream MsgBox .Read(1) .Skip 1 Wend
- 23 http://warin.developpez.com/access/fichiers/
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.FileSystemObject Dim oFl As Scripting.File Dim oTxt As Scripting.TextStream Dim i As Integer 'Instanciation du FSO Set oFSO = New Scripting.FileSystemObject Set oFl = oFSO.GetFile("D:\Essai\monfichier.txt") Set oTxt = oFl.OpenAsTextStream(ForWriting) With oTxt For i = 0 To 10 .WriteLine i Next i End With
II-D-4 - Fermeture
La fermeture d'un objet TextStream est simplement obtenue avec l'appel de sa mthode Close. Exemple :
Txt.Close
- 24 http://warin.developpez.com/access/fichiers/
- 25 http://warin.developpez.com/access/fichiers/
Object Library n'est pas indispensable. Toutefois, si vous ne la dclarez pas, vous ne pourrez pas utiliser les constantes prdfinies ni bnficier de la fonction IntelliSence (Aide la saisie)
Comme indiqu plus haut, l'objet est accessible via la proprit du mme nom dans Application. La mthode NewSearch dclare une nouvelle recherche et rinitialise les critres leur valeur par dfaut. La proprit FileType permet de paramtrer le type des fichiers recherchs. Il est ainsi possible de restreindre la recherche uniquement aux fichiers Word, aux fichiers Access, etc. Le nom du fichier recherch est affecter la proprit FileName. LookIn spcifie le chemin du dossier dans lequel la recherche sera effectue. En dfinissant SearchSubFolders True, elle sera tendue aux sous-rpertoires. Appelez la mthode Execute pour dmarrer la recherche. Les fichiers trouvs sont retourns sous la forme d'une collection de noms de fichiers : FoundFiles. Comme pour toute collection, la proprit Count donne le nombre d'lments. Voici un exemple de parcours de la collection :
Dim oFS As Office.FileSearch Dim i As Integer Set oFS = Application.FileSearch With oFS .NewSearch .FileType = msoFileTypeAllFiles .FileName = "monfichier.txt" .LookIn = "D:\Essai" .Execute For i = 1 To .FoundFiles.Count MsgBox .FoundFiles(i) Next i End With
- 26 http://warin.developpez.com/access/fichiers/
Pour cela il faut faire appel la collection PropertyTests de l'objet FileSearch. Chaque objet de cette collection correspond 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
- 27 http://warin.developpez.com/access/fichiers/
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 Date entre # 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 .Execute For 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 propose plutt d'tudier les diffrentes valeurs des numrations via l'explorateur d'objets. Leur traduction est trs simple.
- 28 http://warin.developpez.com/access/fichiers/
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'import de donnes via des fichiers textes. Si vous ne parvenez pas utiliser les lments donns dans ce document et avant de poser toute question sur le forum 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.
- 29 http://warin.developpez.com/access/fichiers/