VBA - URLDownloadToFile - в загруженном файле отсутствуют данные

Используя URLDownloadToFile в VBA, я пытаюсь загрузить файл. Проблема в том, что загружается пустой файл. Есть идеи, почему данные отсутствуют?

Option Explicit 

Private Declare Function URLDownloadToFile Lib "urlmon" _ 
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _ 
ByVal szURL As String, ByVal szFileName As String, _ 
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long 

Dim Ret As Long 

Sub Sample() 
    Dim strURL As String 
    Dim strPath As String 

    strURL = "https://abc.abcabc.com/cmif-ku/reports/2012/byOwningEntity/Excel/myfilename.xls" 

    strPath = "C:\Temp\myfilename.xls" 

    Ret = URLDownloadToFile(0, strURL, strPath, 0, 0) 

    If Ret = 0 Then 
        MsgBox "File successfully downloaded" 
    Else 
        MsgBox "Unable to download the file" 
    End If 
End Sub

3 ответа

У меня похожая проблема. Я использую следующий код, но получил сообщение "переполнение":

Sub downloadFile()
    Dim targetFile As String, targetUrl As String, returnVal As Integer
    target = "http://www.ishares.com/us/products/239454/ishares-20-year-treasury-bond-etf/1395165510757.ajax?fileType=xls&fileName=iShares-20-Year-Treasury-Bond-ETF"
    strSavePath = "C:\testdownload.txt"
    returnVal = URLDownloadToFile(0, target, strSavePath, 0, 0)
    If returnVal = 0 Then
        Debug.Print "Download ok!"
    Else
        Debug.Print "Error"
    End If
End Sub

Вы получили переполнение, потому что вы использовали целое число для сбора длинного значения. Urldownloadtofile возвращает длинное значение. Если загрузка прошла успешно, вы получили бы "0". Тогда твой код сработал бы.

Надеюсь, это может быть полезно другим. Проверьте следующее:

  1. Вы используете MS Office 64-битную или 32-битную версию.
  2. Декларация для 64 бит
      Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
      Alias "URLDownloadToFileA" ( _
        ByVal pCaller As LongPtr, _
        ByVal szURL As String, _
        ByVal szFileName As String, _
        ByVal dwReserved As LongPtr, _
        ByVal lpfnCB As LongPtr _
      ) As Long
  1. В то время как в 32 Офисе это
      Private Declare Function URLDownloadToFile Lib "urlmon" _
      Alias "URLDownloadToFileA" ( _
        ByVal pCaller As Long, _
        ByVal szURL As String, _
        ByVal szFileName As String, _
        ByVal dwReserved As Long, _
        ByVal lpfnCB As Long _
      ) As Long
  1. Результирующая переменная должна иметь тип «Long».
  2. Путь к целевому URL-адресу должен быть правильным, и там должен присутствовать целевой файл или данные.
Другие вопросы по тегам