How do I download a file using VBA (without Internet Explorer)
This solution is based from this website:http://social.msdn.microsoft.com/Forums/en-US/bd0ee306-7bb5-4ce4-8341-edd9475f84ad/excel-2007-use-vba-to-download-save-csv-from-url
It is slightly modified to overwrite existing file and to pass along login credentials.
Sub DownloadFile()Dim myURL As StringmyURL = "https://YourWebSite.com/?your_query_parameters"Dim WinHttpReq As ObjectSet WinHttpReq = CreateObject("Microsoft.XMLHTTP")WinHttpReq.Open "GET", myURL, False, "username", "password"WinHttpReq.sendIf WinHttpReq.Status = 200 Then Set oStream = CreateObject("ADODB.Stream") oStream.Open oStream.Type = 1 oStream.Write WinHttpReq.responseBody oStream.SaveToFile "C:\file.csv", 2 ' 1 = no overwrite, 2 = overwrite oStream.CloseEnd IfEnd Sub
Declare PtrSafe 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 LongSub Example() DownloadFile$ = "someFile.ext" 'here the name with extension URL$ = "http://some.web.address/" & DownloadFile 'Here is the web address LocalFilename$ = "C:\Some\Path" & DownloadFile !OR! CurrentProject.Path & "\" & DownloadFile 'here the drive and download directory MsgBox "Download Status : " & URLDownloadToFile(0, URL, LocalFilename, 0, 0) = 0End Sub
I found the above when looking for downloading from FTP with username and address in URL. Users supply information and then make the calls.
This was helpful because our organization has Kaspersky AV which blocks active
FTP.exe, but not web connections. We were unable to develop in house with ftp.exe and this was our solution. Hope this helps other looking for info!
A modified version of above to make it more dynamic.
Public Function DownloadFileB(ByVal URL As String, ByVal DownloadPath As String, ByRef Username As String, ByRef Password, Optional Overwrite As Boolean = True) As Boolean On Error GoTo Failed Dim WinHttpReq As Object: Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", URL, False, Username, Password WinHttpReq.send If WinHttpReq.Status = 200 Then Dim oStream As Object: Set oStream = CreateObject("ADODB.Stream") oStream.Open oStream.Type = 1 oStream.Write WinHttpReq.responseBody oStream.SaveToFile DownloadPath, Abs(CInt(Overwrite)) + 1 oStream.Close DownloadFileB = Len(Dir(DownloadPath)) > 0 Exit Function End IfFailed: DownloadFileB = FalseEnd Function