Zippen und Unzippen aus Access heraus
Erstellt man z.B. aus Access heraus PDF-Dateien – so wie im vorigen Artikel gezeigt – dann möchte man diese unter Umständen auch per Email verschicken, z.B. einen regelmäßigen Umsatzbericht an die Geschäftsleitung. Da würde es Sinn machen, vorher die PDF-Dateien in einem Zip-Archiv zusammenzufügen.
Ein anderes Szenario wäre, Sie erhalten regelmäßig Textdateien in gezippter Form, und möchten diese in eine Access-Tabelle importieren.
Die Möglichkeiten die man dazu hat sind überschaubar. Man könnte z.B. Winzip oder Winrar automatisieren. Was aber wenn es nicht gestattet ist 3th Party Software auf dem Rechner zu installieren, und weder Winzip noch Winrar sind verfügbar.
Für so einen Fall gibt es verschiedene DLL-Bibliotheken von externen Anbietern, die die Zip/Unzip Funktionaliät bieten. Und so eine möchte ich heute vorstellen, nämlich „SawZipNG“. Leider ist dieses geniale Projekt eingestellt worden, und der Entwickler auch nicht mehr erreichbar. Zum Glück hat sich noch eine Kopie der DLL und der Dokumentation auftreiben lassen, die ich im Downloadbereich zur Verfügung stellen werde.
Laden Sie sich die DLL aus dem Downloadbereich herunter, und führen Sie die Anwendung aus. Die DLL-Datei wird automatisch registriert.
Danach steht Ihnen die die Zip/Unzip Funktionalität zur Verfügung. Öffnen Sie Ihre Access Anwendung und den VBA-Editor, und wählen Sie unter Extra/Verweise den Eintrag SAWZIPNG aus. Im Folgenden Beispiel zeige ich Ihnen wie Sie z.B. eine zuvor erstellte PDF-Datei zippen bzw. ein Archiv unzippen können. Sehen Sie sich dazu auch die Dokumentation an (Downloadbereich).
Beispiel 1: Eine einzelne Datei Zippen
Public Sub CreateZIPSingle(ByVal cSourceFileName AS String, _ ByVal cZipFileName AS String, _ Optional ByVal bFullpath As Boolean = False, _ Optional ByVal cComment As String = "", _ Optional ByVal cPassword AS String = "") Dim objZipArchive As SAWZipNG.Archive Set objZipArchive = New SAWZipNG.Archive With objZipArchive .Create cZipFileName .Password = cPassword .AddFile cSourceFileName, bFullpath .Comment = cComment .Close End With Set objZipArchive = Nothing End Sub
Wichtig ist dass der Pfad zur neu erstellen Zip-Datei existiert, ggf. mit Dir() vorher abprüfen.
Weiterhin Interessant sind die Optionalen Parameter:
Setzt man bFullPath auf True dann wird im Zip-File der gesamte Verzeichnispfad abgebildet bis zur gezippten Datei.
Mit cComment kann man einen Kommentar in den Dateieigenschaften hinterlegen.
Ganz interessant ist der letzte Parameter cPassword. Damit kann man eine Zip-Datei mit einem Passwort schützen. Es ist aber zwingend dass im Code zuerst das Passwort gesetzt wird und dann Dateien mit AddFile in das Archiv eingefügt werden.
Möchte man mehrere Dateien in das Zip-Archiv einfügen, so schreibt man einfach mehrere AddFile() Anweisungen untereinander. Dann könnte man statt des cSourceFileName ein Array übergeben und in einer Schleife die Dokumente in das Archiv einfügen. Hier ein Beispiel dazu:
Beispiel 2: Eine mehrere Dateien in einem Array Zippen
Public Sub CreateZIPMulti(ByVal vSourceArrayName AS Variant, _ ByVal cZipFileName AS String, _ Optional ByVal bFullpath As Boolean = False, _ Optional ByVal cComment As String = "", _ Optional ByVal cPassword AS String = "") Dim i AS long Dim objZipArchive As SAWZipNG.Archive Set objZipArchive = New SAWZipNG.Archive With objZipArchive .Create cZipFileName .Password = cPassword For i = lbound(vSourceArrayName) to ubound(vSourceArrayName) .AddFile vSourceArrayName(i), bFullpath Next i .Comment = cComment .Close End With Set objZipArchive = Nothing End Sub
Der Aufruf könnte z.B. so aussehen:
Sub MultiZipTest() Dim FileArray As Variant FileArray = Array("c:\test\Dok1.pdf", "c:\test\Dok2.pdf", "c:\test\Dok3.pdf") CreateZIPMulti FileArray, "c:\Test\Dok1bis3.zip", false End sub
Beispiel 3: Ein ganzes Verzeichnis Zippen
Public Sub CreateZIPFolder(ByVal cSourceFolderName AS String, _ ByVal cZipFileName AS String, _ Optional ByVal bSubDirs As Boolean = False, Optional ByVal bFullpath As Boolean = False, _ Optional ByVal cComment As String = "", _ Optional ByVal cPassword AS String = "") Dim objZipArchive As SAWZipNG.Archive Set objZipArchive = New SAWZipNG.Archive With objZipArchive .Create cZipFileName .Password = cPassword .AddFolder cSourceFolderName, bSubDirs, bFullpath .Comment = cComment .Close End With Set objZipArchive = Nothing End Sub
Hier ist jetzt neu hinzugekommen der Parameter bSubDirs, wird dieser auf True gesetzt werden alle Unterverzeichnisse mit Dateien mit in das Archiv genommen.
Beispiel 4: zu Zippende Dateien im Archiv umbenennen
Manchmal kann es sinnvoll sein, dass man Dateien, die man Zippen will, im Zip-Archiv anderst benennen möchte. Dazu gibts die Methode .AddFileAs():
Public Sub CreateZIPSingleAs(ByVal cSourceFileName AS String, _ ByVal cTargetFileName AS String, _ ByVal cZipFileName AS String, _ Optional ByVal cComment As String = "", _ Optional ByVal cPassword AS String = "") Dim objZipArchive As SAWZipNG.Archive Set objZipArchive = New SAWZipNG.Archive With objZipArchive .Create cZipFileName .Password = cPassword .AddFileAs cSourceFileName, cTargetFileName .Comment = cComment .Close End With Set objZipArchive = Nothing End Sub
Bei dieser Methode gibt es den Parameter bFullpath nicht, siehe Dokumentation.
Im folgenden Artikel werde ich auf dieses Thema nochmal eingehen, und Beispiele zu Unzip bringen.
Bis dahin
© 2014 Andreas Vogt