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ファイルは検知できませんのでご注意ください。