VBA che import un file CSV UTF-8 da un server web

Ho un file CSV UTF-8 memorizzato su un server web. Quando scarico il file metterlo sul mio disco rigido e poi l'importzione in un foglio di Excel con questa macro (dal registratore di macro):

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 

Tutti i caratteri (caratteri vietnamiti) vengono visualizzati correttamente.

Quando provo la stessa macro ma, invece di dare l'indirizzo locale del file ("C: /myFile.csv") passa l'URL del file (" http://myserver.com/myFile.csv ") il CSV è importta correttamente nella mia scheda Excel ma i caratteri vietnamiti non vengono più visualizzati correttamente.

Ho anche provato a utilizzare la scheda Dati ma la codifica sembra essere ignorata da Excel:

 With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:/myFile.csv" _ , Destination:=Range("$A$1")) .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 

Dati di esempio: „; Â; ˜; Â1/4; ‰; ™,™ „; Â; ˜; Â1/4; ‰; ™,™

che Excel legge erroneamente come: „; Â; ˜; Â1/4; ‰; ™,™; „; Â; ˜; Â1/4; ‰; ™,™;

Se i caratteri vengono visualizzati correttamente quando si scarica il file csv soli, dividere il process in due fasi:

Download

 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 

Caricamento 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 

Nota: Il parametro Local è la chiave qui, rende VBA la configuration locale di excel (vietnamita), impostazione predefinita come False .

Mettere tutto insieme

 Sub DownloadAndLoad DownloadFile "http://myserver.com/myFile.csv","C:\myFile.csv" OpenCsv "C:\myFile.csv" End Sub 

Sto guardando un problema simile in cui importiamo i file CSV codificati utf-8 in un foglio di lavoro. Non sto tirando i dati da un server web, ma questo potrebbe aiutare.

La mia soluzione è leggere il file utf-8 a una variabile locale quindi inserirlo in un foglio. Ho provato a salvare i dati in un file temp con codifica ansi, ma facendo questo ha causato tutti i personaggi a perdere i loro accenti.

 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, sembra esserci un errore / conflitto in Excel quando si apre i file UTF-8 / UTF-8-BOM utilizzando il codice di macro registrato, in particolare quando il parametro Origin è impostato su 65001 che si suppone sia UTF-8.

Ho trovato due soluzioni per questo problema:

  1. Rimuovere il parametro Origin dalla chiamata di function e verificare se il file viene caricato correttamente. Workbooks.OpenText Filename:="C:\file.csv" .

    MSDN dice :

    Se questo argomento viene omesso, il metodo utilizza l'impostazione corrente dell'opzione Origine file nella procedura guidata Importzione text.

    Penso che non appena collegate il file con Excel, dovresti provare a leggere l'intestazione del file e select automaticamente il codice di codice corretto ( beh, supponendo che l'intestazione non sia mancante ).

  2. Ho provato diversi codici nazionali e ho scoperto che nel mio scenario specifico l'impostazione Origin:=1252 ( 1252 - windows-1252 - ANSI Latin 1; Western European (Windows) ) carica il file in Excel solo bene.