En VBA, l'exportation en UTF-8 passe par l'utilisation de l'objet ADODB.Stream. Pour cela, on trouve fréquemment le code suivant :
Mais lorsqu'on veut utiliser ce fichier pour importer les données dans une table MySql, on obtient une erreur due à la présence de 3 octets en début de fichier que l'on appelle le BOM (Byte Of Mark) et qui caractérisent un fichier encodé UTF-8 dans le système Windows.
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 ' columns est un tableau contenant les noms des champs de la requête DIM objStream As Object, rcs As Recordset, j As Integer, result As String, sep As String Set objStream = CreateObject("ADODB.Stream") objStream.Open objStream.Position = 0 objStream.Charset = "UTF-8" ' Ligne d'entêtes result = "" sep = "" For j = LBound(columns) To UBound(columns) result = result & sep & columns(j) sep = ";" Next j objStream.WriteText result & vbCrLf ' Données Set rcs = CurrentDb.OpenRecordset(maRequete) While Not rcs.EOF result = "" sep = "" For j = LBound(columns) To UBound(columns) result = result & sep & rcs(columns(j)) sep = ";" Next j objStream.WriteText result & vbCrLf rcs.MoveNext Wend rcs.Close ' enregistrement dans le fichier objStream.SaveToFile nomFichier & ".csv" objStream.Close
Ces 3 octets sont (en hexadécimal) EF BB BF (en décimal) 239 187 191.
On peut les faire sauter en rouvrant le stream en mode binaire :
On peut ensuite supprimer le fichier initial s'il est inutile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ' ouverture en mode binaire pour supprimer le BOM objStream.Open objStream.Type = 1 ' type binaire (adTypeBinary) objStream.LoadFromFile nomFichier & ".csv" objStream.Position = 3 ' pour sauter les 3 octets du début DIM objStream2 As Object Set objStream2 = CreateObject("ADODB.Stream") objStream2.Open objStream2.Type = 1 ' lui aussi en binaire objStream.CopyTo objStream2 objStream2.SaveToFile nomFichier & "-sans-bom.csv" objStream.Close objStream2.Close
Code : Sélectionner tout - Visualiser dans une fenêtre à part Kill nomFichier & ".csv"
Partager