Dateien aus dem Web herunterladen per VBA

Es gibt eine Menge Gründe, warum man per VBA komplette Dateien aus dem Internet herunterladen sollte. Beispielsweise könnte man von dort Listen im Excel- oder .csv-Format herunterladen, um anschließend die enthaltenen Daten in die aktuelle Datenbank einzulesen. Oder man hat eine Anwendung, die beim Kunden läuft, und diese soll in regelmäßigen Abständen prüfen, ob es ein Update für diese Anwendung gibt und die neue Datei bei Bedarf aus dem Internet herunterladen. In diesem Beitrag zeigen wir die Technik, mit der solche Anforderungen umgesetzt werden. Dabei nutzen wir verschiedene Techniken, zum Beispiel per API oder mit dem XMLHTTP-Objekt der Bibliothek Microsoft XML, v6.0.

Download per API

Die am schnellsten programmierte und einfachste Methode, um eine Datei aus dem Internet herunterzuladen, die auch frei verfügbar ist (also auch über die Eingabe der URL in einen Webbrowser heruntergeladen werden könnte). Die Lösung zu diesem Ansatz sieht wie in Listing 1 aus. Hier deklarieren wir zunächst eine API-Funktion namens URLDownloadToFile in der 32-Bit-Version und in der 64-Bit-Version sowie eine Konstante.

#If VBA7 Then
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
#Else
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
#End If
Const ERROR_SUCCESS = 0
Sub DownloadAPI()
     Dim strUrl As String
     Dim strDatei As String
     strUrl = "http://www.access-im-unternehmen.de/pic001.png"
     strDatei = CurrentProject.Path & "\pic001.png"
     Debug.Print URLDownloadToFile(0&, strUrl, strDatei, BINDF_GETNEWESTVERSION, 0&) = ERROR_SUCCESS
End Sub

Listing 1: Einfacher Code zum Herunterladen einer Datei

Danach rufen wir die Prozedur DownloadAPI auf, in der wir die URL der herunterzuladenden Datei sowie den Zielpfad angeben. Damit ausgestattet rufen wir die API-Funktion auf und übergeben dieser mit dem zweiten und dritten Parameter die URL und den Zielpfad. Die übrigen Parameter bleiben leer. Wenn wir die Prozedur nun aufrufen und die angegebene Datei ist vorhanden, wird sie unter dem angegebenen Pfad aus dem lokalen Rechner gespeichert.

Funktion auf Basis dieser Prozedur

In vielen Fällen wollen wir die Parameter einer solchen Prozedur wie die URL der herunterzuladenden Datei und den Zielpfad dynamisch angeben und diese nicht fest im Code vorgeben.

Dann erstellen wir eine Funktion auf Basis der Prozedur, die wie folgt aussieht:

Public Function DownloadAPI(strURL As String, _
         strDatei As String) As Boolean
     If URLDownloadToFile(0&, strURL, strDatei, 0&, 0&) _
             = ERROR_SUCCESS Then
         DownloadAPI = True
     End If
End Function 

Der Aufruf erfolgt beispielsweise über die folgende Prozedur:

Public Sub Test_DownloadAPI()
     Dim strURL As String
     Dim strDatei As String
     strURL = "http://www.access-im-unternehmen.de/pic001.png"
     strDatei = CurrentProject.Path & "\pic001.png"
     Debug.Print DownloadAPI(strURL, strDatei)
End Sub

Mehr Komfort per Formular

Wenn wir dem Benutzer die Steuerung des gesamten Vorgangs überlassen wollen, können wir ihm ein Formular wie in Bild 1 hinzufügen. Dieses enthält zwei Textfelder – eines zum Eingeben der URL der Quelldatei und eines für die Zieldatei – und eine Schaltfläche namens cmdDownload.

Entwurf des Formulars zum Herunterladen von Dokumenten aus dem Internet

Bild 1: Entwurf des Formulars zum Herunterladen von Dokumenten aus dem Internet

Außerdem hinterlegen wir noch eine Schaltfläche, mit welcher der Benutzer den Namen der Datei angeben kann, unter welcher die heruntergeladende Datei gespeichert werden soll. Diese Schaltfläche heißt cmdDateiauswahl und ruft die folgende Prozedur auf:

Private Sub cmdDateiauswahl_Click()
     Dim objFileDialog As FileDialog
     Set objFileDialog = FileDialog(msoFileDialogSaveAs)
     objFileDialog.Title = "Zieldatei festlegen"
     objFileDialog.InitialFileName = _
         CurrentProject.Path & "\"
     If objFileDialog.Show = True Then
         Me!txtZieldatei = objFileDialog.SelectedItems(1)
     End If
End Sub

Für die Verwendung der FileDialog-Klasse benötigen wir einen Verweis auf die Bibliothek Microsoft Office 16.0 Object Library (wie wir diesen hinzufügen, zeigen wir weiter unten).

Wenn der Benutzer auch noch die URL wie in Bild 2 ausfüllt, können wir die Schaltfläche cmdDownload nutzen, für die wir die folgende Prozedur hinterlegen:

Formular zur Eingabe von Quelle und Ziel beim Download

Bild 2: Formular zur Eingabe von Quelle und Ziel beim Download

Private Sub cmdDownload_Click()
     If DownloadAPI(Me!txtURL, Me!txtZieldatei) Then
         MsgBox "Download erfolgreich!"
     End If
End Sub

Für etwas mehr Komfort haben wir die Eigenschaft Horizontaler Anker der beiden Textfelder auf Beide eingestellt. So können wir die Felder verbreitern, indem wir die Breite des Formulars vergrößern. Die gleiche Eigenschaft stellen wir für die beiden Bezeichnungsfelder dann wieder auf Links ein, da diese automatisch auf Rechts eingestellt wurden.

Außerdem legen wir diese Eigenschaft für die Schaltfläche cmdDateiauswahl auf Rechts ein, damit sie beim Vergrößern nach rechts verschoben wird (siehe Bild 3).

Neue Schaltfläche für eine Download-Alternative

Bild 3: Neue Schaltfläche für eine Download-Alternative

Download per ServerXMLHTTP-Objekt

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar