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:

Dudu2

XLDnaute Barbatruc
Et bien après ré-écriture du fichier, si on l'ouvre avec Notepad, puis Enregistrer sous, on voit que l'encodage est UTF-8 avec nomenclature et pas simplement UTF-8.
Mais ça semble n'avoir aucune importante. Je n'ai pas trouvé un tel Charset dans Regedit Ordinateur\HKEY_CLASSES_ROOT\MIME\Database\Charset

VB:
'--------------------------------
'Lire fichier Texte codé en UTF-8
'--------------------------------
'https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/stream-object-ado-reference
Function LireFichierTexteUTF8(NomCompletFichier As String) As String
    Dim MonFlux As Object

    Set MonFlux = CreateObject("ADODB.Stream")

    With MonFlux
        'Regedit Ordinateur\HKEY_CLASSES_ROOT\MIME\Database\Charset
        .Charset = "utf-8"
        .Open
        .LoadFromFile NomCompletFichier
        LireFichierTexteUTF8 = .ReadText()
        .Close
    End With

    Set MonFlux = Nothing
End Function

'----------------------------------
'Écrire fichier Texte codé en UTF-8
'----------------------------------
'https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/stream-object-ado-reference
Sub ÉcrireFichierTexteUTF8(Texte, NomCompletFichier As String)
    Dim MonFlux As Object

    Set MonFlux = CreateObject("ADODB.Stream")
    
    With MonFlux
        'Regedit Ordinateur\HKEY_CLASSES_ROOT\MIME\Database\Charset
        .Charset = "utf-8"
        .Open
        .Position = 0
        .WriteText Texte
        .SaveToFile NomCompletFichier, 2
        .Close
    End With

    Set MonFlux = Nothing
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Et bien après ré-écriture du fichier, si on l'ouvre avec Notepad, puis Enregistrer sous, on voit que l'encodage est UTF-8 avec nomenclature et pas simplement UTF-8.
Oui, ça j'ai bien compris.

Mais je voulais savoir ce que tu appelais "avec nomenclature".
Si c'est "avec BOM", alors c'est ce que j'ai dit en #21. Et comme j'ai dit en #40 c'est un faux problème.

Regarde mon fichier de #44, il y a trois solutions (identiques...) pour écrire le fichier en UTF-8 sans BOM.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Tu m'as pas dit ce qui faisait que ça créé un BOM dans ton code du Sub Ecrire_UTF8avecBOM_Marcel32().
Je n'ai rien vu qui le différenciait de sans BOM.
Mais bon j'ai sans doute mal regardé, ça n'a pas d'importance.
 

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
bon chez moi ca colle
les fonctions de @Marcel32
lecture /ecriture seulement udf-8

pour convertir ANSI---> UDF-8
lire avec ma fonction Bimode et ré injecter le texte dans la fonction d’écriture de Marcel
VB:
Sub test()

'Lecture:
Texte = LireFichierTexteUTF8("C:\Users\polux\Desktop\Mémo UTF-8.txt")
MsgBox "lecture fonction Marcel " & vbNewLine & Texte

'ajout de texte & ecriture
ÉcrireFichierTexteUTF8 Texte & vbNewLine & "et le e accent circonflexe -->ê", "C:\Users\polux\Desktop\Mémo2 UTF-8.txt"

're lecture apres ajout
Texte = LireFichierTexteUTF8("C:\Users\polux\Desktop\Mémo2 UTF-8.txt")
MsgBox Texte

'conversion ANSI To UDF-8
' fonction bimode patricktoulon
Texte = Open_For_Read_Force_Udf_8("C:\Users\polux\Desktop\Mémo 0.txt", texto$)
MsgBox " lecture fonction bimode Patrick d'un fichier ansi " & vbNewLine & texto

'réécriture fonction Marcel
ÉcrireFichierTexteUTF8 texto & vbNewLine & "et le e accent circonflexe -->ê", "C:\Users\polux\Desktop\PMémo2 UTF-8.txt"

