Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA - Copier le texte d'un fichier .txt en TextBox

Dudu2

XLDnaute Barbatruc
Bonjour,

Je rencontre un problème que vous avez peut-être déjà résolu.

En copiant le contenu d'un fichier texte dans une TextBox j'obtiens des caractères étranges. Est-ce le résultat d'un codage Unicode des caractères accentués dans le fichier texte ?

Fichier texte TextBox


Merci par avance pour toute indication.

Edit:
Je viens de voir qu'en enregistrant le fichier texte en encodage ANSI le problème ne se pose plus.
Mais ça créé l'obligation de cet encodage qui n'est pas pas défaut.
Une solution pour l'encodage par défaut des fichiers texte serait utile.
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Peut-être mais tu me dis que ça fonctionne chez toi en écrivant simplement un texte avec des accents etc.
Je fais la même chose avec une variable texte avec des données du fichier.
Il n'y est plus le BOM dans la variable non ?
Je ne sais pas si le BOM est dans la variable, mais ce qui est sûr c'est qu'il est visible dans la deuxième fenêtre...
Tu ne l'as pas vu ???
 

TooFatBoy

XLDnaute Barbatruc
Pourquoi dans la deuxième fenêtre as-tu écrit "apres comversion" ?
Tu parles de la conversions d'UTF-8 en UTF-8 ???

Si tu ouvres de l'UTF8 en binaire, je crois que tu n'auras jamais les caractères accentués, mais seulement leur codage en UTF-8.
Je ne comprends pas pourquoi tu ne passes pas par ta fonction de lecture.
 

patricktoulon

XLDnaute Barbatruc
re oui bien sur
mais le texte va dans la variable texto c'est du texte après non ?

j'ouvre le fichier mémo udf 8.txt qui nous pose problème avec ma bifonction
qui lit d’abords en binaire
et si il y a un caractères bizarre je le close et passe en lecture stream
à la sortie mes caractères sont bon dans la variable texto
je la réinjecte dans un stream et sauve normalement là on est bons

ensuite je ouvre le fichier que je viens de faire et il ressort avec les caractères
 

TooFatBoy

XLDnaute Barbatruc
re oui bien sur
mais le texte va dans la variable texto c'est du texte après non ?
C'est toujours du texte. La différence c'est l'encodage.


Ben non puisque tu utilises la macro qui écrit dans un fichier en codant les caractères en UTF-8 et qui ajoute le BOM.
Donc quand tu rouvres le fichier, les caractères sont toujours encodés en UTF-8, et il y a le BOM en plus.

ensuite je rouvre le fichier que je viens de faire et il ressort avec les caractères
Je ne comprends pas ce que tu veux dire par "avec les caractères". Tu parles du BOM ?
Si oui, ben c'est normal, puisque comme je l'ai dit au début la macro écrit en UTF-8 avec BOM.
 

TooFatBoy

