web-dev-qa-db-fra.com

Comment puis-je télécharger un fichier en utilisant VBA (sans Internet Explorer)

Je dois télécharger un fichier CSV à partir d'un site Web à l'aide de VBA dans Excel. Le serveur devait également m'authentifier puisqu'il s'agissait de données provenant d'un service de sondage.

J'ai trouvé beaucoup d'exemples utilisant Internet Explorer contrôlés avec VBA pour cela. Cependant, il s’agissait principalement de solutions lentes et la plupart étaient également compliquées.

Mise à jour: Après un moment, j'ai trouvé une solution intéressante en utilisant un objet Microsoft.XMLHTTP dans Exceller. J'ai pensé partager la solution ci-dessous pour référence future.

33

Cette solution est basée sur ce site Web: http://social.msdn.Microsoft.com/Forums/en-US/bd0ee306-7bb5-4ce4-8341-edd9475f84ad/Excel-2007-use-vba-to- download-save-csv-from-url

Il est légèrement modifié pour écraser le fichier existant et pour transmettre les informations de connexion.

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

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
52
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

J'ai trouvé ce qui précède lorsque vous recherchez un téléchargement via FTP avec un nom d'utilisateur et une adresse dans l'URL. Les utilisateurs fournissent des informations, puis passent les appels.

Cela a été utile car notre organisation utilise Kaspersky AV qui bloque active FTP.exe, mais pas les connexions Web. Nous n'avons pas pu développer en interne avec ftp.exe et c'était notre solution. J'espère que cela aide les autres à la recherche d'informations!

11
Cole Busby