Ce tutoriel est une partie de : celui-ci.
Le but ici est de créer un dictionnaire, au format texte (extension .txt), composé d'un mot par ligne, à partir du dictionnaire disponible à l'installation du navigateur firefox. Il va donc nous falloir les outils nécessaires à la lecture, la modification et l'écriture dans un fichier texte à partir de VBA dans Excel.
Il existe plusieurs méthodes permettant la lecture d'un fichier texte. Celle retenue ici (accès séquentiel) est la suivante :
Sub LireDicoFirefox() Dim Tb() As String, Chemin As String, num As Long, i As Long Chemin = ThisWorkbook.Path NomFicTxt = "\DicoFirefoxFrancais.txt" 'permet de retrouver le 1er numéro libre de désignation d'un fichier num = FreeFile 'ouvre le fichier en lecture Open Chemin & NomFicTxt For Input As #num i = -1 'boucle tant que l'on n'a pas atteint la fin du fichier While Not EOF(1) '***************Stockage des lignes dans la variable tableau Tb i = i + 1 ReDim Preserve Tb(i) Line Input #1, Tb(i) Wend Close #num 'fermeture End Sub
Nota : Dans ce cas précis, l'utilisation de la variable tableau Tb() pour stocker les lignes du fichier texte est inutile car le dictionnaire firefox ne comprends qu'une seule ligne.
La solution la plus facile est d'analyser le résultat présenté par la procédure de lecture, puis de modifier, directement dans Excel, les chaînes de caractères devant l'être.
Dans notre exemple, à l'importation des données, on se rend compte que :
Il nous faut donc traiter cela sous Excel.
Notre liste de mots est stockée dans la variable Tb(). Nous allons, dans un premier temps, écrire deux fonctions nous permettant d'apurer la liste des mots des caractères spéciaux et de supprimer les mots contenant des chiffres (1er etc.)
Voici les codes de ces deux fonctions.
'Cette fonction remplace les caractères spéciaux 'contenus dans le dictionnaire firefox Function RemplaceCarSpec(monMot As String) Dim motTemp As String 'La méthode utilisée ici est : Replace (cf aide VBA à ce sujet) motTemp = Replace(monMot, "é", "e") motTemp = Replace(motTemp, "ï", "i") motTemp = Replace(motTemp, "è", "e") motTemp = Replace(motTemp, "-", "") motTemp = Replace(motTemp, "ç", "c") motTemp = Replace(motTemp, "ë", "e") motTemp = Replace(motTemp, "ê", "e") motTemp = Replace(motTemp, "ü", "u") motTemp = Replace(motTemp, "â", "a") motTemp = Replace(motTemp, "ä", "ae") motTemp = Replace(motTemp, "ô", "o") motTemp = Replace(motTemp, "ÿ", "y") motTemp = Replace(motTemp, "î", "i") motTemp = Replace(motTemp, "Å""", "oe") motTemp = Replace(motTemp, "û", "u") motTemp = Replace(motTemp, "æ", "ae") motTemp = Replace(motTemp, "Ã¥", "a") motTemp = Replace(motTemp, "ö", "o") motTemp = Replace(motTemp, "Ã", "a") motTemp = Replace(motTemp, "É", "e") motTemp = Replace(motTemp, "È", "e") motTemp = Replace(motTemp, "Ã...", "a") motTemp = Replace(motTemp, "Å'", "oe") motTemp = Replace(motTemp, "Å"", "oe") 'Transforme notre chaîne de caractères en Majuscules RemplaceCarSpec = UCase(motTemp) End Function
Nota : Nous aurions pu résumer toute cette série de Replace en les cumulant sur une seule ligne. Exemple : motTemp = Replace(Replace(monMot, "é", "e"), "Å"", "oe"). Cependant, le cumul des fonctions Replace est plus lent que son utilisation en plusieurs lignes.
'Cette fonction va stocker les mots ne contenant pas de chiffres 'en début ou en fin de chaîne (ex : supprime 2ND) 'Sa particularité est qu'on lui passe en paramètre une variable tableau 'et qu'elle renvoie une variable tableau Function Affine(Tbl) Dim TbTemp(), i As Long, CptTbNum As Long, CptTemp As Long For i = LBound(Tbl) To UBound(Tbl) If Len(Tbl(i)) > 2 And Len(Tbl(i)) < 17 Then If Not IsNumeric(Right(Tbl(i), 1)) And Not IsNumeric(Left(Tbl(i), 1)) Then ReDim Preserve TbTemp(CptTemp) TbTemp(CptTemp) = Tbl(i) CptTemp = CptTemp + 1 End If End If Next i Affine = TbTemp End Function
Le code permettant de séparer les mots selon leurs séparateurs est le suivant (utilisation de Split) :
Dim PremierJet() As String 'Tb(0) car le dictionnaire firefox ne contient qu'une ligne 'Dans le cas contraire il eut fallu boucler PremierJet = Split(Tb(0), "/") For i = LBound(PremierJet) To UBound(PremierJet) PremierJet(i) = Split(PremierJet(i), Chr(9))(1) PremierJet(i) = Split(PremierJet(i), Chr(10))(1) Next i
Pour écrire dans un fichier texte, la méthode est sensiblement équivalente à la lecture.
num = FreeFile 'Ouvre en écriture et écrase un fichier précédent du même nom Open Chemin & "\DicoFirefoxFrancaisTransforme.txt" For Output As #num 'Boucle sur la liste des mots For i = LBound(ListeMots) To UBound(ListeMots) 'Ecrit dans le fichier texte ligne par ligne Print #1, ListeMots(i) Next i 'Fermeture Close #num
Vous pouvez retrouver l'ensemble de cette procédure dans le classeur ci-joint : http://cjoint.com/?DHfkA1c9DYZ.
Est également joint le dictionnaire firefox « brut », au format txt : http://cjoint.com/?DHfkBLhg1As
Ce tutoriel est un complément de : celui-ci. Vous pourrez y trouver un exemple d'utilisation.