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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager