Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Détecter encodage Iso ou Utf-8
Nous savons déjà importer des données externes en
VBA Excel. Mais ce que nous maîtrisons moins, c'est la gestion automatique des
encodages. En effet, s'ils sont mal interprétés, les caractères latins dont les
accents, sont mal retranscrits à l'arrivée. Ici, nous allons démontrer comment
détecter automatiquement l'encodage de chaque fichier pour adapter les flux de lecture et offrir des résultats sans défaut.
Pour développer cette solution, nous proposons d'agir à partir d'un
classeur Excel offrant déjà un
code VBA pour
importer des données.
La décompression livre le
classeur Excel accompagné d'un
sous dossier. Il est nommé
import et il héberge
deux fichiers texte. Les données y sont organisées au
format Csv. Chaque information est séparée d'une autre par un
délimiteur. Ce délimiteur est le
point-virgule. Ce point-virgule est déjà géré par le
code VBA Excel que nous allons découvrir. C'est ainsi qu'il importe les données et les diffuse dans des colonnes voisines. En revanche, ces deux fichiers ne sont pas encodés de la même façon. Vous pouvez le constater en les ouvrant dans l'éditeur Notepad++ et en déployant le menu encodage.
Importation classique des données
Pour constater que le
code VBA réceptionné est déjà en mesure d'importer ce type de données, nous proposons d'accéder à son classeur.
- Double cliquer sur le fichier du classeur pour l'ouvrir dans Excel,
- Cliquer alors sur le bouton Activer la modification dans le bandeau de sécurité,
Vous découvrez la présence d'une grille destinée à réceptionner les données à importer.
- Sur la droite de la feuille, cliquer sur le bouton à l'icône d'un dossier,
- Dans la boîte de dialogue qui suit, ouvrir le dossier import que nous avons téléchargé,
- Puis, valider par le bouton Ok en bas à droite de la boîte de dialogue,
Les données des deux fichiers sont effectivement importées dans la
feuille Excel. Le
code VBA est capable de traiter tous les fichiers d'un dossier désigné, quel que soit leur nombre. Le processus semble donc s'être déroulé parfaitement. Mais à y regarder de plus près en atteignant les dernières lignes, vous constatez que la désillusion est grande. Ces informations appartiennent au second fichier texte. Or ce dernier est
encodé en Utf-8. Et cet encodage n'est pas encore géré par notre code. C'est la raison pour laquelle les
accents sont mal
retranscrits.
Le code VBA d'importation
Pour comprendre ce qui ne va pas, nous proposons d'accéder au
code VBA existant.
- Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel,
Après l'instanciation de la classe pour les boîtes de dialogue :
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
Vient l'instanciation de la classe pour manipuler les fichiers du disque :
Set objetFichier = CreateObject("scripting.filesystemobject")
Puis, c'est au tour de celle permettant de créer un flux de lecture en mémoire :
Set flux = CreateObject("ADODB.Stream")
Et comme vous le constatez, nous partons du principe que tous les fichiers à importer sont encodés en Iso :
flux.Charset = "iso-8859-1".
C'est bien sûr ici que réside le problème à corriger. A ce titre, vous notez la présence du commentaire qui suit pour marquer l'emplacement du code VBA à injecter.
Ensuite, nous réalisons la lecture de chaque fichier ligne à ligne :
flux.ReadText(-2). Dans le même temps, nous découpons les informations de la ligne récupérée sur le point-virgule :
Split(flux.ReadText(-2), ";"). C'est alors que nous engageons une
boucle For Next pour répartir ces données découpées dans différentes colonnes, pour la ligne en cours sur la feuille :
For i = 0 To UBound(chaine).
Tester les données dans le flux
Pour gérer automatiquement l'importation des données accentuées, quel que soit l'encodage, l'astuce consiste à ouvrir une première fois un flux de lecture, à tester les données pour déterminer l'encodage pour refermer le flux et le rouvrir avec la bonne interprétation (Charset).
- Sous la ligne du commentaire, ajouter les instructions VBA suivantes :
...
flux.Open
flux.LoadFromFile (chemin & "\" & chaqueFichier.Name)
texte = flux.ReadText()
Set flux = Nothing
...
Interpréter l'encodage
Maintenant et pour redonner la main au code existant qui suit, nous devons de nouveau instancier la classe permettant d'ouvrir un flux de lecture avec le système d'encodage désormais adapté.
- A la suite du code précédent et avant le code existant, ajouter l'instruction VBA suivante :
...
Set flux = Nothing
Set flux = CreateObject("ADODB.Stream")
...
Nous créons donc un nouveau flux de lecture. Nous récupérons l'intégralité des données du fichier (flux.ReadText()) en cours d'étude, que nous stockons dans la
variable texte. Puis nous fermons le flux. Maintenant que les informations complètes du fichier sont stockées en variable, nous allons pouvoir les tester avant de procéder à leur importation.
- A la suite du nouveau code, ajouter les instructions VBA suivantes :
...
If InStr(1, texte, "é") > 0 Then
flux.Charset = "utf-8"
Else
flux.Charset = "iso-8859-1"
End If
...
Nous testons la présence d'un caractère mal encodé dans le flux importé. Cette succession de symboles (é) représente la
lettre e avec un
accent aigü. Nous pourrions en tester d'autres mais il s'agit de l'accent le plus fréquent. Si sa présence mal transcrite est avérée, nous réglons l'
encodage en utf-8. Dans le cas contraire, nous restons en
iso.
Il est temps de tester ce
code VBA de repérage automatique des
systèmes d'encodage.
- Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel (ALT + Tab),
- Cliquer sur le bouton à l'icône du dossier,
- Ouvrir le dossier nommé import et valider par le bouton Ok,
Les données sont parfaitement importées comme précédemment mais cette fois et comme vous pouvez le constater, tous les accents sont parfaitement gérés et ce, quel que soit le
système d'encodage détecté automatiquement.