Exporter le contenu de cellules dans un fichier texte avec encodage UTF-8

Bonjour,

Le code ci-dessous permet d'exporter des cellules vers un fichier texte, peu importe le nombre de lignes ou de colonnes préalablement sélectionnées.

Sub test_2()
Dim numfich As Long
Dim Tblo
Dim I As Long, J As Long
numfich = FreeFile
Open ThisWorkbook.Path & "\" & Range("H1").Value & ".txt" For Output As #numfich
If Selection.Cells.Count > 1 Then
    Tblo = Selection
Else
    Print #numfich, Selection
    Close #numfich
    End
End If
J = 1
For I = LBound(Tblo) To UBound(Tblo)
        Select Case Selection.Columns.Count
            Case 1
                If Not Selection(I).Rows.Hidden Then Print #numfich, Tblo(I, 1) & vbCrLf;
            Case 2
                If Not Selection.Rows(J).Hidden Then Print #numfich, Tblo(I, 1) & " " & Tblo(I, 2) & vbCrLf;
                J = J + 1
        End Select
Next I
Close #numfich
End Sub

Le problème c'est l'encodage, j'ai besoin d'être en UTF-8. Je vous laisse voir le CAS 5 dans le fichier ci-joint.

Merci d'avance pour votre aide,
Bonne journée.

3classeur1.xlsm (22.14 Ko)

Bonjour,

Voir code ci-joint (utilisation de la bibliothèque Microsoft Scripting Runtime)

10classeur2.xlsm (23.19 Ko)

Bonjour, basiquement pour écrire un fichier en UTF-8 je ferais comme ça :

Public Const sepV$ = vbTab                                  'séparateur de valeurs
Public Const sepL$ = vbCrLf                                 'séparateur de lignes

Public Sub Enregistrer_UTF8(ByVal PathFileName As String)

Dim fUtf8avecBOM As ADODB.Stream
Dim fUtf8sansBOM As ADODB.Stream
Dim txt As String                 'texte
Dim nL As Long                   'numéro de ligne
Dim nC As Long                   'numéro de colonne

  ' Définir le flux de données Utf8
  Set fUtf8avecBOM = New Stream
  fUtf8avecBOM.Charset = "utf-8"
  fUtf8avecBOM.Mode = adModeReadWrite
  fUtf8avecBOM.Type = adTypeText
  fUtf8avecBOM.Open

  ' Ajouter les données séparées par une tabulation
  With Selection
    For nL = 1 To .Rows.Count
      txt = .Cells(nL, 1).Text
      fUtf8avecBOM.WriteText txt
      For nC = 2 To .Columns.Count
        txt = .Cells(nL, nC).Text
        fUtf8avecBOM.WriteText sepV & txt
      Next nC
      fUtf8avecBOM.WriteText sepL
    Next nL
  End With
  ' Pointer après le BOM
  fUtf8avecBOM.Position = 3

  ' Définir le flux de données Utf8 sans BOM
  Set fUtf8sansBOM = New Stream
  fUtf8sansBOM.Mode = adModeReadWrite
  fUtf8sansBOM.Type = adTypeBinary
  fUtf8sansBOM.Open

  'Ajouter les données (sans le BOM)
  fUtf8avecBOM.CopyTo fUtf8sansBOM
  fUtf8avecBOM.Flush
  fUtf8avecBOM.Close
  Set fUtf8avecBOM = Nothing

  ' Enregistrer le fichier
  fUtf8sansBOM.SaveToFile PathFileName, adSaveCreateOverWrite
  fUtf8sansBOM.Close
  Set fUtf8sansBOM = Nothing

End Sub

Avec PathFileName qui peut être par exemple ThisWorkbook.Path & "\" & nomDeFichier & ".txt".

Cordialement

Merci à tous les deux pour vos propositions.

Le code de @Cylfo s'intègre facilement à mon fichier de travail.

Excellente journée.

En fait, visuellement c'est bon mais pas techniquement.

Désolé Chbouli04 mais je ne vois pas comment tester ton code. Les "public" ne me sont pas familiés.

Je suis donc parti du fichier de @Cylfo, avec son code donc.

Le fichier généré VERSUS un fichier créé manuellement avec un copier/coller à l'ancienne ne donne pas le même résultat.

Voilà la différence quand j'affiche les fichiers :

2023 04 15 20 38

Note : je le mets sous forme d'image car le code n'est pas accepté à cause des caractères spéciaux.

Le fichier Macro.txt correspond au code VBA et le Manuel.txt en copier/coller manuel.

Autant dire que ça met le bazar dans le reste de mes scripts GNU/Linux :-)

Les commandes ci-dessus ont été faites sous GNU/Linux mais la différence est également visible avec les commandes sous Windows avec PowerShell.

Je pense que ça peut venir de l'absence de BOM qui indique l'encodage UTF-8 même si normalement il n'est pas nécessaire dans la très grande majorité des cas. Tu peux essayer cette version de mon code :

Public Const sepV$ = vbTab                                  'séparateur de valeurs
Public Const sepL$ = vbCrLf                                 'séparateur de lignes

Public Sub Enregistrer_UTF8(ByVal PathFileName As String)

Dim fUtf8avecBOM As ADODB.Stream
Dim txt As String                 'texte
Dim nL As Long                   'numéro de ligne
Dim nC As Long                   'numéro de colonne

  ' Définir le flux de données Utf8
  Set fUtf8avecBOM = New Stream
  fUtf8avecBOM.Charset = "utf-8"
  fUtf8avecBOM.Mode = adModeReadWrite
  fUtf8avecBOM.Type = adTypeText
  fUtf8avecBOM.Open

  ' Ajouter les données séparées par une tabulation
  With Selection
    For nL = 1 To .Rows.Count
      txt = .Cells(nL, 1).Text
      fUtf8avecBOM.WriteText txt
      For nC = 2 To .Columns.Count
        txt = .Cells(nL, nC).Text
        fUtf8avecBOM.WriteText sepV & txt
      Next nC
      fUtf8avecBOM.WriteText sepL
    Next nL
  End With

  ' Enregistrer le fichier
  fUtf8avecBOM.SaveToFile PathFileName, adSaveCreateOverWrite
  fUtf8avecBOM.Close
  Set fUtf8avecBOM = Nothing

End Sub

Pour l'appeler il suffit de faire :

Enregistrer_UTF8 ThisWorkbook.Path & "\" & "TonNomDeFichier" & ".txt"

'ou plus généralement

Enregistrer_UTF8 Path & "\" & "NomDeFichier" & ".txt"

OK mais où est-ce que je mets le code ?

J'ai copié le code "détaillé" dans un nouveau module puis j'ai créé un bouton de contrôle activex pour insérer :

Enregistrer_UTF8 ThisWorkbook.Path & "\" & "TonNomDeFichier" & ".txt"

J'ai une erreur de compilation : type défini par l'utilisateur non défini

Qu'est-ce que je fais mal ?

Merci.

Note : c'est "fUtf8avecBOM As ADODB.Stream" qui est surligné dans le débogage.

EDIT :

Quand j'ouvre le fichier txt créé manuellement et en passant par le copier/coller, Notepad++ indique que l'encodage est UTF-8 pour info.

Oui pardon dans VBA, va dans Outils puis Références... et enfin coche Microsoft ActiveX Data Objects 6.1.
Normalement ça devrait être bon. Si ton appel ne trouve pas la fonction explicite avec :

<nomDuModule>.Enregistrer_UTF8 ThisWorkbook.Path & "\" & "<TonNomDeFichier>" & ".txt"

Les deux retours de commande "cat" semblent identiques maintenant !

Je n'ai pas le temps de tester avec le reste pour le moment mais je ferai un retour d'ici la fin de semaine.

Merci encore & bonne journée.

Bonjour,

Bon, j'ai fini toutes mes histoires et je peux dire que ça fonctionne à 99%.

Un grand merci pour votre aide, bonne semaine.

Rechercher des sujets similaires à "exporter contenu fichier texte encodage utf"