Академический Документы
Профессиональный Документы
Культура Документы
I. Le FileSystemObject
o
I-A. Introduction
I-C-5-a. Copy
I-C-5-b. Delete
I-C-5-c. Move
I-C-5-d. CreateTextFile
I-D-3-a. Copy
I-D-3-b. Delete
I-D-3-c. Move
I-D-3-d. OpenAsTextStream
I-E-1. BuildPath
I-E-3. GetParentFolder
I-E-4. GetTempName
II-A. Introduction
II-B-1. Lecture
II-B-2. Ecriture
II-D-2. Lecture
II-D-3. Ecriture
II-D-4. Fermeture
IV. Conclusion
A travers ce document, je vous propose d'tudier les diffrentes techniques de manipulation des
fichiers en VBA.
Au sommaire :
Recherche de fichiers
Article lu 104679 fois.
L'auteur
Christophe WARIN
L'article
Publi le 7 dcembre 2006
Version PDF Version hors-ligne
ePub, Azw et Mobi
Liens sociaux
inPartager
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 un comportement 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 ce qui concerne la manipulation
des fichiers et des rpertoires, Microsoft mis au point un ensemble d'objets regroups au
sein de la librairie Microsoft Scripting Runtime. Cet ensemble de classe hirarchique
possde une unique 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 technique d'accs aux fichiers dans sa globalit.
La hirarchie des objets de cette librairie peut tre compare celle de l'explorateur
Windows : des fichiers inclus dans des dossiers qui eux-mmes sont inclus dans des disques.
Le FSO peut alors tre illustr par le poste de travail : 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 tre instanci par le mot cl New. Les autres objets seront instanci par des
fonctions de cet lment matre (ou d'autres sous-lments).
Slectionnez
N'oubliez pas d'ajouter la rfrence Microsoft Scripting Runtime votre projet sans quoi
une erreur sera leve.
I-B. Gestion des disques
La mthode DriveExists expose par la classe FileSystemObject teste l'existence d'un disque
en fonction de son nom.
Slectionnez
If oFSO.DriveExists("C") Then
Set oDrv = oFSO.GetDrive("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 le lecteur 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 :
Slectionnez
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.
Autre exemple : Retourner la lettre du disque dur contenant le plus de place disponible. Cela
peut s'avrer pratique pour une sauvegarde.
Slectionnez
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.
Slectionnez
Comme pour les disques, nous allons respecter le mme plan. Dans un premier temps nous
allons voir comment accder 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 :
Si le dossier n'existe pas, une erreur 76 (Chemin d'accs introuvable) sera leve. Elle doit tre
traite.
Slectionnez
'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)
Slectionnez
'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)
Slectionnez
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 ?
Slectionnez
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")
fin:
Exit Function
err:
Comme pour l'accs, il est possible d'utiliser deux techniques diffrentes pour crer un dossier
:
Depuis le FSO :
Slectionnez
Exit Function
err:
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 CreateFolderest rutilisable
immdiatement dans la suite du code.
Depuis la collection SubFolders :
Slectionnez
Exit Function
err:
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
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 :
Slectionnez
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.
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 :
Slectionnez
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.
oFSO.CopyFolder("D:\Essai","D:\Essai2",True)
I-C-5-b. Delete
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 :
Slectionnez
oFld.Delete False
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 :
Slectionnez
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 :
Slectionnez
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
Il s'agit l de l'lment le plus bas de la hirarchie. Chaque fichier est rprsent par un
objet File au sein de la collection Files d'un objet Folder.
I-D-1. Accder un fichier
Une nouvelle fois, deux mthodes peuvent tre utilises pour retourner un objet File.
Depuis FSO :
Slectionnez
Exit Function
err:
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.
Slectionnez
Depuis un dossier :
Slectionnez
'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
I-D-2. Les proprits de l'objet File
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 :
Slectionnez
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 :
Slectionnez
oFl.Delete False
Slectionnez
Move(Destination As String)
Exemple :
Slectionnez
oFl.Move "D:\essai2\monfichier.txt"
Cette mthode permet d'ouvrir un fichier texte. Elle sera dcrite plus loin dans ce document.
I-E. Les mthodes du FSO
La fonction BuildPath cre un chemin valide partir d'un nom de dossier et d'un nom de
fichier.
Syntaxe :
Slectionnez
Exemple :
Slectionnez
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 du chemin pass en paramtre.
Exemple :
Slectionnez
Retour :
Slectionnez
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 :
Slectionnez
Debug.Print oFSO.GetParentFolderName("D:\Essai\)
Retour :
Slectionnez
D:\Essai
I-E-4. GetTempName
Retour :
Slectionnez
rad6AE46.tmp
Bien que le FileSystemObject offre plusieurs mthodes pour tester l'existence d'un dossier, il
est difficile en cas d'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, ou Essai3.
Je vous propose la fonction ci-dessous plus complte permettant d'identifier le dossier
l'origine de l'erreur.
Slectionnez
'Accde au disque
Set oDrv = oFSO.Drives(oFSO.GetDriveName(strChemin))
'Instancie le dossier racine
Set oFld = oDrv.RootFolder
'Dcoupe le chemin en dossier
strDossiers = Split(strChemin, "\")
'Tente d'accder chaque sous dossier
For i = 1 To UBound(strDossiers) - 1
Set oFld = oFld.SubFolders(strDossiers(i))
Next i
TestChemin = True
fin:
Exit Function
err:
Les fichiers textes sont constitues de lignes spares par deux caractres : retour chariot et
changement de lignes : VbCrLf
Deux techniques peuvent tre utilises pour lire et crire dans de tels fichiers. La premire est
historique via la mthode Open de VB. La seconde fait appel la librairie Microsoft
Scripting Runtime et plus particulirement ses 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. Le fichier est ouvert via la mthode Open et est rfrenc ensuite par un numro
de fichier.
Trois modes d'ouverture sont disponibles :
Exemple :
Slectionnez
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.
Slectionnez
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.
Slectionnez
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.
Exemple :
Slectionnez
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.
Slectionnez
L'criture dans un fichier ouvert en mode Output ou Append est assure par la
fonction Print #.
Exemple :
Slectionnez
L'accs direct est trs proche de l'accs squentiel. La diffrence se situe au niveau de la
structure du fichier. Dans le premier cas, nous avions un fichier o chaque ligne tait une
phrase. L'accs direct est reserv au fichier de donnes. Ce genre de fichier peut tre obtenu
lorsque vous exportez une table Access dans un fichier texte. Il s'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.
Slectionnez
001NORD
PAUL
002MARIE
ANNE
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.
Slectionnez
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 :
Slectionnez
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 :
Slectionnez
Vous l'avez sans doute remarqu, la manipulation de fichier texte en VBA est trs limite.
Pour combler ce manque, 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
IOMode spcifie
le
d'ouverture : ForReading (lecture), ForWriting (criture), ForAppending (Ajout)
Si Format est True, le texte est en Unicode, sinon, il s'agit du codage ASCII.
Exemple :
Slectionnez
mode
La mthode CreateTextFile peut aussi tre utilise si le fichier n'existe pas encore.
Syntaxe :
Slectionnez
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 :
Slectionnez
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 :
La lecture se fait partir de la position courante. Celle-ci est recalcule chaque appel d'une
de ces mthodes. Les proprits Lineet Column permettent de la connatre. Si l'ouverture
vous lisez 3 caractres, la position courante devient :
line(ligne) = 1
column(colonne) = 4
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 :
Exemple :
Slectionnez
Txt.Close
La recherche de fichiers peut se faire de plusieurs manires. Sans appel une rfrence
externe, il faut utiliser la mthode Dir de VBA. Malheureusement, c'est trs rudimentaire. Je
vous propose deux types de recherche :
L'ide : parcourir chaque dossier depuis la racine du disque. Vrifier si le fichier recherch est
prsent. Rpter l'opration pour chacun des sous-dossiers.
Un exemple possible :
Slectionnez
DoEvents
Next oFld
fin:
Exit Sub
err:
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 :
Slectionnez
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.
Pour cela il faut faire appel la collection PropertyTests de l'objet FileSearch. Chaque objet
de cette collection correspond un prdicat compos de :
Un oprateur (Condition)
Un oprateur logique pour dfinir comment sera valu ce critre par rapport aux autres.
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.
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 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.