Zippen und Unzippen aus Access heraus Teil 1

By , 6. März 2014

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

OfficeFolders theme by Themocracy