和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ZIPファイルをマクロで解凍する

ZIPファイルをマクロで解凍する方法を解説します。

ZIPファイルを解凍するPowerShellをVBAから呼ぶのが一番簡単です。

ソースコード

Function Zipファイルを解凍する(PathZipファイル As String, Path解凍先フォルダ As String) As Boolean
    
    PathZipファイル = "C:\Users\wfsp\Desktop\対象フォルダ.zip"
    Path解凍先フォルダ = "C:\Users\wfsp\Desktop\対象フォルダ1"
    
    Dim powerShellコマンド As String
    powerShellコマンド = "powershell -NoProfile -ExecutionPolicy Unrestricted Expand-Archive" & _
        " -Path " & PathZipファイル & _
        " -DestinationPath " & Path解凍先フォルダ & " -Force"
    
    Dim Shellオブジェクト As Object
    Set Shellオブジェクト = CreateObject("WScript.Shell")
    
    Dim res解答結果 As Long
    res解答結果 = Shellオブジェクト.Run(powerShellコマンド, 0, True)
    
    Zipファイルを解凍する = (res解答結果 = 0)
    
End Function

解説

VBAでZIPファイルを解凍する方法はいくつかありますが、
PowerShellをVBAから呼ぶのが一番簡単です。

WScript.ShellオブジェクトのRunメソッドを使用して、
第1引数にPowerShellコマンドを渡すだけで実行してくれます。


Runメソッドの第2引数はWindowStyleで、
0を渡しているためPowerShellの画面を開かずに実行します。

Runメソッドの第3引数はWaitOnReturnで、
Trueを指定したため「解凍が終わるまで次の行を実行しない」設定になります。


あとはPowerShellのコマンドですが、こちらはZipを解凍する標準的なコマンドです。

最後に-Forceを指定しているため、同名ファイルがあれば上書きして解凍します。


上記ソースコードは関数化していますので、
このあたりを理解しなくても、中身を読まずにCallしてもらって構いません。

Call Zipファイルを解凍する("C:\Users\wfsp\Desktop\対象フォルダ.zip" _
                                 , "C:\Users\wfsp\Desktop\対象フォルダ")

 

フォルダ内のZIPファイルを一括で解凍する

フォルダ内のZIPファイルを一括で解凍するには、
先ほどの関数を利用して以下のコードを実行します。

Sub 指定フォルダ内のZipファイルを一括で解凍する()

    Dim FSO As New FileSystemObject

    Dim 親フォルダ As Folder
    Set 親フォルダ = FSO.GetFolder("C:\Users\wfsp\Desktop\Zipファイル集")
        
    Dim ファイル As File
    For Each ファイル In 親フォルダ.Files
        
        If LCase(ファイル.Name) Like "*.zip" Then
            Call Zipファイルを解凍する(ファイル.Path, Replace(ファイル.Path, ".zip", ""))
        End If

    Next
    
End Sub

メインコードは関数のCall一行になっているため簡単ですね。

ファイルの一覧をループして、
"○○.zip"という名前のファイルに前述のコードを実行しています。


FileSystemObjectを使用するコードですので、
Scripting Runtimeを参照設定して使用してください。


ちなみに誤認しやすいポイントですが、ZIPファイルは「ファイル」ですので、
Filesコレクションをループしなければいけません。


解凍後はフォルダになるためたまにうっかりしてしまいますが、
SubFoldersをループしてもZIPファイルは検知できませんのでご注意ください。