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; ‰; ™,™;

17
demandé sur user2741700 2014-05-13 12:48:49

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
6
répondu Uri Goren 2015-09-01 20:56:44

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")
4
répondu nathansclone4 2015-09-07 23:39:14

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:

  1. Supprimer Origin paramètre de l'appel de fonction et voir si le fichier se charge correctement Workbooks.OpenText Filename:="C:\file.csv".

    MSDN dit:

    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).

  2. 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.

2
répondu 2015-09-04 08:15:58