{"id":55001437,"date":"2023-06-01T00:00:00","date_gmt":"2023-06-17T09:29:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1437"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Dateien_aus_dem_Web_herunterladen_per_VBA","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/","title":{"rendered":"Dateien aus dem Web herunterladen per VBA"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/cbbd437f2fdf41aca5cc27cf6f2a5aa3\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es gibt eine Menge Gr&uuml;nde, warum man per VBA komplette Dateien aus dem Internet herunterladen sollte. Beispielsweise k&ouml;nnte man von dort Listen im Excel- oder .csv-Format herunterladen, um anschlie&szlig;end die enthaltenen Daten in die aktuelle Datenbank einzulesen. Oder man hat eine Anwendung, die beim Kunden l&auml;uft, und diese soll in regelm&auml;&szlig;igen Abst&auml;nden pr&uuml;fen, ob es ein Update f&uuml;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.<\/b><\/p>\n<h2>Download per API<\/h2>\n<p>Ein Download via API ist die am schnellsten programmierte und einfachste Methode, um eine Datei aus dem Internet herunterzuladen, die auch frei verf&uuml;gbar ist (also auch &uuml;ber die Eingabe der URL in einen Webbrowser heruntergeladen werden k&ouml;nnte). Die L&ouml;sung zu diesem Ansatz sieht wie in Listing 1 aus. Hier deklarieren wir zun&auml;chst eine API-Funktion namens <b>URLDownloadToFile <\/b>in der 32-Bit-Version und in der 64-Bit-Version sowie eine Konstante.<\/p>\n<pre>#If VBA7 Then\r\n<span style=\"color:blue;\">Private <\/span>Declare Function URLDownloadToFile Lib \"urlmon\" Alias \"URLDownloadToFileA\" _\r\n     (ByVal pCaller<span style=\"color:blue;\"> As Long<\/span>, ByVal szURL<span style=\"color:blue;\"> As String<\/span>, ByVal szFileName<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal dwReserved<span style=\"color:blue;\"> As Long<\/span>, ByVal lpfnCB<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n#Else\r\n<span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function URLDownloadToFile Lib \"urlmon\" Alias \"URLDownloadToFileA\" _\r\n     (ByVal pCaller<span style=\"color:blue;\"> As Long<\/span>Ptr, ByVal szURL<span style=\"color:blue;\"> As String<\/span>, ByVal szFileName<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal dwReserved<span style=\"color:blue;\"> As Long<\/span>Ptr, ByVal lpfnCB<span style=\"color:blue;\"> As Long<\/span>Ptr)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n#End If\r\nConst ERROR_SUCCESS = 0\r\n<span style=\"color:blue;\">Sub <\/span>DownloadAPI()\r\n     <span style=\"color:blue;\">Dim <\/span>strUrl<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDatei<span style=\"color:blue;\"> As String<\/span>\r\n     strUrl = \"http:\/\/www.access-im-unternehmen.de\/pic001.png\"\r\n     strDatei = CurrentProject.Path & \"\\pic001.png\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> URLDownloadToFile(0&, strUrl, strDatei, BINDF_GETNEWESTVERSION, 0&) = ERROR_SUCCESS\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einfacher Code zum Herunterladen einer Datei<\/span><\/b><\/p>\n<p>Danach rufen wir die Prozedur <b>DownloadAPI <\/b>auf, in der wir die URL der herunterzuladenden Datei sowie den Zielpfad angeben. Damit ausgestattet rufen wir die API-Funktion auf und &uuml;bergeben dieser mit dem zweiten und dritten Parameter die URL und den Zielpfad. Die &uuml;brigen Parameter bleiben leer. Wenn wir die Prozedur nun aufrufen und die angegebene Datei vorhanden ist, wird sie unter dem angegebenen Pfad auf dem lokalen Rechner gespeichert.<\/p>\n<h2>Funktion auf Basis dieser Prozedur<\/h2>\n<p>In vielen F&auml;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.<\/p>\n<p>Dann erstellen wir eine Funktion auf Basis der Prozedur, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DownloadAPI(strURL<span style=\"color:blue;\"> As String<\/span>, _\r\n         strDatei<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     If URLDownloadToFile(0&, strURL, strDatei, 0&, 0&) _\r\n             = ERROR_SUCCESS Then\r\n         DownloadAPI = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span> <\/pre>\n<p>Der Aufruf erfolgt beispielsweise &uuml;ber die folgende Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_DownloadAPI()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDatei<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = \"http:\/\/www.access-im-unternehmen.de\/pic001.png\"\r\n     strDatei = CurrentProject.Path & \"\\pic001.png\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> DownloadAPI(strURL, strDatei)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Mehr Komfort per Formular<\/h2>\n<p>Wenn wir dem Benutzer die Steuerung des gesamten Vorgangs &uuml;berlassen wollen, k&ouml;nnen wir ihm ein Formular wie in Bild 1 hinzuf&uuml;gen. Dieses enth&auml;lt zwei Textfelder &#8211; eines zum Eingeben der URL der Quelldatei und eines f&uuml;r die Zieldatei &#8211; und eine Schaltfl&auml;che namens <b>cmdDownload<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_002.png\" alt=\"Entwurf des Formulars zum Herunterladen von Dokumenten aus dem Internet \" width=\"499,5589\" height=\"219,3403\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf des Formulars zum Herunterladen von Dokumenten aus dem Internet <\/span><\/b><\/p>\n<p>Au&szlig;erdem hinterlegen wir noch eine Schaltfl&auml;che, mit welcher der Benutzer den Namen der Datei angeben kann, unter welcher die herunter geladende Datei gespeichert werden soll. Diese Schaltfl&auml;che hei&szlig;t <b>cmdDateiauswahl <\/b>und ruft die folgende Prozedur auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDateiauswahl_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objFileDialog<span style=\"color:blue;\"> As <\/span>FileDialog\r\n     <span style=\"color:blue;\">Set<\/span> objFileDialog = FileDialog(msoFileDialogSaveAs)\r\n     objFileDialog.Title = \"Zieldatei festlegen\"\r\n     objFileDialog.InitialFileName = _\r\n         CurrentProject.Path & \"\\\"\r\n     <span style=\"color:blue;\">If <\/span>objFileDialog.Show = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtZieldatei = objFileDialog.SelectedItems(1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r die Verwendung der <b>FileDialog<\/b>-Klasse ben&ouml;tigen wir einen Verweis auf die Bibliothek <b>Microsoft Office 16.0 Object Library <\/b>(wie wir diesen hinzuf&uuml;gen, zeigen wir weiter unten).<\/p>\n<p>Wenn der Benutzer auch noch die URL wie in Bild 2 ausf&uuml;llt, k&ouml;nnen wir die Schaltfl&auml;che <b>cmdDownload <\/b>nutzen, f&uuml;r die wir die folgende Prozedur hinterlegen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_007.png\" alt=\"Formular zur Eingabe von Quelle und Ziel beim Download\" width=\"599,559\" height=\"157,4878\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Formular zur Eingabe von Quelle und Ziel beim Download<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDownload_Click()\r\n     <span style=\"color:blue;\">If <\/span>DownloadAPI(Me!txtURL, Me!txtZieldatei)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Download erfolgreich!\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r etwas mehr Komfort haben wir die Eigenschaft <b>Horizontaler Anker <\/b>der beiden Textfelder auf <b>Beide <\/b>eingestellt. So k&ouml;nnen wir die Felder verbreitern, indem wir die Breite des Formulars vergr&ouml;&szlig;ern. Die gleiche Eigenschaft stellen wir f&uuml;r die beiden Bezeichnungsfelder dann wieder auf <b>Links <\/b>ein, da diese automatisch auf <b>Rechts <\/b>eingestellt wurden.<\/p>\n<p>Au&szlig;erdem legen wir diese Eigenschaft f&uuml;r die Schaltfl&auml;che <b>cmdDateiauswahl <\/b>auf <b>Rechts <\/b>ein, damit sie beim Vergr&ouml;&szlig;ern nach rechts verschoben wird (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_004.png\" alt=\"Neue Schaltfl&auml;che f&uuml;r eine Download-Alternative\" width=\"499,5589\" height=\"193,234\" \/><\/p>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Neue Schaltfl&auml;che f&uuml;r eine Download-Alternative<\/span><\/b><\/p>\n<h2>Download per ServerXMLHTTP-Objekt<\/h2>\n<p>Die zweite Methode, die wir in diesem Beitrag vorstellen, erfolgt mit einem Objekt aus der Bibliothek <b>Microsoft XML, v6.0<\/b>. Um dieses zu verwenden und dabei die Vorteile von IntelliSense zu benutzen, ben&ouml;tigen wir einen Verweis auf diese Bibliothek. Dazu w&auml;hlen wir im VBA-Editor den Men&uuml;befehl <b>Extras|Verweise <\/b>aus und f&uuml;gen im Dialog <b>Verweise <\/b>den entsprechenden Eintrag durch Anklicken des Kontrollk&auml;stchens hinzu (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_001.png\" alt=\"Verweise f&uuml;r die ServerXMLHTTP-Variante\" width=\"499,5589\" height=\"393,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Verweise f&uuml;r die ServerXMLHTTP-Variante<\/span><\/b><\/p>\n<p>Das Gleiche erledigen wir, wenn noch nicht geschehen, f&uuml;r die Bibliothek Microsoft <b>Office 16.0 Object Library<\/b>. Schlie&szlig;lich ben&ouml;tigen wir noch einen dritten Verweis, n&auml;mlich den auf die Bibliothek <b>Microsoft ActiveX Data Objects 6.1 Library<\/b>. Diese enth&auml;lt die Elemente, die wir f&uuml;r das Speichern der heruntergeladenen Datei ben&ouml;tigen, denn im Gegensatz zur API-Funktion <b>URLDownloadToFile <\/b>hat das Objekt <b>ServerXMLHTTP <\/b>keine Methode zum direkten Speichern des heruntergeladenen Objekts im Dateisystem.<\/p>\n<p>F&uuml;r die neue Variante des Downloads erstellen wir eine weitere Funktion namens <b>DownloadXML<\/b>. Diese sieht wie in Listing 2 aus und enth&auml;lt die gleichen beiden Parameter wie die Funktion <b>DownloadAPI<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DownloadXML(strURL<span style=\"color:blue;\"> As String<\/span>, strDatei<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objServerXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.ServerXMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>objStream<span style=\"color:blue;\"> As <\/span>ADODB.Stream\r\n     <span style=\"color:blue;\">Set<\/span> objXMLServerHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.ServerXMLHTTP60\r\n     objXMLServerHTTP.Open \"GET\", strURL, <span style=\"color:blue;\">False<\/span>\r\n     objXMLServerHTTP.send\r\n     <span style=\"color:blue;\">Set<\/span> objStream = CreateObject(\"ADODB.Stream\")\r\n     objStream.Open\r\n     objStream.Type = 1\r\n     objStream.Write objServerXMLHTTP.responseBody\r\n     objStream.SaveToFile strDatei, 2\r\n     objStream.Close\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Dir(strDatei)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         DownloadXML = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: VBA-Code zum Herunterladen einer Datei per ServerXMLHTTP-Objekt<\/span><\/b><\/p>\n<p>Um nun die Klasse <b>ServerXMLHTTP <\/b>zu nutzen, deklarieren wir zun&auml;chst eine Objektvariable des Typs <b>MSXML2.ServerXMLHTTP60<\/b>. Au&szlig;erdem deklarieren wir ein Objekt des Typs <b>ADODB.Stream<\/b>.<\/p>\n<p>Danach erstellt die Funktion ein Objekt des Typs <b>ServerXMLHTTP <\/b>und referenziert dieses mit der Variablen <b>objServerXMLHTTP<\/b>. Dieses wird gleich verwendet werden, um eine Verbindung zu der mit <b>strURL <\/b>angegebenen URL herzustellen und die enthaltenen Daten abzurufen.<\/p>\n<p>Die Prozedur ruft als Erstes die Methode <b>Open <\/b>des Objekts auf und &uuml;bergibt neben dem Wert <b>GET <\/b>f&uuml;r den ersten Parameter die URL mit dem zweiten Parameter. Der dritte Parameter erh&auml;lt den Wert <b>False<\/b>, damit die Operation nicht asynchron verl&auml;uft, das hei&szlig;t, dass dieser Aufruf zuerst vollst&auml;ndig ausgef&uuml;hrt wird, bevor die n&auml;chste Anweisung der Prozedur an der Reihe ist. Die <b>send<\/b>-Methode sorgt schlie&szlig;lich f&uuml;r die Ausf&uuml;hrung des Abrufs der Daten. <\/p>\n<p>Anschlie&szlig;end erstellt die Prozedur ein Objekt des Typs <b>ADODB.Stream<\/b> und &ouml;ffnet dieses. Die Variable <b>objStream <\/b>ist ein Objekt der Klasse <b>ADODB.Stream<\/b>, die zur Manipulation von Bin&auml;r- und Textdatenstr&ouml;men in VBA verwendet wird. Die <b>Type<\/b>-Eigenschaft legt den Typ des ADODB-Streams fest. In diesem Fall wird der Wert <b>1<\/b> zugewiesen, was bedeutet, dass der Stream als Bin&auml;rstrom erstellt wird und Bin&auml;rdaten wie zum Beispiel die Daten in einem Bild oder in einer Datei enth&auml;lt.<\/p>\n<p>Wenn <b>Type <\/b>auf <b>2<\/b> gesetzt ist, wird ein Textstream erstellt, welcher Textdaten wie zum Beispiel eine Zeichenfolge enth&auml;lt. Da in diesem Fall eine normale Datei heruntergeladen wird, wird ein bin&auml;rer Datenstrom ben&ouml;tigt, um die bin&auml;ren Daten der Datei zu speichern.<\/p>\n<p>Die folgende Zeile mit der Methode <b>Write <\/b>erwartet die Antwort des Aufrufs des <b>ServerXMLHTTP<\/b>-Objekts als Parameter und schreibt diesen in den Stream. Das <b>Stream<\/b>-Objekt dient also praktisch als Zwischenspeicher, bevor die heruntergeladene Datei mit der <b>SaveToFile<\/b>-Methode in die mit <b>strDatei <\/b>angegebene Datei geschrieben wird.<\/p>\n<p>Danach schlie&szlig;t die Funktion das <b>Stream<\/b>-Objekt mit der <b>Close<\/b>-Methode, pr&uuml;ft, ob die angegebene Datei vorhanden ist und gibt in diesem Fall den Wert <b>True <\/b>als Funktionswert zur&uuml;ck.<\/p>\n<p>Diese Funktion rufen wir &uuml;ber eine weitere Schaltfl&auml;che auf, die wir ebenfalls im Formular <b>frmDownload <\/b>unterbringen (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_005.png\" alt=\"Weiteres Downloadverfahren per Formular\" width=\"499,5589\" height=\"213,6104\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Weiteres Downloadverfahren per Formular<\/span><\/b><\/p>\n<p>Die durch diese Schaltfl&auml;che aufgerufene Prozedur sieht schlie&szlig;lich wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDownloadXMLHTTP_Click()\r\n     <span style=\"color:blue;\">If <\/span>DownloadXML(Me!txtURL, Me!txtZieldatei)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Download erfolgreich!\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Download von gesch&uuml;tzten Dateien<\/h2>\n<p>Es kann auch sein, dass die herunterzuladende Datei in einem gesch&uuml;tzten Verzeichnis auf dem Webserver liegt. Das ist sinnvoll, wenn es sich um sensible Daten handelt.<\/p>\n<p>Wenn wir auf solche Daten &uuml;ber den Webbrowser zugreifen wollen, erscheint vor dem Download eine Meldung wie die aus Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_112.png\" alt=\"Zugriff auf eine gesch&uuml;tzte Datei\" width=\"649,559\" height=\"336,3101\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Zugriff auf eine gesch&uuml;tzte Datei<\/span><\/b><\/p>\n<p>Wenn Sie dies ausprobieren wollen, k&ouml;nnen Sie diese URL verwenden:<\/p>\n<pre>https:\/\/www.access-im-unternehmen.de\/geschuetzt\/pic001.png<\/pre>\n<p>Damit die Dateien in einem solchen Verzeichnis wie hier gesch&uuml;tzt werden, sind einige Schritte n&ouml;tig, die aus dem Anlegen bestimmter Dateien auf dem Webserver bestehen:<\/p>\n<ul>\n<li>Anlegen einer <b>.htaccess<\/b>-Datei, welche die Regeln f&uuml;r den Zugriff festlegt<\/li>\n<li>Anlegen einer <b>.htpasswd<\/b>-Datei mit den Namen der Benutzer und ihren Kennw&ouml;rtern<\/li>\n<\/ul>\n<p>In unserem Beispiel haben wir die <b>.htaccess<\/b>-Datei wie folgt angelegt:<\/p>\n<pre>AuthType Basic\r\nAuthName \"Benutzer\"\r\nAuthUserFile [Pfad zum Verzeichnis]\/geschuetzt\/.htpasswd\r\nrequire valid-user<\/pre>\n<p>Beim Anlegen des Beispiels hatten wir Probleme, den Pfad zur <b>.htpasswd <\/b>korrekt anzugeben. Um den Pfad zum Root-Verzeichnis herauszufinden, k&ouml;nnen Sie eine PHP-Datei in dasselbe Verzeichnis kopieren. Legen Sie eine neue Datei beispielsweise namens <b>path.php <\/b>an, die folgenden Inhalt aufweist:<\/p>\n<pre>&lt;?php echo $_SERVER[\"DOCUMENT_ROOT\"]; ?&gt;<\/pre>\n<p>Ruft man sie nun im Browser auf, erscheint nur der Pfad zum Wurzelverzeichnis des Dokuments. Dieser ist noch nicht der Pfad zum aktuellen Verzeichnis, dieses m&uuml;ssen Sie gegebenenfalls noch ersetzen. Wir haben das Verzeichnis <b>geschuetzt <\/b>direkt im Root-Verzeichnis angelegt, sodass unser Pfad wie oben angegeben aussieht &#8211; mit dem ersetzten Platzhalter <b>[Pfad zum Verzeichnis]<\/b>.<\/p>\n<p>Nun fehlt noch die <b>.htpasswd<\/b>-Datei mit dem Benutzer und dem verschl&uuml;sselten Kennwort (wir wollen keine Kennw&ouml;rter im Klartext speichern). Diese hat den folgenden Inhalt:<\/p>\n<pre>benutzer:$apr1$6fropkqn$sBIZtCyFuLiER1zC4cUCp.<\/pre>\n<p>Das Kennwort haben wir unter folgendem Link verschl&uuml;sselt:<\/p>\n<pre>https:\/\/www.web2generators.com\/apache-tools\/htpasswd-generator<\/pre>\n<p>Hier geben Sie den Benutzernamen und das Kennwort ein und erhalten den passenden Ausdruck f&uuml;r die <b>.htpasswd<\/b>-Datei.<\/p>\n<p>Nachdem wir eine Datei in einem gesch&uuml;tzten Verzeichnis auf dem Webserver abgelegt haben, legen wir nun ein Formular zum Abruf dieser Datei an.<\/p>\n<h2>Formular zum Download gesch&uuml;tzter Dateien<\/h2>\n<p>Dieses Formular ist eine erweiterte Kopie des zuvor beschriebenen Formulars namens <b>frmDownload<\/b>. Dieses hei&szlig;t <b>frmDownloadGeschuetzt <\/b>und enth&auml;lt zwei weitere Textfelder namens <b>txtBenutzer <\/b>und <b>txtKennwort<\/b> (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_006.png\" alt=\"Formular f&uuml;r den gesch&uuml;tzten Download in der Entwurfsansicht\" width=\"499,5589\" height=\"263,7044\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Formular f&uuml;r den gesch&uuml;tzten Download in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Damit beim Laden direkt einige Beispieldaten enthalten sind (die aktuell auf ein existierendes und funktionierendes Beispiel auf unserem Webserver zeigen), weisen wir den Textfeldern beim Laden des Formulars wie folgt Daten zu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!txtURL = _\r\n         \"https:\/\/www.access-im-unternehmen.de\/pic001.png\"\r\n     Me!txtZieldatei = CurrentProject.Path & \"\\pic111.png\"\r\n     Me!txtBenutzer = \"benutzer\"\r\n     Me!txtKennwort = \"kennwort\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie k&ouml;nnen die Werte nach Ihren eigenen W&uuml;nschen anpassen (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1437_008.png\" alt=\"Formular f&uuml;r den gesch&uuml;tzten Download in Aktion\" width=\"499,5589\" height=\"219,9623\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Formular f&uuml;r den gesch&uuml;tzten Download in Aktion<\/span><\/b><\/p>\n<p>F&uuml;r die dortige Schaltfl&auml;che hinterlegen wir die folgende Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDownloadBenutzername_Click()\r\n     If DownloadXMLUserPwd(Me!txtURL, Me!txtZieldatei, _\r\n             Me!txtBenutzer, Me!txtKennwort) Then\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Download erfolgreich!\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies stellt die ben&ouml;tigten Parameter zusammen und ruft die Funktion aus Listing 3 auf. Die Prozedur erwartet neben den bereits bekannten Parametern f&uuml;r die Quell-URL und dem Zielpfad die Angabe des Benutzernamens und des Kennworts f&uuml;r die gesch&uuml;tzte Datei.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DownloadXMLUserPwd(strURL<span style=\"color:blue;\"> As String<\/span>, strDatei<span style=\"color:blue;\"> As String<\/span>, strBenutzer<span style=\"color:blue;\"> As String<\/span>, strKennwort<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objServerXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.ServerXMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>objStream<span style=\"color:blue;\"> As <\/span>ADODB.Stream\r\n     <span style=\"color:blue;\">Set<\/span> objServerXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.ServerXMLHTTP60\r\n     objServerXMLHTTP.Open \"GET\", strURL, False, strBenutzer, strKennwort\r\n     objServerXMLHTTP.send\r\n     <span style=\"color:blue;\">Set<\/span> objStream = CreateObject(\"ADODB.Stream\")\r\n     objStream.Open\r\n     objStream.Type = 1\r\n     objStream.Write objServerXMLHTTP.responseBody\r\n     objStream.SaveToFile strDatei, 2\r\n     objStream.Close\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Dir(strDatei)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         DownloadXMLUserPwd = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: VBA-Code zum Herunterladen einer gesch&uuml;tzten Datei per ServerXMLHTTP-Objekt<\/span><\/b><\/p>\n<p>Diese werden als Parameter an den Aufruf der <b>Open<\/b>-Methode des <b>ServerHTTPXML<\/b>-Objekts angeh&auml;ngt.<\/p>\n<p>Damit gelingt auch der Download von gesch&uuml;tzten Dateien.<\/p>\n<h2>Gegen&uuml;berstellung der API- und der ServerXMLHTTP-Methode<\/h2>\n<p>Die API-Methode ist deutlich schlanker: Sie ben&ouml;tigt lediglich die Deklaration einer API-Funktion und ihren Aufruf. Die zus&auml;tzlich noch deklarierte Konstante k&ouml;nnte man auch noch durch die direkte Angabe des Zahlenwerts erg&auml;nzen.<\/p>\n<p>Diese Methode erlaubt jedoch ausschlie&szlig;lich das Herunterladen von Dateien, die auch &uuml;ber den Webbrowser frei zug&auml;nglich sind.<\/p>\n<p>Wenn nur dies n&ouml;tig ist, ist der Ansatz &uuml;ber die <b>ServerXMLHTTP<\/b>-Klasse (oder die neuere <b>ServerXMLHTTP60<\/b>-Version) nicht notwendig.<\/p>\n<p>Wenn jedoch die Dateien in einem wie oben beschriebenen gesch&uuml;tzten Bereich liegen, kommt man mit der API-Funktion <b>URLDownloadToFile <\/b>nicht weiter &#8211; diese &uuml;bergibt schlicht keine Benutzerdaten.<\/p>\n<p>In diesem Fall kommt man nicht um die Nutzung der <b>ServerXMLHTTP<\/b>-Klasse herum, welche mit der <b>Open<\/b>-Methode die M&ouml;glichkeit bietet, Benutzername und Kennwort mit zu &uuml;bergeben.<\/p>\n<h2>ServerXMLHTTP oder XMLHTTP<\/h2>\n<p>Wenn Sie die Bibliothek <b>Microsoft XML, v6.0 <\/b>durchgehen, werden Sie neben der <b>ServerXMLHTTP<\/b>&#8211; beziehungsweise <b>ServerXMLHTTP60<\/b>-Klasse noch eine <b>XMLHTTP<\/b>\/<b>XMLHTTP60<\/b>-Klasse finden. Die letztere k&ouml;nnen wir nicht f&uuml;r den hier genannten Zweck nutzen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag beschreibt zwei Techniken f&uuml;r den Download von Dateien aus dem Internet.<\/p>\n<p>Dabei geben wir die URL der herunterzuladenden Datei als Parameter an, ein zweiter Parameter legt fest, wohin die Datei gespeichert werden soll.<\/p>\n<p>Weitere M&ouml;glichkeiten bietet die <b>ServerXMLHTTP<\/b>-Klasse, mit der Sie auch noch Benutzerdaten f&uuml;r gesch&uuml;tzte Dateien im Internet &uuml;bergeben k&ouml;nnen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DateienAusDemWebHerunterladenPerVBA.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/B43A4CB4-5164-44B7-89C1-2AD909F871E0\/aiu_1437.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt eine Menge Gr&uuml;nde, warum man per VBA komplette Dateien aus dem Internet herunterladen sollte. Beispielsweise k&ouml;nnte man von dort Listen im Excel- oder .csv-Format herunterladen, um anschlie&szlig;end die enthaltenen Daten in die aktuelle Datenbank einzulesen. Oder man hat eine Anwendung, die beim Kunden l&auml;uft, und diese soll in regelm&auml;&szlig;igen Abst&auml;nden pr&uuml;fen, ob es ein Update f&uuml;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.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662023,66032023,44000026,44000030],"tags":[],"class_list":["post-55001437","post","type-post","status-publish","format-standard","hentry","category-662023","category-66032023","category-Interaktiv","category-Internet"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Dateien aus dem Web herunterladen per VBA - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dateien aus dem Web herunterladen per VBA\" \/>\n<meta property=\"og:description\" content=\"Es gibt eine Menge Gr&uuml;nde, warum man per VBA komplette Dateien aus dem Internet herunterladen sollte. Beispielsweise k&ouml;nnte man von dort Listen im Excel- oder .csv-Format herunterladen, um anschlie&szlig;end die enthaltenen Daten in die aktuelle Datenbank einzulesen. Oder man hat eine Anwendung, die beim Kunden l&auml;uft, und diese soll in regelm&auml;&szlig;igen Abst&auml;nden pr&uuml;fen, ob es ein Update f&uuml;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.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-17T09:29:38+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Dateien aus dem Web herunterladen per VBA\",\"datePublished\":\"2023-06-17T09:29:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/\"},\"wordCount\":2017,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/cbbd437f2fdf41aca5cc27cf6f2a5aa3\",\"articleSection\":[\"2023\",\"3\\\/2023\",\"Interaktiv\",\"Internet\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/\",\"name\":\"Dateien aus dem Web herunterladen per VBA - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/cbbd437f2fdf41aca5cc27cf6f2a5aa3\",\"datePublished\":\"2023-06-17T09:29:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/cbbd437f2fdf41aca5cc27cf6f2a5aa3\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/cbbd437f2fdf41aca5cc27cf6f2a5aa3\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_aus_dem_Web_herunterladen_per_VBA\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dateien aus dem Web herunterladen per VBA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dateien aus dem Web herunterladen per VBA - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/","og_locale":"de_DE","og_type":"article","og_title":"Dateien aus dem Web herunterladen per VBA","og_description":"Es gibt eine Menge Gr&uuml;nde, warum man per VBA komplette Dateien aus dem Internet herunterladen sollte. Beispielsweise k&ouml;nnte man von dort Listen im Excel- oder .csv-Format herunterladen, um anschlie&szlig;end die enthaltenen Daten in die aktuelle Datenbank einzulesen. Oder man hat eine Anwendung, die beim Kunden l&auml;uft, und diese soll in regelm&auml;&szlig;igen Abst&auml;nden pr&uuml;fen, ob es ein Update f&uuml;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.","og_url":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-06-17T09:29:38+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Dateien aus dem Web herunterladen per VBA","datePublished":"2023-06-17T09:29:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/"},"wordCount":2017,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/cbbd437f2fdf41aca5cc27cf6f2a5aa3","articleSection":["2023","3\/2023","Interaktiv","Internet"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/","url":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/","name":"Dateien aus dem Web herunterladen per VBA - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/cbbd437f2fdf41aca5cc27cf6f2a5aa3","datePublished":"2023-06-17T09:29:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/cbbd437f2fdf41aca5cc27cf6f2a5aa3","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/cbbd437f2fdf41aca5cc27cf6f2a5aa3"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Dateien_aus_dem_Web_herunterladen_per_VBA\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Dateien aus dem Web herunterladen per VBA"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001437"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001437\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}