「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





















この記事へのコメントはありません。