Download bestanden via Excel VBA

Om direct bestanden via Excel VBA te downloaden gebruik worden gemaakt een standaard DLL-bestand (Windows vereist). Het gaat om urlmon.dll. Deze is normaal gesproken te vinden in de system32 folder van Windows.

In Excel VBA kan een functie worden gemaakt die door middel van het DLL-bestand direct files kan downloaden. Het originele artikel van Microsoft is te vinden via deze link. Deze functie is echter geschreven in een andere programmeertaal, namelijk C++. Hieronder de vertaling naar de werkbare VBA variant.

URLDownloadToFile VBA Functie

#If VBA7 Then
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" ( _
        ByVal pCaller As LongPtr, _
        ByVal szURL As String, _
        ByVal szFileName As String, _
        ByVal dwReserved As LongPtr, _
        ByVal lpfnCB As LongPtr) As LongPtr
#Else
    Private Declare 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
#End If


Het is belangrijk dat bovenstaande code wordt toegevoegd in een project buiten een subroutine, zodat deze (externe) functie vanuit een subroutine aangeroepen kan worden.

URLDownloadToFile argumenten

Zoals te zien is bevat bovenstaande functie vijf argumenten. Drie daarvan moeten sowieso de waarde 0 meekrijgen. De enige argumenten die nodig zijn, zijn szURL en szFileName. De eerste is de directe URL waar het bestand zich bevindt. De tweede is de locatie waar het bestand opgeslagen dient te worden.

De subroutine zou er als volgt uit kunnen zien.

Sub DownloadFileFromURL()
    Dim FileURL As String
    Dim DestinationFile As String
        
    FileURL = "https://www.example-site/picture.jpg"
    DestinationFile = Environ("userprofile") & "\Desktop\picture.jpg"
    URLDownloadToFile 0, FileURL, DestinationFile, 0, 0
    
End Sub


Door middel van “URLDownloadToFile” wordt de functie opgeroepen. Hoewel er slechts twee argumenten nodig zijn, moeten de andere drie ook worden opgegeven, anders werkt de functie niet.

Het is goed mogelijk om op deze manier vele afbeeldingen van websites te downloaden indien er een consistente logica in de URL structuur van de afbeeldingen zit. In dat geval zou de FileURL moeten worden voorzien van een dynamisch onderdeel, waardoor er een loop gemaakt kan worden en er snel vele afbeeldingen gedownload kunnen worden.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.