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