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.
Bonjour,
Voir code ci-joint (utilisation de la bibliothèque Microsoft Scripting Runtime)
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 :
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.