2013-07-26 15 views
29

Ho bisogno di scaricare un file CSV da un sito web usando VBA in Excel. Il server aveva anche bisogno di autenticarmi poiché si trattava di dati di un servizio di sondaggi.Come faccio a scaricare un file usando VBA (senza internet explorer)

Ho trovato molti esempi utilizzando Internet Explorer controllato con VBA per questo. Tuttavia, era per lo più soluzioni lente e la maggior parte erano anche contorte.

Aggiornamento: Dopo un po 'ho trovato una soluzione elegante con oggetto Microsoft.XMLHTTP in Excel. Ho pensato di condividere la soluzione qui sotto per riferimento futuro.

risposta

43

Questa soluzione si basa da questo sito: http://social.msdn.microsoft.com/Forums/en-US/bd0ee306-7bb5-4ce4-8341-edd9475f84ad/excel-2007-use-vba-to-download-save-csv-from-url

E 'leggermente modificato per sovrascrivere file esistente e di passare lungo le credenziali di accesso.

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 
+0

Grazie - molto interessante. Il mio unico problema è che chiunque arrivi al VBA del tuo file ha la tua password. Qualche consiglio per spostarti o crittografarlo in qualche modo? Grazie ancora! – rryanp

+2

Nessun problema :) Sei corretto, non è una buona pratica memorizzare le password nel tuo codice. In Ruby utilizzo sempre variabili d'ambiente, probabilmente puoi fare qualcosa di simile in VBA. In Excel puoi crittografare i file in modo che gli utenti non possano vedere il tuo codice. Non ho mai provato questo, ma prova questo link: http://www.vbaexpress.com/forum/showthread.php?914-how-to-encrypt-vba-code-on-the-fly –

+3

Qual è il "myURL = ... responseBody "(giusto prima del Se) per? Sembra inutile ... –

6
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 

Source

ho trovato quanto sopra quando alla ricerca di download da FTP con nome utente e indirizzo URL. Gli utenti forniscono informazioni e quindi effettuano le chiamate.

Questo è stato utile perché la nostra organizzazione ha Kaspersky AV che blocca active FTP.exe, ma non le connessioni Web. Non siamo riusciti a sviluppare in casa con ftp.exe e questa era la nostra soluzione. Spero che questo aiuti altri alla ricerca di informazioni!

Problemi correlati