¿Cómo descargo un archivo usando VBA (sin Internet Explorer)?

Necesito descargar un archivo CSV de un sitio web usando VBA en Excel. El servidor también necesitaba autenticarme ya que eran datos de un servicio de encuestas.

Encontré muchos ejemplos usando Internet Explorer controlado con VBA para esto. Sin embargo, fue en su mayoría soluciones lentas y la mayoría también fueron complicadas.

Actualización: después de un tiempo encontré una solución ingeniosa usando el objeto Microsoft.XMLHTTP en Excel. Pensé compartir la solución a continuación para referencia futura.

Esta solución se basa en este sitio web: http://social.msdn.microsoft.com/Forums/en-US/bd0ee306-7bb5-4ce4-8341-edd9475f84ad/excel-2007-use-vba-to-download-save- csv-from-url

Se modifica ligeramente para sobrescribir el archivo existente y para pasar las credenciales de inicio de sesión.

Sub DownloadFile() Dim myURL As String myURL = "https://YourWebSite.com/?your_query_parameters" Dim WinHttpReq As Object Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", myURL, 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 "C:\file.csv", 2 ' 1 = no overwrite, 2 = overwrite oStream.Close End If End 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 Long Sub 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) = 0 End Sub 

Fuente

Encontré lo anterior cuando busco descargar desde FTP con nombre de usuario y dirección en URL. Los usuarios proporcionan información y luego hacen las llamadas.

Esto fue útil porque nuestra organización tiene Kaspersky AV que bloquea http://FTP.exe active , pero no conexiones web. No pudimos desarrollar en casa con http://ftp.exe y esta fue nuestra solución. Espero que esto ayude a otros a buscar información.