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 :
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
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.
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 :
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
On peut ensuite supprimer le fichier initial s'il est inutile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Kill nomFichier & ".csv"