【问题标题】:Downloading Zip file (containing .csv) from web into excel VBA将 Zip 文件(包含 .csv)从 Web 下载到 excel VBA
【发布时间】:2017-02-12 13:25:46
【问题描述】:

我偶然发现了这段代码,但我很难让它工作。我正在尝试从网站下载包含 .csv 的 zip 文件并将内容放入我的 excel 文件中。我目前卡在这条线上:

'3 rename file
Name targetFileCSV As targetFileTXT

它说找不到文件。

感谢任何帮助!

'Main Procedure
Sub LETSDOTHIS()

    Dim url As String
    Dim targetFolder As String, targetFileZip As String, targetFileCSV As String, targetFileTXT As String

    Dim wkbAll As Workbook
    Dim wkbTemp As Workbook
    Dim sDelimiter As String
    Dim newSheet As Worksheet

    url = "http://www20.statcan.gc.ca/tables-tableaux/cansim/csv/00260008-eng.zip"
    targetFolder = Environ("TEMP") & "\" & RandomString(6) & "\"
    MkDir targetFolder
    targetFileZip = targetFolder & "data.zip"
    targetFileCSV = targetFolder & "data.csv"
    targetFileTXT = targetFolder & "data.txt"

    '1 download file
    DownloadFile url, targetFileZip

    '2 extract contents
    Call UnZip(targetFileZip, targetFolder)

    '3 rename file
    Name targetFileCSV As targetFileTXT

    '4 Load data
    Call LoadFile(targetFileTXT)

End Sub

Private Sub DownloadFile(myURL As String, target As String)

    Dim WinHttpReq As Object
    Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
    WinHttpReq.Open "GET", myURL, False
    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 target, 2  ' 1 = no overwrite, 2 = overwrite
        oStream.Close
    End If

End Sub


Private Function RandomString(cb As Integer) As String

    Randomize
    Dim rgch As String
    rgch = "abcdefghijklmnopqrstuvwxyz"
    rgch = rgch & UCase(rgch) & "0123456789"

    Dim i As Long
    For i = 1 To cb
        RandomString = RandomString & Mid$(rgch, Int(Rnd() * Len(rgch) + 1), 1)
    Next

End Function

Private Function UnZip(PathToUnzipFileTo As Variant, FileNameToUnzip As Variant)
    ' Unzips a file
    ' Note that the default OverWriteExisting is true unless otherwise specified as False.
    Dim objOApp As Object
    Dim varFileNameFolder As Variant
    varFileNameFolder = PathToUnzipFileTo
    Set objOApp = CreateObject("Shell.Application")
    ' the "24" argument below will supress any dialogs if the file already exist. The file will
    ' be replaced. See http://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx
     'objOApp.Namespace(FileNameToUnzip).CopyHere objOApp.Namespace(varFileNameFolder).items, 24

'    Call UnZip(targetFolder, targetFileZip)


End Function

Private Sub UnZips(mainFolder As Variant, zipFolder As Variant)


    Call UnZip(targetFolder, targetFileZip)


End Sub


Private Sub LoadFile(file As String)

     Set wkbTemp = Workbooks.Open(Filename:=file, Format:=xlCSV, Delimiter:=";", ReadOnly:=True)

     wkbTemp.Sheets(1).Cells.Copy
     'here you just want to create a new sheet and paste it to that sheet
     Set newSheet = ThisWorkbook.Sheets.Add
     With newSheet
         .Name = wkbTemp.Name
         .PasteSpecial
     End With
     Application.CutCopyMode = False
     wkbTemp.Close

End Sub

【问题讨论】:

    标签: vba excel csv


    【解决方案1】:

    这是因为您正在提取 .zip 文件夹的内容,但该存档中的实际文件名未命名为 data.csv(这是您要重命名的名称,但该文件没有存在)。当我运行代码时,.zip 存档中的文件被命名为 00260008-eng.csv

    解压后需要重命名解压的文件或查找其中没有.zip的文件。

    删除这一行:

    targetFileCSV = targetFolder & "data.csv"
    

    并在您的 1, 2, 3 中添加一个新行,以便您可以从 .zip 存档中获取您拥有的第一个 CSV 文件。

    '1 download file
    DownloadFile url, targetFileZip
    
    '2 extract contents
    Call UnZip(targetFileZip, targetFolder)
    
    '3 rename file
    targetFileCSV = targetFolder & Dir(targetFolder & "\*.csv")
    Name targetFileCSV As targetFileTXT
    

    另外,如果其他人在代码示例中运行 #2 时遇到问题,请添加一些额外的括号。

    ' Added extra parentheses
    objOApp.Namespace((FileNameToUnzip)).CopyHere objOApp.Namespace((varFileNameFolder)).items, 24
    

    我不知道为什么添加额外的括号有效,但没有它我无法提取文件。

    【讨论】:

    • 我只需要将“data”替换为“00260008-eng.csv”。 targetFileZip = targetFolder & "00260008-eng.csv.zip" targetFileCSV = targetFolder & "00260008-eng.csv.csv" targetFileTXT = targetFolder & "00260008-eng.csv.txt" 我试过这个,似乎没有用。我该怎么做?谢谢
    • 如何执行此操作“您需要重命名解压的文件或在解压后查找其中没有 .zip 的文件。”谢谢
    • @RageAgainstheMachine 我只用targetFileCSV = targetFolder & "00260008-eng.csv" 替换了targetFileCSV = targetFolder & "data.csv",它对我有用。但是,我不会依赖这种方法,因为文件的名称可能会随着每次下载而改变。此外,您不必将 .csv 重命名为 .txt 即可在 Excel 中打开文件。 Excel 接受 CSV 文件。让我看看我可以如何帮助您完成最后的评论。
    • 酷,我很高兴它成功了。至于您的其他问题:#1 您将更改 LoadFile() 方法的工作方式。无需添加新工作表,只需在左上角的单元格中引用要粘贴的工作表(但要小心,并确保有足够的空间将其粘贴)。 #2 如果文件名不会从网站更改,请创建一个要下载的文件名数组,然后在LETSDOTHIS() 中,您可以循环访问不同的名称并使用不同的myURL 变量调用DownloadFile() 以下载每个文件。为了安全起见,您每次都可以创建一个新的临时目录。
    • @RageAgainstheMachine 另外,如果这对您有帮助,您能否给它一个赞成票并接受答案?
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多