【Excel VBA】ZIPファイルを指定したフォルダに解凍(展開)する方法

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ファイルの解凍手順は、以下の通りです。

  1. (推奨)**「Microsoft Shell Controls And Automation」**を参照設定する。
  2. Shell.Applicationオブジェクトを生成する。
  3. .Namespaceメソッドで、解凍元のZIPファイル解凍先のフォルダをそれぞれオブジェクトとして取得する。
  4. [解凍先フォルダ].CopyHere [解凍元ZIPの中身] を実行する。
  5. (推奨)オプションに**20**を指定し、確認メッセージを非表示にする。

このテクニックを使えば、例えば毎日送られてくるZIP形式の報告書を、マクロで自動的に解凍して、その中のデータを読み込んで集計する、といった一連のプロセスを完全に自動化することが可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次