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 automatiquement l'encodage d'un fichier
Nous avons déjà appris à adapter le
système d'encodage pour parvenir Ã
importer des fichiers texte sans problème de transcription. Mais dans l'application que nous avions montée, nous laissions la possibilité à l'utilisateur de définir l'
encodage, par le biais de cases à cocher, avant l'importation. Ici, nous souhaitons automatiser le processus pour qu'il soit totalement transparent pour l'opérateur. C'est désormais au
code VBA de déterminer si le fichier est encodé en
iso-8859-1 ou en
utf-8.
Base de données Access à télécharger
Pour démontrer cette solution, nous proposons de baser l'étude sur l'application qui avait permis d'
importer des fichiers de type texte.
Vous le remarquez, la base de données est accompagnée d'un sous dossier. Il héberge quelques fichiers de textes. Il s'agit de descriptifs de formations sur la
fonction Excel Decaler. Mais ils ne sont pas tous encodés de la même manière. Et avec notre précédente application, des problèmes de transcription vont surgir. Nous allons le découvrir.
- Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
- Cliquer alors sur le bouton Activer le contenu du bandeau de sécurité,
- Dans le volet de navigation sur la gauche, double cliquer sur le formulaire fParcourir,
- Sur la droite du formulaire, cliquer sur le bouton à l'icône du dossier,
- Dans la boîte de dialogue, ouvrir le dossier fonction-excel-decaler du dossier de décompresion,
- Puis, cliquer sur le bouton Ok pour procéder à l'importation,
Comme vous pouvez le voir, tous les noms des fichiers contenus dans le dossier sélectionné sont importés dans une zone de liste déroulante, sur la droite du formulaire, à gauche du bouton à l'icône du dossier.
- Dans cette liste, cliquer sur le nom du premier fichier,
Comme vous pouvez l'apprécier, son contenu est instantanément restitué dans la zone de texte. Aucun problème de transcription, notamment sur les accents, n'est à déplorer.
- Maintenant, cliquer sur le nom du fichier suivant,
Cette fois, des problèmes surgissent. Tous les accents sont mal transcrits. Notre
code VBA est conçu pour interpréter les fichiers au
format iso-8859-1. Or ce dernier est
encodé en utf-8. C'est la raison pour laquelle, les accents notamment, ne sont pas compris.
Le code VBA existant
Un
code VBA Access est donc déjà bien présent. Il offre une
boîte de dialogue pour désigner un
dossier et réaliser l'
importation des fichiers qu'il contient. Nous proposons de le constater.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le mode Création,
Nous basculons ainsi dans la vue en conception du formulaire.
- Puis réaliser le raccourci clavier ALT + F11,
Nous découvrons la présence des
procédures événementielles listeFichiers_Click et
parcourir_Click. La seconde affiche la boîte de dialogue permettant de choisir un emplacement au clic sur le bouton à l'icône d'un dossier. La première permet d'importer dans la zone de texte enrichie, le contenu du fichier cliqué par l'utilisateur dans la zone de liste déroulante.
...
Set objFlux = CreateObject("ADODB.Stream")
objFlux.charset = "iso-8859-1"
objFlux.Open
objFlux.LoadFromFile (fichier)
Do Until objFlux.EOS
texte = texte & objFlux.ReadText(-2) & "<br />" '-2 :ligne à ligne
Loop
...
Nous utilisons bien la
classe ADODB.Stream et comme vous pouvez le constater, nous considérons par défaut que tous les fichiers sont encodés au
format iso-8859-1. C'est là précisément que le problème survient quand il est question de traiter des
fichiers encodés en utf-8.
Tester les caractères incorrects
Contrairement au C# et au VB dans Dot Net, le
VBA n'offre pas de méthode pour connaître l'
encodage d'un fichier avant de procéder à son importation. L'astuce de contournement consiste à importer son contenu en
ISO, à tester en mémoire la présence de
caractères mal transcrits et à livrer le verdict pour adapter l'
encodage à adopter.
- Après la destruction de la variable objFlux, créer l'instruction conditionnelle suivante :
...
Set objFlux = Nothing
If InStr(1, texte, "é") > 0 Then
texte = ""
End If
contenu.Value = texte
...
Grâce à la
fonction InStr (In String), nous cherchons à trouver la présence d'un caractère mal encodé, l'accent aigüe sur le e en l'occurrence ici (Le grand A accentué suivi du symbole du Copyright é). Si une position est décelée (>0), nous en déduirons que le format doit être adapté. En attendant, nous réinitialisons le texte importé (texte = ""), puisqu'il était mal formé.
Adapter le système d'encodage
Dans la branche de cette instruction conditionnelle, si le critère est vérifié, nous devons pratiquement exécuter la même importation que précédemment, mais en adaptant le système d'encodage pour le basculer en
utf-8.
- Dans l'instruction conditionnelle, adapter la précédente importation comme suit :
...
Set objFlux = Nothing
If InStr(1, texte, "é") > 0 Then
texte = ""
Set objFlux = CreateObject("ADODB.Stream")
objFlux.charset = "utf-8"
objFlux.Open
objFlux.LoadFromFile (fichier)
Do Until objFlux.EOS
texte = texte & objFlux.ReadText(-2) & "<br />" '-2 :ligne à ligne
Loop
End If
contenu.Value = texte
...
Avec ce réajustement à la volée, nous devrions être en mesure de lire tout type de fichier.
Importer les fichiers encodés
Il est donc temps de tester ce
code VBA Access.
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire Access (ALT + Tab),
- L'exécuter en enfonçant la touche F5 du clavier,
- Cliquer sur le bouton à l'icône du dossier,
- Désigner celui comportant les fichiers texte importés,
Si vous cliquez sur le premier nom de fichier dans la zone de liste, l'importation se réalise toujours avec succès. Si vous cliquez sur le deuxième, contrairement à précédemment, son système d'encodage est intercepté à la volée pour gérer les accents. Et comme vous pouvez l'apprécier, son importation et sa transcription sont parfaites.