Enregistrement CSV avec encodage UTF 8
Bonjour à tou(te)s,
Nouveau sujet, nouvelle prise de tête.
J'ai pour ambition de créer une application Excel qui permet d'enregistrer directement des documents au format CSV, encodage UTF-8.
Processus :
- A l'aide d'un combobox dynamique, je sors la liste des classeurs Excel ouverts.
- Je sélectionne le classeur à convertir
- Je sélectionne le type de séparateur (virgule ou point-virgule)
- Je lance l'enregistrement : le fichier est enregistré à l'emplacement voulu par l'utilisateur et sous le nom voulu.
Mon problème (et contrainte interne) étant la gestion des caractères spéciaux et des accents. Je dois donc intégrer à mon code actuel quelque chose permettant l’encodage en UTF-8 de mon document CSV fraîchement créé. J'y suis depuis ce matin et je commence à n’emmêler les pinceaux.
Dans un premier temps, est-il possible d’encoder des CSV avec séparateur virgule ? Sur les exemples que j’ai vu, il n’était question que du séparateur point-virgule.
Ensuite, seconde question : Comment encoder convenablement un fichier CSV avec UTF 8 par VBA ? La partie actuelle concernant l'encodage ne semble pas fonctionner puisque quand j'ouvre le CSV final (en faisant Données > Fichier Texte, en sélectionnant "Encodage Unicode : UTF 8), les accents laissent place à un losange noir.
Voici le code actuel lorsque le séparateur du CSV choisi est un point-virgule.
Document.Text correspond au document sélectionné dans la combobox.
PointVirgule.Value et Virgule.Value sont des checkbox (lorsque =True, la case est cochée)
TrouveUtilisateur est une fonction qui permet d'aller enregistrer directement dans "Mes documents" (selon l'utilisateur, en allant chercher son ID Windows)
csvconv.csv c'est le document CSV (sans encodage) qui est créé dans "Mes documents". Il est là pour "faire plusieurs étapes"
csvconv1.csv c'est le document CSV créé après l'encodage.
Ces deux documents sont des fichiers "de travail", auquel on ne touche pas... C'est presque sur qu'ils sont créés "pour rien" mais ça me permet d'avoir des points de contrôle en cas de bug.
Edit : En fait, le problème que je constate est qu'avec l'encodage UTF 8, les accents s'en vont alors qu'avec l'encodage "ANSI", ils restent... C'est pas l'inverse d'habitude ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| Dim Lecteur As String, Chemin As String
Dim Message As String, MonFichier As String
Lecteur = "C:"
Chemin = Lecteur & "\Documents and Settings\" & TrouveUtilisateur
Chemin = Chemin & "\Mes Documents\"
If (Pointvirgule.Value = True And Virgule.Value = False And Document.Text <> "") Then
MsgBox "Vous êtes sur le point d'enregistrer le document " & Fichier & Chr(10) & "au format CSV, séparateur point-virgule"
Application.DisplayAlerts = False
Workbooks(Fichier).SaveAs Filename:=Chemin & "csvconv", FileFormat:=xlCSV, CreateBackup:=False, local:=True
Application.DisplayAlerts = True
'Début encodage UTF 8
Dim i As Long
Dim sNomFichierIn As String
Dim sNomFichierOut As String
Dim fIn As Integer
Dim fOut As Integer
Dim sLigne As String
Dim docfinal As String
' Préciser les chemins et noms des fichiers è traiter
sNomFichierIn = Chemin & "csvconv.csv"
sNomFichierOut = Chemin & "csvconv1.csv"
fIn = FreeFile()
Open sNomFichierIn For Input As #fIn
fOut = FreeFile()
Open sNomFichierOut For Binary As #fOut
Do While Not EOF(fIn)
Line Input #fIn, sLigne
For i = 1 To Len(sLigne)
If Mid(sLigne, i, 1) = ";" Then
Put #fOut, , AscW(";")
Else
Put #fOut, , AscW(Mid(sLigne, i, 1))
End If
Next i
Put #fOut, , AscW(vbCrLf)
Loop
Close #fIn
Close #fOut
'Fin encodage UTF 8
'Enregistrement du doc CSV, encodé en UTF 8
Workbooks("csvconv.csv").Close False
Application.Workbooks.Open Chemin & "csvconv1.csv"
Workbooks("csvconv1.csv").SaveAs Filename:=Application.GetSaveAsFilename(fileFilter:="csv Files (*.csv), *.csv"), FileFormat:=xlCSV, CreateBackup:=False
Application.Visible = True
Application.WindowState = xlMaximized
Unload Me
End If |
Je vous remercie par avance de l'aide que vous pourrez m'apporter !
Bonne soirée