VBA: Datei-Transfer per HTTP

Hallo!

Ich möchte von einem VBA-Programm aus per HTTP eine Datei (PDF-Format) ins lokale Temp-Verzeichnis kopieren und sie dann von dort aus aufrufen. Wie kann ich das bewerkstelligen?

Ich habe einige Möglichkeiten (über das Hyperlinks-Objekt, mit den Microsoft Internet Controls und über die API-Funktion ShellExecute) gefunden, die Datei über den Internet Explorer zu öffnen. Diese Möglichkeiten sind jedoch nicht so schön, da sie allesamt ein IE-Fenster mit dem PDF-Dokument und ein leeres Acrobat Reader-Fenster öffnen.

Daher möchte ich die Datei vorher lokal kopieren und dann direkt den Acrobat Reader aufrufen.

Das WinSock-Control steht ja unter VBA nicht zur Verfügung. Kann man dessen Funktionalität vielleicht durch direkte API-Aufrufe nachbilden?

Gruß,
Mirko Klotz

Hallo

Erstelle zunächst ein neues Code-Modul mit dem folgenden Code:

Option Explicit

Private Declare Function URLDownloadToFile Lib „urlmon.dll“ Alias
„URLDownloadToFileA“ (ByVal pCaller As Long, ByVal szURL As String,
ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As
Long) As Long

Public Function DownloadFile(URL As String, LocalFileName As String)
As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFileName, 0, 0)
DownloadFile = (lngRetVal = 0)
End Function

Anschliessend kannst du jederzeit eine beliebige Datei wie folgt
downloaden:

Call DownloadFile([URL], [Lokaler Dateiname])

also zum Beispiel

Call DownloadFile(„http://www.deltaguild.com/file.doc“, Environ
(„TEMP“) & „\File.doc“)

Mit freundlichen Grüssen

Samuel

Team: Name entfernt

Hallo!

Danke für den Hinweis!

Durch einen anderen Hinweis habe ich bereits eine andere Möglichkeit gedunen. Auch über die API-Funktionen InternetOpen, InternetOpenUrl, InternetReadFile und InternetCloseHandle der WININET.DLL lässt sich dergleichen bewerkstelligen.

Allerdings ist dein Ansatz über die URLMON.DLL , der mit nur einer Deklaration und einem API-Aufruf auskommt um einiges kompakter. Ich schätze, ich werde diesen benutzen. Ob es Performance-Unterschiede zwischen beiden Wegen gibt, wage ich mal zu bezweifeln.

Es ist nämlich nicht so, dass eine DLL auf die andere aufbaut. Vielmehr rufen beide die SHLWAPI.DLL auf (laut Schnellansicht). Dort scheinen die Low-Level-Funktionen drin zu stecken.

Nun ja, also wieder etwas schlauer geworden :smile:

Gruß,
Mirko Klotz

Private Declare Function URLDownloadToFile Lib „urlmon.dll“
Alias „URLDownloadToFileA“ (ByVal pCaller As Long, ByVal szURL
As String, ByVal szFileName As String, ByVal dwReserved As
Long, ByVal lpfnCB As Long) As Long

Public Function DownloadFile(URL As String, LocalFileName As
String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFileName, 0, 0)
DownloadFile = (lngRetVal = 0)
End Function