「7-Zip VBA」といったキーワード検索でのアクセスがありました。
恐らく「圧縮・解凍ソフト 7-Zip」を使って、ファイルの圧縮や解凍を行うマクロを探している方だろうと思います。
以前下記記事でShellを使ったZIP圧縮・解凍を行うマクロを紹介しましたが、動作はサポート外となっているため、今回改めて7-Zipを使った圧縮・解凍マクロを考えてみたいと思います。
準備する物
統合アーカイバ・プロジェクトで公開されている「7-ZIP32.DLL」を使うこともできるのですが、今回はインストール不要、EXEファイル一つで使えるコマンドライン版(7za.exe)を使用します。
上記ダウンロードページからコマンドライン版をダウンロードして、適当なフォルダに解凍します。
ただし、元のファイルが「7z」ファイルになっているため、7z形式に対応した解凍ソフトを導入していない場合は、先に7-Zip本体をインストールしておく必要があります。
VBAコード
※ 7za.exeファイルのパスは必要に応じて変更してください。
Option Explicit Private Const SevenZipFilePath As String = "C:\7zip\7za.exe" Public Sub ArchiveSample() '[C:\Test\PDF]フォルダをパスワード付zip形式(AES-256)で圧縮 ArcFileOrFolder "C:\Test\PDF", "zip", "C:\7zip", "pass", True MsgBox "処理が終了しました。", vbInformation + vbSystemModal End Sub Public Sub ExtractSample() '[C:\Test\PDF.zip]ファイルを解凍 ExtractArchive "C:\Test\PDF.zip", "C:\7zip", "pass" MsgBox "処理が終了しました。", vbInformation + vbSystemModal End Sub Public Sub ArcFileOrFolder(ByVal SrcPath As String, _ Optional ByVal ArcExtension As String = "zip", _ Optional ByVal DestFolderPath As String = "", _ Optional ByVal ArcPassWord As String = "", _ Optional ByVal EncMethodAES256 As Boolean = True) 'ファイル・フォルダを7-Zipで圧縮 ' - SrcPath:元ファイル・フォルダ ' - ArcExtension:圧縮ファイルの拡張子 ' - DestFolderPath:出力先、指定しない場合は元ファイル・フォルダと同じ場所 ' - ArcPassWord:圧縮ファイルのパスワード ' - EncMethodAES256:AES-256による暗号化(zip形式のみ) Dim DestFilePath As String Dim com As String 'ファイル・フォルダの存在判定 If (IsFolder(SrcPath) = False) And (IsFile(SrcPath) = False) Then Exit Sub '圧縮ファイルの拡張子設定 ArcExtension = LCase(ArcExtension) Select Case ArcExtension Case "zip", "7z", "tar" Case Else: ArcExtension = "zip" End Select With CreateObject("Scripting.FileSystemObject") If IsFolder(DestFolderPath) = False Then If IsFolder(SrcPath) = True Then DestFolderPath = SrcPath ElseIf IsFile(SrcPath) = True Then DestFolderPath = .GetFile(SrcPath).ParentFolder.Path End If End If DestFilePath = AddPathSeparator(DestFolderPath) & _ .GetBaseName(SrcPath) & "." & ArcExtension End With com = ChrW(34) & SevenZipFilePath & ChrW(34) & _ " a " & ChrW(34) & DestFilePath & ChrW(34) & " " & ChrW(34) & SrcPath & ChrW(34) If Len(Trim(ArcPassWord)) > 0 Then com = com & " -p" & ArcPassWord Select Case ArcExtension Case "zip": If EncMethodAES256 = True Then com = com & " -mem=AES256" End Select End If 'Debug.Print com '確認用 CreateObject("WScript.Shell").Run com, 1, True End Sub Public Sub ExtractArchive(ByVal SrcPath As String, _ Optional ByVal DestFolderPath As String = "", _ Optional ByVal ArcPassWord As String = "") '圧縮ファイルを7-Zipで解凍 ' - SrcPath:元ファイル ' - DestFolderPath:出力先、指定しない場合は元ファイルと同じ場所 ' - ArcPassWord:圧縮ファイルのパスワード Dim com As String 'ファイルの存在判定 If IsFile(SrcPath) = False Then Exit Sub With CreateObject("Scripting.FileSystemObject") '圧縮ファイルの拡張子判定 Select Case LCase(.GetExtensionName(SrcPath)) Case "zip", "7z", "tar" Case Else: Exit Sub End Select If IsFolder(DestFolderPath) = False Then DestFolderPath = .GetFile(SrcPath).ParentFolder.Path End If End With com = ChrW(34) & SevenZipFilePath & ChrW(34) & _ " x " & ChrW(34) & SrcPath & ChrW(34) & _ " -o" & ChrW(34) & DestFolderPath & ChrW(34) & _ " -aoa" 'ファイル上書き If Len(Trim(ArcPassWord)) > 0 Then com = com & " -p" & ArcPassWord 'Debug.Print com '確認用 CreateObject("WScript.Shell").Run com, 1, True End Sub Private Function IsFolder(ByVal SrcPath As String) As Boolean IsFolder = CreateObject("Scripting.FileSystemObject").FolderExists(SrcPath) End Function Private Function IsFile(ByVal SrcPath As String) As Boolean IsFile = CreateObject("Scripting.FileSystemObject").FileExists(SrcPath) End Function Private Function AddPathSeparator(ByVal SrcPath As String) As String If Right(SrcPath, 1) <> ChrW(92) Then SrcPath = SrcPath & ChrW(92) AddPathSeparator = SrcPath End Function
引数の説明はコード中に記載している通りで、パスワードや暗号化方式を指定して圧縮・解凍できるようにしています。
使用しているコマンド・スイッチ
上記マクロでは、下記のコマンドラインオプションを使用して圧縮・解凍を行っています。
- a:アーカイブにファイルを追加します。ファイル・フォルダ圧縮。
- x:パス名付きでファイルを解凍します。
- -p{Password}:パスワードを指定します。
- -m{Parameters}:圧縮方法を指定します。「em」パラメーターで暗号化方式を指定できます([-mem=AES256]でAES-256による暗号化)。
- -o{Directory}:出力先を指定します。
- -ao{a|s|t|u}:上書きモードを指定します。[-aoa]で既存ファイルをすべて上書きします。
より詳細な説明は下記ページに記載されています。
- Command Line Version User’s Guide
- https://sevenzip.osdn.jp/chm/cmdline/
- インストールしないでzipや7z圧縮ファイルを作る方法
- https://sevenzip.osdn.jp/howto/non-install-compress.html
7za.exeと7z.exeの違い
通常版の7-Zipには、GUIの「7-Zip File Manager」の他にコマンドライン版の「7z.exe」ファイルが含まれています。
7z.exeは7z.dllと実行することで、File Manegerと同等の機能を呼び出すことができ、それに対し「7za.exe」は、機能が制限されますが、ファイル単体で主要な機能を実行することができます。
参考Webページ
- インストール不要のZIP、7z、RARファイルの解凍方法
- https://sevenzip.osdn.jp/howto/non-install-extract.html
- 7-Zip – Browse Files at SourceForge.net
- https://sourceforge.net/projects/sevenzip/files/
- 7-Zip – Wikipedia
- https://ja.wikipedia.org/wiki/7-Zip
この記事へのコメントはありません。