Zippen unter VBA ging bislang nur mit Komponenten von Drittherstellern. Dabei liefert Windows (ab XP) doch alles, was man dazu braucht – zwar nicht den Komfort, den „richtige“ Zip-Anwendungen wie WinZip und Co. bieten, aber immerhin brauchen Sie keine zusätzlichen Tools zu installieren. Wir zeigen Ihnen, wo die Zip-Funktionen von Windows stecken und wie Sie diese in Ihren Anwendungen einsetzen.
Wer mit Windows XP arbeitet, ist es gewohnt, Zip-Dateien auch ohne zusätzliches Zip-Tool zu öffnen. Der Windows Explorer zeigt sogar den Inhalt von Zip-Dateien an, wenn man diese in der Ordner-Ansicht markiert.
Die dort enthaltenen Funktionen lassen sich auch per VBA ansteuern. Dazu braucht man lediglich einen Verweis auf die Bibliothek Microsoft Shell Controls and Automation und die folgenden VBA-Routinen.
Der Ausgangspunkt für das Zippen sind üblicherweise eine oder mehrere Dateien und/oder Verzeichnisse. Diese sollen unter Beibehaltung der Struktur der enthaltenen Verzeichnisse in eine Zip-Datei geschrieben und wiederhergestellt werden können.
Die oben genannte Bibliothek liefert hierzu zunächst einmal wenig Erbauliches – zumindest, wenn man sich die enthaltenen Methoden und Eigenschaften im Objektkatalog ansieht. Dort kommt man erst weiter, wenn man sich vor Augen führt, was im Windows Explorer geschieht, wenn Sie Dateien aus einer Zip-Datei in ein normales Verzeichnis überführen und umgekehrt – Sie kopieren dort nämlich etwas. Und zum Thema Kopieren liefert die Bibliothek immerhin schon einmal die Methode CopyHere.
Und wenn Sie sich noch ein wenig von der Vorstellung lösen, dass ein Zip-File eine Datei sei und diese mehr als Ordner verstehen, haben Sie fast alles zusammen, was Sie brauchen: Die Methode CopyHere gehört nämlich zum Folder-Objekt.
Es gibt also ein Folder-Objekt, das Sie offensichtlich mithilfe der CopyHere-Methode mit irgendetwas füllen können. Woher beziehen wir das Folder-Objekt, das der Zip-Datei entsprechen sollte Ein weiterer Blick in den Objektkatalog zeigt, dass die Methode Namespace des Shell-Objekts ein Objekt des Typs Folder zurückliefert – und zwar nach Angabe eines Parameters vDir. Dieser kann beispielsweise eine Zeichenkette mit dem Pfad zur Zip-Datei enthalten.
Zip-Datei erstellen
Allerdings haben wir ja eigentlich noch gar keine Zip-Datei. Und das Erstellen nimmt uns die Shell32-Bibliothek leider nicht ab. Sind wir hier schon am Ende unseres Weges Mitnichten. Wir legen einfach ein Zip-Archiv mit einem herkömmlichen Zip-Programm an und löschen anschließend die darin archivierten Dateien. Übrig bleibt ein leeres Zip-Archiv, dessen Inhalt der Hex-Editor aus Bild 1 liefert. Die Routine CreateZipFile erstellt einfach eine neue, leere Datei und fügt die soeben ermittelten Zeichen zur Datei hinzu, bevor sie diese schließt.
Bild 1: Ein leeres Zip-Archiv im Hex-Editor
Der folgende Aufruf erzeugt beispielsweise eine Zip-Datei, die Sie ganz normal mit WinZip und Konsorten öffnen können:
CreateZipFile "c:\test.zip"
Zip-Archiv füllen
Nun wollen wir dieses Archiv mit einer Datei füllen. Auf Basis der gewonnenen Erkenntnisse schreiben wir die Routine aus Listing 2 herunter. Diese besitzt eine Objektvariable für das Shell-Objekt der Shell32-Bibliothek und zwei für das Folder-Objekt – je eines für die Quelldatei(en) und für das Zip-Archiv. Die Routine ruft automatisch die Prozedur CreateZipfile auf, um die benötigte Zip-Datei zu erzeugen. Dann erzeugt sie die drei Objekte, wobei objZip auf Basis des im Parameter strZip angegebenen Zip-Archivs und objSource auf Basis von strSource erstellt wird. Anschließend reicht ein einfacher Aufruf der Methode CopyHere, um die Quelle – egal, ob es sich um eine Datei oder ein Verzeichnis handelt – in das Zip-Archiv zu kopieren.
Zip-Archiv extrahieren
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo