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?
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:
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
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