Ouvrez le bloc-notes (NotePad) et écrivez quelques mots.
C'est laid, du texte triste noir sur blanc sans aucun format.
Mais c'est aussi extremement utile !
Visual Basic vous permet de créer un fichier texte et d'y écrire n'importe quoi.
On peut donc écrire un texte, une chaine de caractères dans un fichier.
Sachant qu'avec les 256 (= 2 puissance 8) caractères disponibles, on peut représenter toutes les valeurs prises par un octet, on comprend qu'on peut ainsi créer n'importe quel type de fichier en créant un fichier vide et en y inscrivant des caractères ascii. Cela mérite quelqu'intérêt !
Ouvrir un fichier, créer un nouveau fichier
Ouvrir un fichier, cela signifie le rendre disponible soit pour la lecture, soit pour l'écriture.
Pour ouvrir ou créer un fichier, une seule fonction, Open.
Quand on manipule des fichiers texte, on les ouvre généralement en mode "séquentiel", avec trois possibilités, lecture, écriture ou ajouts.
Open "c:\zaza.txt" For Input As #2 va ouvrir le fichier c:\zaza.txt en mode lecture et lui affecter le numéro d'ordre 2. Ce numéro va nous servir pour manipuler le fichier.
(Il est important d'utiliser un numéro qui ne correspond à aucun fichier déjà ouvert. Dans le doute, il est conseillé de recourrir à FreeFile qui renvoie un numéro de fichier utilisable :
num = FreeFile
Open "c:rien.xls" For Input As #num ).
Pour lire dans le fichier ainsi ouvert en séquentiel en mode lecture, on utilise Input # :
Pour lire les 5 premiers caractères du fichier #2, on écrit :
txt = Input(5, #2)
La variable txt contient les 5 premiers caractères.
Pour lire les 30 suivants, il suffit d'écrire
txt2 = Input(30, #2).
Pour savoir si on approche de la fin du fichier, on peut utiliser EOF(2) qui va renvoyer False tant que l'on n'aura pas atteint la fin du fichier 2.
On peut aussi compter le nombre de caractères lus (5+30 dans notre exemple) et le comparer à la longueur du fichier, qui est mesurée soit par LOF(2), soit par FileLen("c:rien.xls").
Quand on a lu tout ce qu'on souhaite, il convient de fermer le fichier par :
Close #2.
Un exemple : lire les 7 derniers octets du fichier zaza.htm (on lit en fait la balise </HTML> qui ferme la page html) :
Open "c:zaza.htm" For Input As #3
txt = Input(LOF(3) - 7, #3)
txt = Input(7, #3)
Close #3
MsgBox txt
End Sub
On peut aussi lire le fichier ligne par ligne avec Line Input :
Open "c:zaza.txt" For Input As #1
For nb = 1 To 3
Line Input #1, txt
Next
Close #1
MsgBox txt
End Sub
La macro lit successivement les 3 premières lignes du fichier zaza.txt, et les place dans la variable txt.
L'instruction Msgbox txt va donc renvoyer le contenu de la troisième ligne.
Pour ouvrir un fichier en écriture, on utilise
Open "c:\zaza.txt" For Output As #2
Si zaza.txt n'existe pas, cette instruction le crée avant de l'ouvrir.
Pour écrire dans un fichier texte ouvert en écriture, on dispose de deux instructions, Print # et Write # :
Open "c:rien.txt" For Output As #1
For nb = 1 To 3
Print #1, "toto " & nb
Next
Close #1
ThisWorkbook.FollowHyperlink "c:\rien.txt", , True
End Sub
La macro ouvre le fichier c:rien.txt en écriture (ou le crée s'il n'existe pas),
y inscrit toto 1, toto 2 et toto 3, ferme le fichier, puis vous montre le résultat. S'il y a déjà des données dans le fichier, elles sont écrasées par cette procédure.
On peut aussi utiliser l'instruction Write qui inscrit une ligne de données séparées par des virgules :
Open "c:rien.txt" For Output As #1
For lin = 1 To 20
txt = ""
For col = 1 To 9
txt = txt & "," & lin * col
Next col
txt = Right(txt, Len(txt) - 1)
Write #1, txt
Next lin
Close #1
ThisWorkbook.FollowHyperlink "c:\rien.txt", , True
La macro écrit un tableau représentant les tables de multiplication de 1 à 20. Chaque ligne est encadrée de guillemets, chaque nombre est séparé du suivant par une virgule.
Si maintenant on veut ajouter du texte au bas d'un fichier existant, on doit l'ouvrir en mode "ajouts" (Append) :
Open "c:rien.txt" For Append As #1
Write #1, "fin de la table de multiplication"
Close #1
ThisWorkbook.FollowHyperlink "c:\rien.txt", , True
La macro va ajouter au bas de la table de multiplication précédente, une ligne de texte.
Plutôt que d'ouvrir les fichiers en mode séquentiel, on peut les ouvrir en mode binaire et manipuler les octets.
Dans ce cas, on utilise get pour lire et put pour écrire :
Dim txt As String
Open "c:\rien.txt" For Binary As #1
txt = String(20, " ")
Get #1, 10, txt
Close #1
MsgBox txt
La macro place, dans la variable txt, 20 octets à partir du dixième.
On peut utiliser Get sans préciser la position du premier octet. Dans ce cas, la
lecture se fera à partir de la position courante du pointeur (qu'on peut trouver par seek(1) qui renvoie la position de l'octet à partir duquel la prochaine opération doit avoir lieu, ou Loc(1) qui renvoie la position du dernier octet lu ou écrit).
En utilisant plusieurs fois Get #1,,txt, on va lire les octets du fichier par paquets de 20.
On peut aussi imposer la position du pointeur avec Seek #1,20 (place le pointeur sur le 20 ème octet).
On utilise de même Put pour écrire dans le fichier :
Dim txt As String
Open "c:\rien.txt" For Binary As #1
txt = "bonjour"
Put #1, 10, txt
Close #1
ThisWorkbook.FollowHyperlink "c:\rien.txt", , True
La macro remplace 7 octets à partir du 10 ème par "bonjour".
Plutôt que de manipuler les fichiers par Open, on peut le faire par l'intermédiaire de l'objet Scripting.FileSystemObject :
Les deux lignes suivantes créent cet objet et l'utilisent pour créer un nouveau fichier :
Set Fs = CreateObject("Scripting.FileSystemObject")
Set fich = Fs.CreateTextFile("c:\zaza.txt", False, False)
(le deuxième paramètre à False empêche d'écraser le fichier zaza s'il existe déjà, le troisième permet de créer un fichier au format ASCII, au format UNICODE si True).
Pour ouvrir un fichier on utilise OpenTextFile :
Set fich = fs.OpenTextFile("c:\zaza.txt", 1, False)
Le deuxième paramètre vaut 1 pour ouvrir le fichier en lecture, 2 en écriture, et 8 en "appending" (ajouts), le troisième à True entraine la création du fichier zaza s'il n'existe pas).
Pour lire dans un fichier ouvert en mode lecture, on utilise Read (pour un certain nombre de caractères), ReadLine pour lire une ligne complète ou ReadAll pour lire tout le fichier :
Set fich = fs.OpenTextFile("c:\zaza.txt", 1, False)
Msgbox fich.Readline
Msgbox fich.Read(10)
La macro ouvre le fichier zaza.txt en lecture, lit la première ligne, puis lit les 10 premiers caractères qui suivent.
Pour écrire dans un fichier ouvert en écriture ou en appending, on peut utiliser Write : fich.Write "texte".
Pour écrire une ligne, on utilise WriteLine : fich.WriteLine "bonjour tout le monde" (on passe à la ligne en fin d'écriture).
Pour parcourir le fichier texte, on utilise fich.AtEndOfLine (true en bout de ligne), fich.AtEndOfStream (true en fin de fichier), fich.Line (numéro de ligne) et fich.Column.
Enfin, ne pas oublier de refermer le fichier en utilisant fich.Close (et de faire le ménage dans la mémoire en supprimant les objets devenus inutiles) :
L'exemple qui suit montre comment lire les 5 premiers caractères de la huitième ligne du fichier zaza.txt :
Sub truc()
Set fs = CreateObject("Scripting.FileSystemObject")
Set fich = fs.OpenTextFile("c:\zaza.txt", 1, False)
Do While fich.Line <= 7
txt = fich.readline
Loop
MsgBox fich.read(5)
fich.Close
Set fich = Nothing
Set fs = Nothing
End Sub
Ces bases simples permettent de créer et manipuler n'importe quel type de fichier.
Plusieurs exemples sont notamment présentés avec des fichiers html, des fichiers MP3 et des fichiers bmp :
construire un plan de site Web
éditer un organigramme en html
créer un moteur de recherche javascript
recopier in classeur Excel sur une page Web
un questionnaire QCM en ASP
Inclure un fichier quelconque dans un fichier Excel puis le récupérer
le dicton du jour dans votre page Web (JavaScript mis à jour par VBA)
un trombinoscope html
Les dates d'anniversaires proches dans votre page Web (JavaScript mis à jour par VBA)
modifier les informations contenues dans un fichier MP3 (auteur, nom, album...) par VBA
Créer un raccourci Internet par VBA