Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel vba从internet下载每5分钟更新一次的文本文件_Excel_Vba - Fatal编程技术网

excel vba从internet下载每5分钟更新一次的文本文件

excel vba从internet下载每5分钟更新一次的文本文件,excel,vba,Excel,Vba,我想从这个链接下载一个文件: 此文件每5分钟更新一次。所以我继续创建了一个excel VBA,然后使用一个调度程序每5分钟激活一次这个excel文件。然而不知何故,出于某种奇怪的原因,我在电脑中下载的文件并没有每5分钟更新一次。如果使用chrome或IE打开,内容保持不变,与文本文件不同 下面是我从互联网上复制的一个非常典型的脚本 Function DownloadFile(link As String) Dim WinHttpReq As Object Set WinHttpReq = Cr

我想从这个链接下载一个文件:

此文件每5分钟更新一次。所以我继续创建了一个excel VBA,然后使用一个调度程序每5分钟激活一次这个excel文件。然而不知何故,出于某种奇怪的原因,我在电脑中下载的文件并没有每5分钟更新一次。如果使用chrome或IE打开,内容保持不变,与文本文件不同

下面是我从互联网上复制的一个非常典型的脚本

Function DownloadFile(link As String)
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", link, 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 ThisWorkbook.Path & "\raw\" & "temp.csv", 2 ' 1 = no overwrite, 2 = overwrite
    oStream.Close
End If

End Function

可能存在缓存。尝试以下添加requestHeader的操作,以尝试缓解潜在的缓存。另一种常见的选择是,在URL的末尾添加一个随机数,这似乎不适用于此网站

Option Explicit

Public Sub test()
    Dim i As Long
    For i = 1 To 3
        DownloadFile "https://www.hko.gov.hk/tide/marine/data/ALL.txt"
        Debug.Print Now
        Application.Wait Now + TimeSerial(0, 5, 0)
    Next
End Sub

Public Sub DownloadFile(ByVal link As String)
    Dim WinHttpReq As Object, oStream  As Object
    Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
    With WinHttpReq
        .Open "GET", link, False
        .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
        .send

        Debug.Print StrConv(.responsebody, vbUnicode)

        If WinHttpReq.Status = 200 Then
            Set oStream = CreateObject("ADODB.Stream")
            oStream.Open
            oStream.Type = 1
            oStream.Write .responsebody
            oStream.SaveToFile ThisWorkbook.Path & "\raw\" & "temp.csv", 2 ' 1 = no overwrite, 2 = overwrite
            oStream.Close
        End If

    End With

End Sub

QHarr的回答对我不起作用。我尝试了许多解决方案,但似乎它们不适用于VBA,或者需要进行早期绑定调用,我不喜欢这样,所以我提出了以下方法。简单地说,我们将尝试从缓存中删除相同的url/文件,然后继续下载该文件:

'--- copy this to the top of the module (below Option Explicit) ---
'Declaration for deleting a file from the cache:
Private Declare PtrSafe Function DeleteUrlCacheEntry Lib "wininet.dll" Alias _
    "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
该功能应修改如下:

Function DownloadFile(link As String)
    Dim WinHttpReq As Object
    
    'First delete the file from cache:
    'On Error Resume Next
    DeleteUrlCacheEntry url
    
    Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
    
    WinHttpReq.Open "GET", link, 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 ThisWorkbook.Path & "\raw\" & "temp.csv", 2 ' 1 = no overwrite, 2 = overwrite
        oStream.Close
    End If

End Function

旁注:上面可能是一个sub。您不需要用户名和密码参数,可以删除这一行:myURL=WinHttpReq.responseBody。所有变量都应该声明。@QHarr太好了。在执行等待过程中是否有使用excel的方法?我尝试了DoEvents,但似乎对我无效。@Yasserkalil hi-你是什么意思?@QHarr我的意思是,在等待期间,excel被冻结,我想知道在执行和等待期间是否可以使用exceltime@YasserKhalil这是通常的方式。还有,我发现:尽管我使用了Excel,但它仍然是冻结的。我认为
Application.Wait
part是原因。