VBAマクロで、外部から受け取ったZIPファイルの中にあるデータファイル(CSVやテキストファイルなど)を読み込んで処理したい、という場合があります。その際、手作業でZIPファイルを解凍するのではなく、VBAで解凍まで自動化できると非常にスマートです。
この記事では、前回のZIP作成の記事でも利用した**Shell.Application
オブジェクト**を使い、指定したZIPファイルの中身を、すべて特定のフォルダに解凍(展開)するためのVBAコードを解説します。
【重要】事前準備:参照設定
このマクロを実行するには、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Shell Controls And Automation」**にチェックを入れる必要があります。これにより、VBAでWindowsのシェル機能をスムーズに利用できるようになります。
完成したVBAコード
以下が、マクロブックと同じフォルダにある「Backup.zip」を、「UnzippedFiles」というフォルダに解凍するVBAコードです。「UnzippedFiles」フォルダが存在しない場合は、自動で作成されます。
'参照設定: Microsoft Shell Controls And Automation
Sub UnzipArchive()
' 変数を宣言します
Dim shellApp As New Shell32.Shell
Dim zipFile As Shell32.Folder
Dim destinationFolder As Shell32.Folder
Dim zipFilePath As String
Dim extractFolderPath As String
'--- 設定 ---
' 解凍したいZIPファイルのパス
zipFilePath = ThisWorkbook.Path & "\Backup.zip"
' 解凍先のフォルダパス
extractFolderPath = ThisWorkbook.Path & "\UnzippedFiles"
'--- 設定ここまで ---
' 解凍先フォルダが存在しない場合は作成
If Dir(extractFolderPath, vbDirectory) = "" Then
MkDir extractFolderPath
End If
'--- 1. ZIPファイルと解凍先フォルダをオブジェクトとして取得 ---
Set zipFile = shellApp.Namespace(zipFilePath)
Set destinationFolder = shellApp.Namespace(extractFolderPath)
'--- 2. ZIPファイルの中身を、指定したフォルダにコピー(解凍) ---
' 引数に「20」を指定すると、確認メッセージなしで上書き実行
destinationFolder.CopyHere zipFile.Items, 20
MsgBox "ZIPファイルの解凍が完了しました。"
' オブジェクトを解放
Set destinationFolder = Nothing
Set zipFile = Nothing
Set shellApp = Nothing
End Sub
コードのポイント解説
① Namespace
メソッドでフォルダを取得
Set zipFile = shellApp.Namespace(zipFilePath)
Set destinationFolder = shellApp.Namespace(extractFolderPath)
Shell.Application
オブジェクトの.Namespace
メソッドは、通常のフォルダだけでなく、ZIPファイルも「フォルダ」の一種としてVBAで扱えるオブジェクトに変換してくれます。ここでは、解凍元のZIPファイルと、解凍先のフォルダをそれぞれオブジェクトとして取得しています。
② .CopyHere
メソッドで解凍を実行
destinationFolder.CopyHere zipFile.Items, 20
これが、ファイルの解凍を実行する中心的な命令です。構文は以下のようになっています。
[解凍先フォルダ].CopyHere [解凍したいアイテム], [オプション]
zipFile.Items
: 解凍したいアイテムを指定します。zipFile
(ZIPファイル)の中の.Items
(すべてのアイテム)を指定することで、ZIPファイルの中身を丸ごと対象にしています。20
: コピー(解凍)時の動作を指定するオプションです。ここでは20
を指定していますが、これは4 + 16
を意味します。4
: 処理の進捗ダイアログを表示しない。16
: 同名のファイルが存在する場合、**確認メッセージなしで「すべて上書き」**する。
このオプション20
を指定することで、完全にサイレントな(ユーザーに応答を求めない)自動解凍処理が実現できます。
まとめ
Shell.Application
オブジェクトを利用したZIPファイルの解凍手順は、以下の通りです。
- (推奨)**「Microsoft Shell Controls And Automation」**を参照設定する。
Shell.Application
オブジェクトを生成する。.Namespace
メソッドで、解凍元のZIPファイルと解凍先のフォルダをそれぞれオブジェクトとして取得する。[解凍先フォルダ].CopyHere [解凍元ZIPの中身]
を実行する。- (推奨)オプションに**
20
**を指定し、確認メッセージを非表示にする。
このテクニックを使えば、例えば毎日送られてくるZIP形式の報告書を、マクロで自動的に解凍して、その中のデータを読み込んで集計する、といった一連のプロセスを完全に自動化することが可能になります。