Bien qu'il puisse largement le faire, Excel n'a pas été conçu pour stocker de grandes masses de données. Pour cela, les logiciels les plus adaptés sont les gestionnaires de bases de données comme, par exemple, Access.
Mais les gestionnaires de base de données les plus performants ne sont généralement pas gratuits. Heureusement, Excel propose une alternative en permettant de travailler sur des fichiers, notamment des fichiers texte.
Les fichiers texte sont des fichiers contenant uniquement des caractères imprimables et des retours à la ligne. Leur format est reconnu universellement si bien qu'ils présentent l'immense avantage de pouvoir être utilisés par de très nombreux logiciels.
Il est possible de créer des fichiers texte avec Visual Basic grâce à l'instruction Open. Deux écritures sont possibles :
Open fichier for Output as #n
Open fichier for Append as #n
Dans les deux cas, fichier désigne un nom de fichier avec son adresse, par exemple C:\Dossier\essai.txt, et n est un entier compris entre 1 et 511 inclus qui servira à désigner le fichier.
Si un fichier a été ouvert en mode Output ou Append, il est possible de lui ajouter des données.
Avec l'option Output, si le fichier existe déjà, son contenu est effacé ; avec l'option Append, les nouveaux enregistrements viennent s'ajouter aux enregistrements existants.
Après avoir utilisé un fichier texte, il faut impérativement le fermer avec l'instruction Close #n, où n est l'entier utilisé pour son ouverture.
Pour pouvoir lire les données d'un fichier texte, il faut d'abord l'ouvrir avec l'instruction Open en mode Input :
Open fichier for Input as #n
La méthode la plus simple pour écrire dans un fichier texte est d'utiliser l'instruction Print. Elle permet d'écrire une ligne de texte dans un fichier ouvert par l'instruction Open en mode Output ou Append. Elle s'écrit ainsi :
Print #n, Texte
Où n désigne l'entier utilisé pour ouvrir le fichier et Texte la ligne de texte que l'on désire entrer dans le fichier.
Un exemple de programme est le suivant :
Sub Textes()
Open "C:\Essais\FichierTexte.txt" For Output As #1
Print #1, "Bonjour."
Print #1, "Nous allons travailler sur les fichiers texte."
Close #1
End Sub
Pour vérifier le résultat, le mieux est d'ouvrir dans le dossier C:\Essais le fichier FichierTexte.txt avec le bloc-notes de Windows. Nous obtenons :
Bonjour.
Nous allons travailler sur les fichiers texte.
Pour lire les données du fichier FichierTexte.txt avec Visual Basic, nous devons d'abord l'ouvrir en mode Input puis nous pouvons utiliser l'instruction Line Input. Cette instruction permet de lire une ligne du fichier, sa syntaxe est la suivante :
Line Input #n, VarTexte
Où n désigne l'entier utilisé pour ouvrir le fichier et VarTexte la variable qui recueillera la ligne de texte du fichier. Un exemple de programme est le suivant :
Sub Lire()
Dim enr As String
Set f = ThisWorkbook.Sheets(1)
Open "C:\Essais\FichierTexte.txt" For Input As #1
Line Input #1, enr
f.Range("A1") = enr
Line Input #1, enr
f.Range("A2") = enr
Close #1
End Sub
Nous obtenons :
Dans ce programme, la première instruction Line Input lit la première ligne du fichier et la place dans la variable enr. Le curseur se déplace à la deuxième ligne qui est donc lue par la deuxième instruction Line Input.
Ce programme nous a permis de lire les deux premières lignes du fichier mais, en général, nous voulons lire tout le fichier et nous ne savons pas combien il possède de lignes. Nous allons donc le lire avec une boucle comme dans le programme suivant :
Sub Lire()
Dim enr As String
Set f = ThisWorkbook.Sheets(1)
Open "C:\Essais\FichierTexte.txt" For Input As #1
i = 1
Do While Not EOF(1)
Line Input #1, enr
f.Cells(i, 1) = enr
i = i + 1
Loop
Close #1
End Sub
Ce programme utilise la fonction EOF() qui prend la valeur TRUE lorsqu'on arrive à la dernière ligne.
Nous avons vu comment stocker des lignes de texte dans un fichier mais nous pouvons aller plus loin et stocker des données structurées. Supposons, par exemple, que nous voulions enregistrer les ventes de différents produits réalisées par deux vendeurs comme dans le tableau suivant :
Nous pouvons créer des enregistrements de longueur constante comme dans le programme suivant :
Sub EcrireConst()
Dim produit As String * 20
Dim vendeur As String * 20
Dim ventes As String * 10
Dim enr As String * 50
Set f = ThisWorkbook.Sheets(1)
Open "C:\Essais\FichierTexte.txt" For Output As #1
For i = 1 To 8
produit = f.Cells(i, 1)
vendeur = f.Cells(i, 2)
ventes = f.Cells(i, 3)
enr = produit & vendeur & ventes
Print #1, enr
Next i
Close #1
End Sub
Comme nous avons défini les trois variables comme étant des textes de longueur fixée, la longueur de l'enregistrement enr est égale à 20 + 20 + 10 = 50.
Nous pouvons vérifier avec le bloc-notes que le fichier a bien été saisi mais nous pouvons aussi le lire avec un programme Visual Basic.
Comme tous les enregistrements ont la même longueur, nous pouvons pour chaque ligne lire séparément le produit, le vendeur et la vente, par exemple avec le programme suivant :
Sub LireConst()
Dim produit As String * 20
Dim vendeur As String * 20
Dim ventes As String * 10
Dim enr As String * 50
Set f = ThisWorkbook.Sheets(1)
Open "C:\Essais\FichierTexte.txt" For Input As #1
i = 20
Do While Not EOF(1)
Line Input #1, enr
produit = Mid(enr, 1, 20)
vendeur = Mid(enr, 21, 20)
ventes = Mid(enr, 41, 10)
ventes = Replace(ventes, ",", ".")
va = Val(ventes)
f.Cells(i, 1) = produit
f.Cells(i, 2) = vendeur
f.Cells(i, 3) = va
i = i + 1
Loop
Close #1
End Sub
Dans ce programme, nous avons utilisé la fonction Mid(Texte, Debut, Longueur) qui extrait de Texte une chaîne de caractères à partir de la position Debut et sur une longueur égale à Longueur.
Comme nous voulons pouvoir faire des calculs sur les ventes nous avons converti le texte correspondant aux ventes en nombre. Pour cela, nous avons commencé par remplacer la virgule des nombres par un point puisque Visual Basic utilise le point comme séparateur décimal. Nous avons ensuite utilisé la fonction Val pour convertir le texte en nombre.
Nous pouvons maintenant calculer la commission des deux vendeurs en supposant qu'elle est égale à 20% grâce au programme suivant :
Sub Commissions()
Dim produit As String * 20
Dim vendeur As String * 20
Dim ventes As String * 10
Dim enr As String * 50
Dim comM, comD As Double
Set f = ThisWorkbook.Sheets(1)
Open "C:\Essais\FichierTexte.txt" For Input As #1
comM = 0
comD = 0
Do While Not EOF(1)
Line Input #1, enr
vendeur = Mid(enr, 21, 20)
ventes = Mid(enr, 41, 10)
ventes = Replace(ventes, ",", ".")
va = Val(ventes) * 0.2
If Trim(vendeur) = "Martin" Then comM = comM + va
If Trim(vendeur) = "Dupond" Then comD = comD + va
Loop
f.Cells(10, 1) = "Martin"
f.Cells(10, 2) = comM
f.Cells(11, 1) = "Dupond"
f.Cells(11, 2) = comD
Close #1
End Sub
On obtient :
Les fichiers CSV sont des fichiers texte contenant des données séparées par une virgule ou un point-virgule. La virgule correspond au format américain puisque le séparateur décimal est le point. En France, le séparateur est généralement le point-virgule car la virgule est utilisée comme séparateur décimal.
L'acronyme CSV provient du format américain et signifie Comma Separator Values. Les fichiers CSV permettent de stocker des données qui pourront être utilisées aussi bien par Excel que par n'importe quel gestionnaire de bases de données. Par rapport aux fichiers à enregistrements de longueur constante, ils présentent généralement l'avantage d'être plus compacts.
Pour créer des fichiers CSV avec Visual Basic, nous pouvons procéder comme nous l'avons fait précédemment pour créer un fichier texte, il suffit simplement d'introduire le séparateur entre les données. Par exemple, si nous reprenons notre tableau des ventes, nous pouvons créer un fichier CSV utilisant le point-virgule comme séparateur avec le programme suivant :
Sub EcrireCSV()
Dim produit As String
Dim vendeur As String
Dim ventes As Double
Dim enr As String
Set f = ThisWorkbook.Sheets(1)
Open "C:\Essais\FichierCSV.csv" For Output As #1
For i = 1 To 8
produit = f.Cells(i, 1)
vendeur = f.Cells(i, 2)
ventes = f.Cells(i, 3)
enr = produit & ";" & vendeur & ";" & ventes
Print #1, enr
Next i
Close #1
End Sub
Nous pouvons vérifier avec le bloc-notes que nous avons obtenu le bon résultat. Nous pouvons également lire le fichier grâce à un programme Visual Basic comme celui-ci qui recopie les données dans la feuille Feuil1 du classeur.
Sub LireCSV()
Dim enr As String
Dim Texte As Variant
Set f = ThisWorkbook.Sheets("Feuil1")
Open "C:\Essais\FichierCSV.csv" For Input As #1
li = 1
Do While Not EOF(1)
Line Input #1, enr
Texte = Split(enr, ";")
For i = LBound(Texte) To UBound(Texte)
f.Cells(li, i + 1) = Texte(i)
Next i
li = li + 1
Loop
Close #1
End Sub
Nous avons utilisé ici la fonction Split qui découpe une chaîne de caractères en plusieurs segments grâce à un séparateur et la transforme en une matrice dont les éléments correspondent aux segments. Dans notre exemple, le séparateur est le point-virgule car nous avons supposé que le fichier CSV utilisait ce séparateur. Les fonctions LBound et UBound donnent respectivement le premier et le dernier indice de la matrice.
Les fichiers CSV au format américain sont souvent plus faciles à utiliser avec Visual Basic que les fichiers avec le point-virgule comme séparateur. Ils disposent, en effet, d'instructions plus performantes pour la lecture et l'écriture, c'est-à-dire les instructions Write # et Input # qui permettent de travailler directement avec les variables des enregistrements.
Par exemple, nous pouvons écrire un fichier CSV des ventes au format américain grâce au programme suivant :
Sub EcrireVirgule()
Dim produit As String
Dim vendeur As String
Dim ventes As Double
Set f = ThisWorkbook.Sheets("Feuil1")
Open "C:\Essais\VirguleCSV.csv" For Output As #1
For i = 1 To 8
produit = f.Cells(i, 1)
vendeur = f.Cells(i, 2)
ventes = f.Cells(i, 3)
Write #1, produit, vendeur, ventes
Next i
Close #1
End Sub
En ouvrant le fichier VirguleCSV.csv, nous constatons que les textes apparaissent entourés de guillemets et que les nombres sont affichés avec le point comme séparateur décimal.
Nous pouvons également le lire grâce au programme suivant :
Sub LireVirgule()
Dim produit As String
Dim vendeur As String
Dim ventes As Double
Set f = ThisWorkbook.Sheets("Feuil3")
Open "C:\Essais\VirguleCSV.csv" For Input As #1
i = 1
Do While Not EOF(1)
Input #1, produit, vendeur, ventes
f.Cells(i, 1) = produit
f.Cells(i, 2) = vendeur
f.Cells(i, 3) = ventes
i = i + 1
Loop
Close #1
End Sub
Nous constatons que, même s'ils sont stockés avec le point comme séparateur décimal, les nombres s'affichent dans la feuille de calcul avec des virgules comme séparateur décimal.
Nous pouvons également lire un fichier CSV avec un tableau croisé dynamique. Pour cela, il faut aller dans le menu Données et sélectionner À partir d'un fichier texte/CSV.
Sélectionnez le fichier à importer puis cliquez sur Importer. Dans le haut de la fenêtre qui apparaît sélectionnez le délimiteur utilisé puis dans le bas cliquez sur Charger puis sur Charger dans... Il faut alors choisir Rapport de tableau croisé dynamique.
Il est souvent intéressant, lorsqu'on travaille avec des données issues de plusieurs sources, de pouvoir regrouper en un seul plusieurs fichiers CSV. Cela est particulièrement facile lorsque les fichiers ont la même structure. Supposons, par exemple, que nous cherchions à regrouper les trois fichiers Fich1.csv, Fich2.csv et Fich3.csv structurés de la même manière.
Deux cas sont à considérer selon que la première ligne des fichiers contient ou non les titres des colonnes. Le second cas étant le plus simple, nous commencerons par lui.
Le programme ci-dessous permet de créer un fichier Fichtout.csv qui regroupe les trois fichiers CSV qui ne contiennent pas les titres des colonnes en première ligne.
Sub Agreger()
Dim enr as String
Open "C:\Essais\Fichtout.csv" For Output As #4
Open "C:\Essais\Fich1.csv" For Input As #1
Open "C:\Essais\Fich2.csv" For Input As #2
Open "C:\Essais\Fich3.csv" For Input As #3
For i=1 to 3
Do while Not EOF(i)
Line Input #i, enr
Print #4, enr
Loop
Close #i
Next i
Close #4
End Sub
Si les fichiers contiennent en première ligne les titres des colonnes, il faut commencer par introduire une ligne de titres dans le fichier Fichtout.csv puis, pour les trois autres fichiers, lire la première ligne sans la copier dans le fichier Fichtout.csv. C'est que montre le programme suivant :
Sub Agreger()
Dim enr as String
Open "C:\Essais\Fichtout.csv" For Output As #4
Open "C:\Essais\Fich1.csv" For Input As #1
Open "C:\Essais\Fich2.csv" For Input As #2
Open "C:\Essais\Fich3.csv" For Input As #3
Print #4, "Produit;Vendeur;Ventes"
For i=1 to 3
Line Input #i, enr
Do while Not EOF(i)
Line Input #i, enr
Print #4, enr
Loop
Close #i
Next i
Close #4
End Sub
On peut également vouloir regrouper tous les fichiers CSV contenus dans un dossier. Supposons, par exemple, que le dossier dans lequel se trouve le classeur Excel possède un sous-dossier nommé FichiersCSV où sont placés les fichiers CSV à regrouper.
Pour cela nous allons utiliser la fonction Dir de VisualBasic. Notons tout de suite que cette fonction n'est pas réellement utilisable si les fichiers sont stockés sur OneDrive. Pour sa première utilisation la fonction Dir doit être utilisée avec un argument précisant le chemin d'accès au dossier considéré, elle renvoie alors le nom du premier fichier se trouvant dans ce dossier. Ensuite, la fonction Dir utilisée sans argument permet de lire le fichier suivant. Par exemple :
Dir("C:\FichiersCSV")
Dir
La première ligne de ce programme renvoie le nom du premier fichier, la deuxième ligne renvoie le nom du deuxième fichier.
La procédure suivante permet de regrouper les fichiers CSV contenus dans le même dossier en supposant qu'ils ont la même structure et qu'ils n'ont pas de titres en première ligne. Le programme suivant réalise le regroupement :
Sub Agreger()
Dim enr as String
Rep = ThisWorkbook.Path
Dossier = Rep & "\FichiersCSV\"
fichier = Dir(Dossier)
Open Rep & "\Fichtout.csv" For Output As #1
i = 2
Do While fichier <> ""
If Right(fichier, 4) = ".csv" Then
fic = Dossier & fichier
Open fic for input as #i
Do while Not EOF(i)
Line Input #i, enr
Print #1, enr
Loop
Close#i
i = i + 1
End If
fichier = Dir
Loop
Close #1
End Sub
Dans ce programme, nous avons utilisé la fonction Path qui renvoie l'adresse du dossier contenant le classeur (elle n'est pas utilisable avec OneDrive). Puis nous avons utilisé Dir(Dossier) qui renvoie le nom du premier fichier contenu dans le dossier Dossier. Enfin, à la fin de la boucle, Dir contient le nom du fichier suivant.
Il est tout à fait possible d'utiliser des fichiers CSV dans le cadre d'une approche multidimensionnelle comme celle que nous avons présentée pour les bases de données. Pour cela il suffit de structurer les fichiers CSV en hypercubes, c'est-à-dire en fichiers ne comportant qu'une seule variable numérique.
Pour créer et utiliser les fichiers CSV structurés il est plus facile d'utiliser des fichiers avec le délimiteur virgule. Nous présenterons donc les possibilités qu'offrent ces fichiers CSV en partant d'un exemple.
Nous supposerons que nous disposons de données provenant des entreprises et nous voulons en déduire les opérations de comptabilité nationale que sont la production, la consommation intermédiaire (CI) et la valeur ajoutée (VA). Pour cela, nous disposons d'une table de données située sur la feuille Données du classeur où nous écrirons notre programme. Ces données se présentent de la manière suivante :
Nous disposons également d'une table de passage permettant de passer des variables des statistiques d'entreprises aux opérations de la comptabilité nationale ainsi que nous l'avons montré au chapitre sur l'approche multidimensionnelle. Cette table est située sur la feuille TablePac de notre classeur Excel. Elle se présente de la manière suivante :
Enfin, nous utiliserons une nomenclature d'activités pour permettre des regroupements. Celle-ci est située sur la feuille Nomenclatures et se présente sous la forme :
Pour commencer, nous devons stocker les données de ces trois tables dans des fichiers CSV structurés en hypercubes.
Les données de l'entreprise seront stockées dans le fichier FichDonnees.csv dont la structure est donnée par la première ligne, c'est-à-dire :
"Entreprise","Activité","Variable","Valeur"
Le champ Variable n'existe pas dans le tableau des statistiques des entreprises mais il correspond à la dimension de l'hypercube dont les éléments sont Production biens, Production services, CI biens, CI services.
La table de passage sera stockée dans le fichier FichPac.csv de structure :
"Opération","Variable","ValPac"
Là encore, le champ Opération n'existe pas dans la table de passage mais il correspond à la dimension de l'hypercube dont les éléments sont Production, CI, VA. Le champ Variable est le même que celui utilisé dans le fichier des données et c'est lui qui nous permettrra de faire le lien entre les deux hypercubes.
Enfin, la nomenclature d'activités sera stockée dans le fichier FichNomen.csv de structure :
"Activité N3","Activité N2","Activité N1"
Le programme de création des trois fichiers se présente ainsi :
Option Base 1
Sub CréerFichiers()
'Création du fichier des données des entreprises
Dim Donnees As Variant
FichDonnees = "C:\Users\franc\OneDrive\AGIRabcd\FichDonnees.csv"
Open FichDonnees For Output As #1
Write #1, "Entreprise", "Activité", "Variable", "Valeur"
Set f = ThisWorkbook.Sheets("Données")
Donnees = f.Range("A1").CurrentRegion
For i = LBound(Donnees, 1) + 1 To UBound(Donnees, 1)
Entreprise = Donnees(i, 1)
Activite = Donnees(i, 2)
For j = 3 To 6
Variable = Donnees(1, j)
Valeur = Donnees(i, j)
If Valeur <> 0 Then Write #1, Entreprise, Activite, Variable, Valeur
Next j
Next i
Close #1
' Création du fichier de la table de passage aux comptes nationaux
Set f = ThisWorkbook.Sheets("TablePac")
FichPac = "C:\Users\franc\OneDrive\AGIRabcd\FichPac.csv"
Open FichPac For Output As #1
Write #1, "Opération", "Variable", "ValPac"
Dim TablePac As Variant
TablePac = f.Range("A1").CurrentRegion
For j = 2 To 4
Operation = TablePac(1, j)
For i = 2 To 5
Variable = TablePac(i, 1)
ValPac = TablePac(i, j)
If ValPac <> 0 Then Write #1, Operation, Variable, ValPac
Next i
Next j
Close #1
'Création du fichier des nomenclatures
Set f = ThisWorkbook.Sheets("Nomenclatures")
FichNomenc = "C:\Users\franc\OneDrive\AGIRabcd\FichNomenc.csv"
Open FichNomenc For Output As #1
Write #1, "Activité N3", "Activité N2", "Activité N1"
Dim TableNomenc As Variant
TableNomenc = f.Range("A1").CurrentRegion
For i = LBound(TableNomenc, 1) + 1 To UBound(TableNomenc, 1)
Write #1, TableNomenc(i, 1), TableNomenc(i, 2), TableNomenc(i, 3)
Next i
Close #1
End Sub
Le programme suivant va maintenant générer à partir des trois fichiers précédents le fichier DonneesCN.csv qui contient toutes les informations nécessaires et dont la structure est :
"Entreprise","Activite N3","Activite N2","Activite N1","Variable","Operation","Valeur"
Le programme se présente ainsi :
Option Base 1
Sub Calculer()
FichDonnees = "C:\Users\franc\OneDrive\AGIRabcd\FichDonnees.csv"
Open FichDonnees For Input As #1
FichPac = "C:\Users\franc\OneDrive\AGIRabcd\FichPac.csv"
Open FichPac For Input As #2
FichNomenc = "C:\Users\franc\OneDrive\AGIRabcd\FichNomenc.csv"
Open FichNomenc For Input As #3
DonneesCN = "C:\Users\franc\OneDrive\AGIRabcd\DonneesCN.csv"
Open DonneesCN For Output As #4
' Charge le fichier FichPac.csv dans la matrice TablePac
Dim TablePac()
ReDim TablePac(3, 1)
Input #2, Titre1, Titre2, Titre3
n = 1
Do While Not EOF(2)
Input #2, Operation, Variable, ValPac
TablePac(1, n) = Operation
TablePac(2, n) = Variable
TablePac(3, n) = ValPac
n = n + 1
ReDim Preserve TablePac(3, n)
Loop
' Charge le fichier FichNomenc.csv dans la matrice TableNomenc
Dim TableNomenc()
ReDim TableNomenc(3, 1)
Input #3, Titre1, Titre2, Titre3
n = 1
Do While Not EOF(3)
Input #3, ActivN3, ActivN2, ActivN1
TableNomenc(1, n) = ActivN3
TableNomenc(2, n) = ActivN2
TableNomenc(3, n) = ActivN1
n = n + 1
ReDim Preserve TableNomenc(3, n)
Loop
Write #4, "Entreprise", "Activite N3", "Activite N2", "Activite N1", "Variable", "Operation", "Valeur"
Input #1, Entreprise, Activite, Variable, Valeur
Do While Not EOF(1)
Input #1, Entreprise, Activite, Variable, Valeur
For i = LBound(TablePac, 2) To UBound(TablePac, 2)
If Variable = TablePac(2, i) Then
For j = LBound(TableNomenc, 2) To UBound(TableNomenc, 2)
If Activite = TableNomenc(1, j) Then
Write #4, Entreprise, TableNomenc(1, j), TableNomenc(2, j), TableNomenc(3, j), Variable, TablePac(1, i), Valeur * TablePac(3, i)
Exit For
End If
Next j
End If
Next i
Loop
Close #1, #2, #3, #4
End Sub
Le fichier DonneesCN.csv peut être lu dans un tableau croisé dynamique qui permettra une grande variété de présentations. Par exemple :
Ou encore :
Il est tout à fait possible d'utiliser ces méthodes pour confectionner les comptes nationaux d'un pays réel, cela a déjà été fait.
Il peut être utile de renommer et de supprimer des fichiers. On utilise pour cela les instructions Name As et Kill.
Par exemple, supposons que nous voulions multiplier par 2 toutes les ventes dans le fichier FichierCSV.csv. Nous ne pouvons pas le faire directement et nous allons donc créer un fichier temporaire Temp.csv.
Nous allons lire le fichier FichierCSV.csv, extraire les ventes de chaque enregistrement, les multiplier par 2, recréer un nouvel enregistrement que nous enverrons dans le fichier Temp.csv. Nous détruirons ensuite le fichier FichierCSV.csv et renommerons le fichier Temp.csv en FichierCSV.csv. Le programme pour cela sera le suivant :
Sub DoublerVentes()
Dim enr As String
Dim Texte As Variant
Open "C:\Essais\FichierCSV.csv" For Input As #1
Open "C:\Essais\Temp.csv" For Output As #2
Do While Not EOF(1)
Line Input #1, enr
Texte = Split(enr, ";")
Print #2, Texte(0) & ";" & Texte(1) & ";" & 2 * Texte(2)
Loop
Close #1
Close #2
Kill "C:\Essais\FichierCSV.csv"
Name "C:\Essais\Temp.csv" As "C:\Essais\FichierCSV.csv"
End Sub
Nous pouvons vérifier avec le bloc-notes que les ventes ont bien été doublées dans le fichier FichierCSV.csv.
Nous pouvons utiliser la même méthode pour modifier un seul enregistrement. Par exemple, on peut fixer à 5000 la valeur des ventes de robes de Dupond avec le programme suivant :
Sub ModifVentes()
Dim enr As String
Dim Texte As Variant
Open "C:\Essais\FichierCSV.csv" For Input As #1
Open "C:\Essais\Temp.csv" For Output As #2
Do While Not EOF(1)
Line Input #1, enr
Texte = Split(enr, ";")
If Texte(0) = "Robes" And Texte(1) = "Dupond" Then Texte(2) = 5000
Print #2, Texte(0) & ";" & Texte(1) & ";" & Texte(2)
Loop
Close #1
Close #2
Kill "C:\Essais\FichierCSV.csv"
Name "C:\Essais\Temp.csv" As "C:\Essais\FichierCSV.csv"
End Sub
On peut également supprimer un enregistrement, par exemple celui des robes de Dupond, en remplaçant dans le programme précédent la boucle par :
Do While Not EOF(1)
Line Input #1, enr
Texte = Split(enr, ";")
If Not (Texte(0) = "Robes" And Texte(1) = "Dupond") Then
Print #2, Texte(0) & ";" & Texte(1) & ";" & Texte(2)
End If
Loop
Pour des fichiers de taille moyenne, cette procédure est généralement rapide, pour de très gros fichiers il est généralement préférable de les décomposer en plusieurs fichiers qui seront regroupés au moment de l'analyse. Dans notre exemple, il serait possible d'avoir un fichier par client ou par produit.
Les fichiers texte, y compris les fichiers CSV, sont de fichiers séquentiels, c'est-à-dire que tous les enregistrements sont placés les uns à la suite des autres et qu'il n'est pas possible d'accéder à un enregistrement sans lire tous ceux qui le précèdent. Lorsque les fichiers sont volumineux, cela implique qu'il peut être long d'accéder à un enregistrement particulier.
Aussi, lorsqu'il est important de pouvoir accéder rapidement à un enregistrement particulier, il est souvent préférable d'utiliser des fichiers à accès direct.
Dans un fichier à accès direct, chaque enregistrement possède un numéro et il est possible de le lire directement en l'appelant par son numéro. Tous les enregistrements doivent avoir la même longueur.
Un fichier accès direct s'ouvre comme un fichier texte en utilisant l'instruction Open mais en utilisant l'option Random :
Open fich For Random As #n Len = Longueur
Où fich désigne le nom complet du fichier, n un nombre compris entre 1 et 511 et Longueur la longueur de chaque enregistrement qui doit être calculée à partir de la structure des enregistrements.
Un fichier à accès direct ouvert de cette manière pourra être utilisé à la fois pour la lecture et l'écriture.
Comme les fichiers texte, un fichier à accès direct doit être fermé après son utilisation par l'instruction Close #n, où n est le numéro utilisé pour l'ouverture du fichier.
Pour écrire des données dans un fichier à accès direct, il faut tout d'abord décrire la structure des enregistrements puis indiquer leur longueur. Ensuite, il faut définir l'enregistrement et lui attribuer un numéro.
Pour décrire la structure des enregistrements, il faut utiliser l'instruction Type. Cette instruction doit être placée au tout début du module où se situent les programmes et elle est valable pour l'ensemble des programmes. Dans un programme associé à un contrôle ActiveX, il faut toutefois préciser l'option Private. Un exemple de définition est la suivante :
Private Type enreg
jour As Date
prod As String * 12
vers As String * 1
nvers As Long
ere(1 To 25, 1 To 7) As Double
End Type
Dans le programme utilisé pour écrire un enregistrement, nous devons d'abord le déclarer par l'instruction Dim. Par exemple :
Dim unERE As enreg
Pour écrire un enregistrement, il faut utiliser la fonction Put. Sa syntaxe est la suivante :
Put #n, num, unEnreg
Où n désigne le numéro du fichier à accès direct, num le numéro de l'enregistrement et unEnreg la variable contenant les données à saisir.
Reprenons notre exemple précédent des ventes en le présentant différemment, pour changer. Les données sont les suivantes :
Le programme suivant crée un fichier à accès direct où chaque produit correspond à un enregistrement :
Type enreg
produit As String * 20
ventes(1 To 2) As Double
End Type
-------------------------------------------------------------------
Sub EcrireAccesDirect()
Dim unProduit As enreg
Set f = ThisWorkbook.Sheets("Données")
Open "C:\Essais\FichierDirect" For Random As #1 Len = Len(unProduit)
For i = 1 To 4
With unProduit
.produit = f.Cells(i + 1, 2)
.ventes(1) = f.Cells(i + 1, 3)
.ventes(2) = f.Cells(i + 1, 4)
End With
Put #1, i, unProduit
Next i
Close #1
End Sub
Si l'on ouvre le fichier FichierDirect avec le Bloc-notes nous ne pouvons lire que les produits car ce n'est pas un fichier texte.
Pour lire un enregistrement spécifique d'un fichier à accès direct, nous devons utiliser la commande Get dont la syntaxe est la suivante :
Get #n, num, unEnreg
Où n est l'entier correspondant au fichier ouvert, num le numéro de l'enregistrement et unEnreg la variable de type correspondant aux enregistrements qui recevra l'enregistrement numéro num.
Par exemple, le programme suivant lit le troisième enregistrement correspondant aux pantalons :
Sub LireAccesDirect()
Dim unProduit As enreg
Set f = ThisWorkbook.Sheets("Données")
Open "C:\Essais\FichierDirect" For Random As #1 Len = Len(unProduit)
Get #1, 3, unProduit
With unProduit
f.Cells(10, 2) = .produit
f.Cells(10, 3) = .ventes(1)
f.Cells(10, 4) = .ventes(2)
End With
Close #1
End Sub
Auteur : Francis Malherbe