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