【Excel VBA】ZIPファイルをマクロで解凍する方法|複数ファイルの一括解凍にも対応
こんにちは。
今回は、Excel VBAからZIPファイルを解凍する方法についてご紹介します。
VBAだけでZIPファイルを扱うのではなく、Windowsに標準搭載されているPowerShellの Expand-Archive を使用します。
さらに後半では、指定したフォルダ内にあるZIPファイルをまとめて一括解凍する方法もご紹介します。
この記事はこんな人におすすめ
この記事はこんな人におすすめです。
- VBAでZIPファイルを解凍したい人
- 複数のZIPファイルを一括処理したい人
- ファイル操作を自動化したい人
- 業務効率化ツールを作りたい人
といったところでしょうか。
VBAでZIPファイルを解凍する仕組み
今回はVBAからPowerShellを呼び出します。
PowerShellには、
Expand-Archive
というZIPファイルを解凍するコマンドがあります。
処理の流れは以下になります。
VBA
↓
PowerShellを起動
↓
Expand-Archiveを実行
↓
ZIPファイルを解凍
それでは実際にコードを見てみましょう。
ZIPファイルを1つ解凍する
まずは、指定したZIPファイルを1つ解凍するコードです。
Function ExtractZipFile( _
ByVal zipFilePath As String, _
ByVal outputFolderPath As String _
) As Boolean
Dim command As String
Dim shell As Object
Dim exitCode As Long
command = "powershell.exe -NoProfile -ExecutionPolicy Bypass " & _
"-Command ""Expand-Archive " & _
"-LiteralPath '" & zipFilePath & "' " & _
"-DestinationPath '" & outputFolderPath & "' " & _
"-Force"""
Set shell = CreateObject("WScript.Shell")
exitCode = shell.Run(command, 0, True)
ExtractZipFile = (exitCode = 0)
Set shell = Nothing
End Function
ZIPファイルのパスと解凍先フォルダを指定して、PowerShellに処理を実行させています。
ZIPファイルを解凍してみる
呼び出す側のコードはこちらです。
Sub ZIPファイル解凍テスト()
Dim zipPath As String
Dim outputPath As String
zipPath = "C:\work\sample.zip"
outputPath = "C:\work\sample"
If ExtractZipFile(zipPath, outputPath) Then
MsgBox "ZIPファイルの解凍が完了しました。", vbInformation
Else
MsgBox "ZIPファイルの解凍に失敗しました。", vbExclamation
End If
End Sub
実行すると、
C:\work\sample.zip
の内容が、
C:\work\sample
へ解凍されます。
※ここに実行前・実行後の画像を掲載
ソースコードのポイント
Expand-Archive
Expand-Archive
PowerShellでZIPファイルを解凍するためのコマンドです。
解凍するZIPファイル
-LiteralPath
ここで解凍対象のZIPファイルを指定します。
解凍先フォルダ
-DestinationPath
ここで解凍先を指定します。
既存ファイルを上書きする
-Force
同名ファイルが存在した場合でも上書きして処理します。
VBAからPowerShellを実行する
PowerShellの実行には WScript.Shell を使用します。
Set shell = CreateObject("WScript.Shell")
実際にコマンドを実行しているのはこちらです。
exitCode = shell.Run(command, 0, True)
第2引数を 0 にしているため、PowerShellの画面は表示されません。
また、第3引数を True にしているため、解凍が完了するまでVBA側の処理を待機します。
解凍結果を取得する
ExtractZipFile = (exitCode = 0)
PowerShellが正常終了した場合は 0 が返されます。
そのため、
0 → True
0以外 → False
として解凍結果を取得しています。
フォルダ内のZIPファイルを一括解凍する
次は、指定したフォルダ内にあるZIPファイルをまとめて解凍します。
Sub ExtractAllZipFiles()
Dim targetFolderPath As String
Dim fso As Object
Dim targetFolder As Object
Dim targetFile As Object
Dim outputFolderPath As String
targetFolderPath = "C:\work\ZipFiles"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(targetFolderPath) Then
MsgBox "指定したフォルダが見つかりません。", vbExclamation
Exit Sub
End If
Set targetFolder = fso.GetFolder(targetFolderPath)
For Each targetFile In targetFolder.Files
If LCase(fso.GetExtensionName(targetFile.Name)) = "zip" Then
outputFolderPath = fso.BuildPath( _
targetFolderPath, _
fso.GetBaseName(targetFile.Name) _
)
Call ExtractZipFile(targetFile.Path, outputFolderPath)
End If
Next targetFile
Set targetFile = Nothing
Set targetFolder = Nothing
Set fso = Nothing
MsgBox "ZIPファイルの解凍処理が完了しました。", vbInformation
End Sub
一括解凍コードのポイント
FileSystemObjectを使用する
Set fso = CreateObject("Scripting.FileSystemObject")
今回は参照設定を変更せずに使える方法にしています。
ZIPファイルだけを対象にする
If LCase(fso.GetExtensionName(targetFile.Name)) = "zip" Then
フォルダ内に他のファイルがあっても、ZIPファイルだけを処理します。
ZIPファイル名を解凍先フォルダ名にする
outputFolderPath = fso.BuildPath( _
targetFolderPath, _
fso.GetBaseName(targetFile.Name) _
)
例えば、
売上データ.zip
であれば、
売上データ
というフォルダへ解凍されます。
ZIPファイルの解凍は業務自動化にも使える
この処理は単体でも使えますが、他の処理と組み合わせるとより便利です。
例えば、
ZIPファイルをダウンロード
↓
自動で解凍
↓
CSVを開く
↓
Excelへ取り込む
といった処理も可能になります。
こういった小さな処理を組み合わせることで、VBAによる業務自動化の幅も広がります。
最後に
いかがでしたでしょうか。
今回は、Excel VBAからPowerShellを使用してZIPファイルを解凍する方法についてご紹介しました。
1つのZIPファイルを解凍するだけでなく、フォルダ内のZIPファイルをまとめて処理することもできます。
それほど難しい処理ではありませんので、ぜひ今後のVBAツール開発や業務効率化に活用してみてください。
少しでも参考になればと思います。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