'Lecture fonction Marcel
Texte = LireFichierTexteUTF8("C:\Users\polux\Desktop\pMémo2 UTF-8.txt")
MsgBox "lecture fonction Marcel du fichier converti" & vbNewLine & Texte

End Sub
'--------------------------------
'Lire fichier Texte codé en UTF-8
'--------------------------------
'https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/stream-object-ado-reference
Function LireFichierTexteUTF8(NomCompletFichier As String) As String
    Dim MonFlux As Object

    Set MonFlux = CreateObject("ADODB.Stream")

    With MonFlux
        'Regedit Ordinateur\HKEY_CLASSES_ROOT\MIME\Database\Charset
        .Charset = "utf-8"
        .Open
        .LoadFromFile NomCompletFichier
        LireFichierTexteUTF8 = .ReadText()
        .Close
    End With

    Set MonFlux = Nothing
End Function



'----------------------------------
'Écrire fichier Texte codé en UTF-8
'----------------------------------
'https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/stream-object-ado-reference
Sub ÉcrireFichierTexteUTF8(Texte, NomCompletFichier As String)
    Dim MonFlux As Object

    Set MonFlux = CreateObject("ADODB.Stream")
    
    With MonFlux
        'Regedit Ordinateur\HKEY_CLASSES_ROOT\MIME\Database\Charset
        .Charset = "utf-8"
        .Open
        .Position = 0
        .WriteText Texte
        .SaveToFile NomCompletFichier, 2
        .Close
    End With

    Set MonFlux = Nothing
End Sub




Function Open_For_Read_Force_Udf_8(ByVal fichier$, texto$)
    'patricktoulon
    Dim lachaine As String, x: x = FreeFile
    'lecture binnaire
    Open fichier For Binary Access Read As #x: lachaine = String(LOF(x), " "): Get #x, , lachaine: Close #x
    If Not lachaine Like "*[Ã|é|è|ç|â|€|«|»|û|ê|…|/ø|ø|À|É|È|Ã|Ö|]*" Then    'si la chaine ne contient pas de carateres sbizarre
        texto = lachaine    ' alors texto = lachaine
    Else    ' sinon on stream le fichier avec ADOBD.Stream

        With CreateObject("ADODB.Stream")
            .Charset = "utf-8": .Open: .LoadFromFile (fichier): texto = .ReadText()
        End With
    End If
End Function
 

patricktoulon

XLDnaute Barbatruc
conclusion
open FOR est très pratique (et rapide) mais il lui manque des fonction de détection de format

je lui ajouterais bien des fonctions internes supplémentaires
mais je suppose qu'il y aurait des conséquences sur la vélocité

j'en ai déjà fait l'expérience d'ailleurs avec ma fonction X to base64 et base64 to x

la lecture en binaire de open for binary est 10 fois plus lente que adobd.stream

c'est pour cela que j'avais changé le mode de lecture pour adobd.stream

bon quoi qu'il en soit avec une seule fonction de lecture
tu peux récupérer le texte intègre pour ANSI ou UDF-8
c'est la fonction bimode "Open_For_Read_Force_Udf_8"

et tu peux réécrire en UDF-8 avec la fonction de Marcel dans un nouveau fichier avec le texte obtenu par la fonction bimode

j'ai testé ca colle

si vous trouvez le moyen d' interrompre la lecture en ligne par ligne avec open for dans un while/wend sur EOF faites le moi savoir
histoire d'accélérer la fonction en cas de gros fichier et de pouvoir arrêter la pré lecture avec open for binary et passer immédiatement en stream avec adobd.stream
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
d'ailleurs comment fait t'on pour sortir d'une boucle while/wend ??? je m'en sert rarement de cette forme de boucle
je préfère do while/loop avec qui on peut faire un exit Do

mais while /wend Pfffff.. incognito bataillon
 

Discussions similaires

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