zipファイルを展開(7-zipのexeファイルによる展開)

zipファイルを展開する。(7-zipのexeファイルによる展開)

VBAを利用してzip形式のファイルを展開(解凍)するには7-zipの実行ファイル(7z.exe)をコマンドで実行することでzipファイルを展開することができます。
※7z.exeを利用して展開させるには、7-zipのソフトウェアをPCにインストールしておく必要があります。7-zipの入手、インストールの実施はご自身で対応をお願いします。(ダウンロードしてインストーラのexeを実行するだけです。)

また7-zipのコマンドのパラメータを利用すればパスワード設定されたzipファイルも展開できます。
7zipのコマンドで利用できるパラメータは他にも多々あるので用途に応じたパラメータを設定することもできます。

 ●zipファイルを展開(解凍)

'*****************************************************************
' zip展開処理(7z.exe)
'*****************************************************************
Sub unZip_7zExe()
    
    '7z.exeのパスを指定 (パスにスペースが含まれているため""を含めた文字列に変換)
    Dim s7zExePath As String
    s7zExePath = setDQ("C:\Program Files\7-Zip\7z.exe")
    
    '展開するzipファイルのパス
    Dim sZipPath As String
    sZipPath = "C:\VBA\archive\ZipTest_7zExe.zip"
    
    '展開先のフォルダの指定
    Dim sExtractFolder As String
    sExtractFolder = "C:\VBA\archive_unzip\"
    
    'パスワード設定
    Dim sPassword As String
    sPassword = "pass123"
    
    '展開処理
    Dim lRtn As Long
    lRtn = unZip_7zExeCmd(s7zExePath, sZipPath, sExtractFolder, sPassword)
     
    'パスワード設定が不要であれば下記を使用
    'lRtn = unZip_7zExeCmd(s7zExePath, sZipPath, sExtractFolder)
     
    If lRtn = 0 Then
        MsgBox "完了"
    Else
        MsgBox "展開処理でエラーが発生しました。"
    End If
    
End Sub

'*****************************************************************
' コマンドの作成と実行
'-----------------------------------------------------------------
'  第1引数:7zipの実行ファイル(7z.exe)のパス
'  第2引数:展開するzipファイルのパス
'  第3引数:展開先フォルダ
'  第4引数:パスワード
'-----------------------------------------------------------------
'  戻り値 :実行結果(0:正常終了、0以外:異常終了)
'*****************************************************************
Public Function unZip_7zExeCmd(get7zExe As String, getZipPath As String, getExtract As String, Optional getPassword As String = "") As Long
    
    'FileSystemObjectの作成
    Dim oFSO As Object
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    
    '展開先フォルダの確認
    Dim sDstPath As String
    If Not (oFSO.FolderExists(getExtract)) Then
        'フォルダが無ければzipファイルのあるフォルダを展開先に指定
        sDstPath = oFSO.GetFile(getZipPath).ParentFolder.Path
    Else
        sDstPath = getExtract
    End If
    
    
    'コマンドの作成
    Dim sCmd As String
    '設定してるパラメータは下記になります。
    ' x    展開する
    ' -o   展開先を指定
    ' -aoa 既存ファイルをすべて上書き
    sCmd = get7zExe & Space(1) & "x" & Space(1) & "-o" & setDQ(sDstPath) & Space(1) & "-aoa" & Space(1)
    
    'パスワード指定があればパスワード設定ありのコマンドにする
    '※パスワードが設定されていないzipに対して-pを指定しても展開はできます。
    If getPassword <> "" Then
        'コマンドの作成(パスワード設定の追加)
        sCmd = sCmd & "-p" & getPassword & Space(1)
    End If
    
    '展開するファイルをコマンドに追加
    sCmd = sCmd & setDQ(getZipPath)


    'WScript.Shellオブジェクトの作成
    Dim oWSh As Object
    Set oWSh = CreateObject("WScript.Shell")
    
    '展開の実行
    Dim lRtn As Long
    'WindowStyle:=0(バックグランド処理)にしていないのはパスワードが掛かっているファイルにパスワードの"-p"を使用していない場合、処理がパスワードの入力待ち状態となり止まってしまうから。1にしておけば入力待ちの画面が表示されます。
    lRtn = oWSh.Run(Command:=sCmd, WindowStyle:=1, WaitOnReturn:=True)
    
    unZip_7zExeCmd = lRtn

    Set oWSh = Nothing
    
End Function

'*****************************************************************
' 'ダブルクォーテーション設定
'-----------------------------------------------------------------
'  第1引数:文字列
'-----------------------------------------------------------------
'  戻り値 :文字列の前後に"を設定した状態の文字列
'*****************************************************************
Function setDQ(ByVal getStr As String) As String
    
    setDQ = """" & Replace(getStr, """", """""") & """"

End Function

 ■実行結果

展開するzipファイルの中身
展開後の状態