Als je bestanden/afbeeldingen van websites wilt downloaden, dan kun je overwegen dit via Excel te doen. Hierdoor kun je mogelijk veel tijd en moeite besparen. Let op: dit artikel is niet voor beginners. Verder heb je Windows nodig als je dit via Excel wilt uitvoeren én is het belangrijk dat de bestanden die je wilt downloaden achter een logisch opgebouwde URL zitten, bijvoorbeeld:
www.websitevoorbeeld.com/foto1.jpg
www.websitevoorbeeld.com/foto2.jpg
of
www.websitevoorbeeld.com/product-x-technische-specificaties.pdf
www.websitevoorbeeld.com/product-y-technische-specificaties.pdf
Om direct bestanden via Excel VBA te downloaden kun je gebruik maken van een bestandje die standaard op Windows computers aanwezig zou moeten zijn, namelijk: urlmon.dll. Dit bestand is normaal gesproken te vinden in de system32-map van Windows.
In Excel VBA kan een functie worden gemaakt die door middel van het DLL-bestand direct bestanden 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 vind je 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 mogelijk om op deze manier vele bestanden of afbeeldingen van websites te downloaden als er een consistente logica in de URL structuur van de afbeeldingen zit. Je kunt dan namelijk de FileURL voorzien van een dynamisch onderdeel, waardoor je een loop kunt maken. Je zou dan alle URL’s (of onderdelen van de URL’s) in Excel onder elkaar kunnen zetten en dan de macro telkens een cel omlaag laten gaan, net zolang tot alle bestanden zijn gedownload.
Excel hulp nodig?
Heb je een Excel vraagstuk? Neem dan contact met mij (Bas) op. Ik denk graag met je mee! Je kunt dan uitleggen waar je hulp bij kunt gebruiken. Vervolgens maak ik een inschatting of ik de aangewezen persoon ben om je hierbij te helpen en doe ik een voorstel.
Het eerste gesprek is altijd volledig kosteloos én vrijblijvend. Mail of bel me gerust!
Goedemorgen, Bas
wanneer een .xlsx downloaded wordt, is het resultaat niet een excel file maar wel een html file.
vb. URLDownloadToFile 0, “https://swecogroup.sharepoint.com/…/anExcelFile.xlsx”, “C:\temp\anExcelFile.xlsx”, 0, 0
De downloaded file openen met excel geeft een error.
Met notepad is inderdaad de syntax van een webpagina te zien.
Extentie veranderen van xlsx naar html en openen; vraag om in te loggen.
Is er een alternatief om alsnog een excel file als resultaat te krijgen?
Alvast bedankt voor een reactie,
Dirk