XLDnaute Barbatruc
Voici deux solutions (c'est la même solution en fait ) pour écrire dans un fichier en UTF-8 sans BOM.

La version originelle d'Ekkehard.Horner :
VB:
Sub Ecrire_UTF8sansBOM_EkkehardHorner()
' https://stackoverflow.com/questions/31435662/vba-save-a-file-with-utf-8-without-bom/31436631
'
Const adSaveCreateNotExist = 1
Const adSaveCreateOverWrite = 2
Const adTypeBinary = 1
Const adTypeText = 2
Dim objStreamUTF8
Dim objStreamUTF8NoBOM

    Set objStreamUTF8 = CreateObject("ADODB.Stream")
    Set objStreamUTF8NoBOM = CreateObject("ADODB.Stream")

    With objStreamUTF8
        .Charset = "UTF-8"
        .Open

        .WriteText "Le père Noël a été vu à l'étang où il a pêché !", 1
        .WriteText "Autres caractères accentués : àéèôûïñ"

        .Position = 0
'        .SaveToFile ThisWorkbook.Path & "\UTF8avecBOM_EkkehardHorner.txt", adSaveCreateOverWrite
        .Type = adTypeBinary
        .Position = 3
    End With

    With objStreamUTF8NoBOM
        .Type = adTypeBinary
        .Open
        objStreamUTF8.CopyTo objStreamUTF8NoBOM
        .SaveToFile ThisWorkbook.Path & "\UTF8sansBOM_EkkehardHorner.txt", adSaveCreateOverWrite
    End With

    objStreamUTF8.Close
    objStreamUTF8NoBOM.Close

End Sub

La version modifiée par @Staple1600 :
VB:
Sub Ecrire_UTF8sansBOM_Staple1600()
' https://www.excel-downloads.com/threads/question-de-conversion-en-utf-8-pour-une-vba-qui-enregistre-un-txt.20011510/#post-20088215
'
Dim BinaryStream As Object

    With CreateObject("adodb.stream")

        .Type = 2
        .Mode = 3
        .Charset = "UTF-8"
        .LineSeparator = -1
        .Open

        .WriteText "Le père Noël a été vu à l'étang où il a pêché !", 1
        .WriteText "Autres caractères accentués : àéèôûïñ"

        .Position = 3
        Set BinaryStream = CreateObject("adodb.stream")
        BinaryStream.Type = 1
        BinaryStream.Mode = 3
        BinaryStream.Open
        .CopyTo BinaryStream
        .Flush
        .Close

    End With

    BinaryStream.SaveToFile ThisWorkbook.Path & "\UTF8sansBOM_Staple1600.txt", 2
    BinaryStream.Flush
    BinaryStream.Close

End Sub

Remarque : j'ai modifié le texte à écrire dans le fichier, le chemin des fichiers et les noms des fichiers...

Le "problème" du BOM est un faux problème puisqu'en #25 l'écriture se fait en UTF-8 avec BOM et que le fichier est en suite lu sans problème.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
relis le ton fichier après
VB:
Sub lecture()    'binaire
    fichier = ThisWorkbook.Path & "\UTF8sansBOM_EkkehardHorner.txt"
    Dim lachaine$
    x = FreeFile: Open fichier For Binary Access Read As #x: lachaine = String(LOF(x), " "): Get #x, , lachaine: Close #x
    MsgBox " a la relecture apres comversion ça donne ça" & vbCrLf & lachaine
End Sub

Sub lecture3()    ' recupe le texte complet avec input simple
    Dim x As Integer: x = FreeFile
    Dim lines As String, i As Long
    fichier = ThisWorkbook.Path & "\UTF8sansBOM_EkkehardHorner.txt"
    Open fichier For Input As #x
    lines = Input$(LOF(x), #x)
    Close #x
    MsgBox lines
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Je pense que tu as un gros problème de lecture de fichier.
Mais en tout cas, on voit bien qu'il n'y a plus le BOM.

Est-ce que tu prends bien en compte que le fichier est encodé en UTF-8 sans BOM ?
J'ai l'impression que tu l'ouvres comme si c'était de l'ANSI.

C'est vrai que je n'ai pas essayé d'ouvrir avec Excel les fichiers ainsi créés, mais j'ai vérifié qu'ils étaient encodés correctement et sans BOM. Et tout est bon.
D'ailleurs, un double clic sur les fichiers les ouvre avec l'éditeur de texte de Windows et le texte entier est affiché correctement, caractères accentués compris.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

=>Marcel32
Me rappelais plus que j'avais mis le nez dans le BOM
Merci d'avoir soulever la poussière de 2016

Sinon pour rester fidèle à K.I.S.S (non pas le groupe, mais le principe), j'ai une question pour Dudu2

Pourquoi passer par un fichier *.txt pour remplir un TextBox?
 

Dudu2

XLDnaute Barbatruc
Bonjour à vous 2 + 1
Et merci d'avoir continué les recherches après mon départ hier soir.

Voilà ce que j'ai fait en utilisant le code de @Marcel32, et ça fonctionne.
- Lire le fichier UTF-8 qui se retrouve en ANSI dans une TextBox
- Écrire le fichier en UTF-8 à partir du contenu ANSI de la TextBox
La manip peut être exécutée en boucle et donc ça fonctionne.

J'ai juste ajouté un paramètre pour ré-écrire sur le fichier existant, sinon erreur 3004.

1 petit souci quand même (non significatif)
- Encodage UTF-8 avec nomenclature et pas simplement UTF-8.
 

Pièces jointes

  • Classeur1.xlsm
    23.3 KB · Affichages: 0

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…