VBA importe le fichier CSV UTF-8 d'un serveur web
j'ai un fichier CSV UTF-8 stocké sur un serveur web. Lorsque je télécharge le fichier, mettez-le sur mon disque dur et je l'importerai ensuite dans une feuille Excel avec cette macro (à partir du macro recorder) :
Sub Macro2()
Workbooks.OpenText Filename:= _
"C:/myFile.csv", Origin _
:=65001, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _
, Comma:=True, Space:=False, Other:=False
End Sub
Tous les caractères (caractères vietnamiens) s'affichent correctement.
Quand j'essaie la même macro mais au lieu de donner l'adresse du fichier ("C:/myFile.csv") je passe L'URL du fichier ("http://myserver.com/myFile.csv") le CSV est correctement importé dans ma feuille Excel mais les caractères vietnamiens ne sont plus affichés correctement.
j'ai aussi essayé d'utiliser L'onglet Données mais L'encodage semble être ignoré par Excel:
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:/myFile.csv" _
, Destination:=Range("$A"))
.Name = "myFile.csv"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = "~"
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Exemple de données: „; Â; ˜; Â1/4; ‰; ™,™
Excel lit à tort comme: „; Â; ˜; Â1/4; ‰; ™,™;
3 réponses
si les caractères sont affichés correctement lorsque vous téléchargez le csv
le fichier vous-même, j'avais diviser le processus en 2 étapes:
téléchargement
Sub DownloadFile(ByVal url As String, ByVal local As String)
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", url, False, "username", "password"
WinHttpReq.send
myURL = WinHttpReq.responseBody
If WinHttpReq.Status = 200 Then
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write WinHttpReq.responseBody
oStream.SaveToFile local, 2
oStream.Close
End If
End Sub
Chargement CSV
Sub OpenCsv(ByVal csvfile As String)
Workbooks.OpenText Filename:= _
csvfile,Local:=True,StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _
, Comma:=True, Space:=False, Other:=False
End Sub
Notez Que:Local
paramètre est la clé ici,il fait VBA
utilisez la configuration locale de votre excel (Vietnamien), qui est par défaut définie à False
.
Mettre
Sub DownloadAndLoad
DownloadFile "http://myserver.com/myFile.csv","C:\myFile.csv"
OpenCsv "C:\myFile.csv"
End Sub
j'ai été à la recherche d'un problème similaire où nous importons des fichiers CSV encodés utf-8 dans une feuille de travail. Je ne tire pas les données d'un serveur web, mais cela pourrait aider.
Ma solution est de lire le fichier utf-8 pour une variable locale puis l'insérer dans une feuille. J'ai essayé de sauvegarder les données dans un fichier temp avec encodage ansi, mais cela a fait perdre à tous les caractères leurs accents.
Function ReadUTF8CSVToSheet(file As String)
Dim ws As Worksheet
Dim strText As String
' read utf-8 file to strText variable
With CreateObject("ADODB.Stream")
.Open
.Type = 1 ' Private Const adTypeBinary = 1
.LoadFromFile file
.Type = 2 ' Private Const adTypeText = 2
.Charset = "utf-8"
strText = .ReadText(-1) ' Private Const adReadAll = -1
End With
' parse strText data to a sheet
Set ws = Sheets.Add()
intRow = 1
For Each strLine In Split(strText, chr(10))
If strLine <> "" Then
With ws
.Cells(intRow, 1) = strLine
.Cells(intRow, 1).TextToColumns Destination:=Cells(intRow, 1), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False
End With
intRow = intRow + 1
End If
Next strLine
ReadUTF8CSVToSheet = ws.Name
End Function
' to run
strSheetName = ReadUTF8CSVToSheet("C:\temp\utf8file.csv")
IMO, il semble y avoir un bug/conflit dans Excel lors de l'ouverture des fichiers UTF-8/UTF-8-BOM en utilisant le macro code enregistré, en particulier lorsque le Origin
paramètre défini à 65001
qui est censés be UTF-8.
j'ai trouvé deux solutions de rechange à cette question:
Supprimer
Origin
paramètre de l'appel de fonction et voir si le fichier se charge correctementWorkbooks.OpenText Filename:="C:\file.csv"
.Si cet argument est omis, la méthode utilise le paramètre actuel de l'option D'Origine du fichier dans L'Assistant D'importation de texte.
je pense que dès que vous lien le fichier avec Excel, il faut essayer de lire l'en-tête du fichier et sélectionnez le bon Code Du Pays automatiquement ( Eh bien, en supposant que l'en-tête ne manque pas).
j'ai essayé Codes Des Pays et a constaté que dans mon scénario spécifique paramètre
Origin:=1252
(1252 - windows-1252 - ANSI Latin 1; Western European (Windows)
) charge le fichier dans Excel très bien.