概要
GetFileListInZipは、指定したフォルダ内のファイル一覧を取得し、その中にZIPファイルがあればZIP内部のファイル一覧まで展開せずに取得するExcel VBA向けの汎用プロシージャです。
VBAだけでZIPの中身を安定して読むのは少し面倒です。そこでこの実装では、VBAから一時的にPowerShellを呼び出し、.NETのSystem.IO.Compression.ZipArchiveでZIPの内容を読み取ります。

戻り値は、1始まりの二次元配列です。
arr(1 To 件数, 1 To 2)
arr(i, 1) = フォルダパスまたはZIP内でのパス
arr(i, 2) = ファイル名
ZIPファイルの中にさらにZIPファイルが入っている場合も、最大10階層まで再帰的に中身を確認します。
使う場面
- 顧客や取引先から受け取ったZIP納品物の中身を確認したい
- ZIP内に必要なファイルが含まれているか自動チェックしたい
- バックアップZIPの構成を一覧化したい
- ZIPを実際に展開せず、ファイル名だけ確認したい
- ZIP内ZIPを含む複雑な圧縮ファイルの構成を調べたい
「ファイルを取り出す」のではなく、「何が入っているかを確認する」用途に向いています。
処理イメージ図
処理の大まかな流れは次の通りです。
- VBA側で対象フォルダを確認する
- 一時フォルダを作成する
- ZIP読み取り用のPowerShellスクリプトを一時生成する
- PowerShellから.NETの
ZipArchiveを使ってZIPを読む - 結果を
result.txtへUTF-8で出力する - VBA側で結果テキストを読み込む
- 1始まりの二次元配列へ変換する
- 最後に一時フォルダを削除する
VBA側で標準出力を直接受け取るのではなく、一時ファイルを介すことで、日本語ファイル名やエラー内容を扱いやすくしています。

使用例
下の例では、C:\Test配下のファイル一覧を取得し、ZIPの中身も含めてイミディエイトウィンドウへ出力します。
コードを読み込み中...戻り値がEmptyの場合は、対象になるファイルが見つからなかった状態として扱えます。
サンプルブック
実際の動きを確認できるマクロ有効ブックも用意しています。
GetFileListInZipサンプルブックをダウンロード
サンプルブックを開くときは、次の点に注意してください。
.xlsm形式のため、Excel側でマクロの有効化が必要です。- ダウンロード後は、保護ビューやブロック解除の確認が出る場合があります。
- Windows環境での利用を前提にしています。
- PowerShellの起動が社内ポリシーで制限されている環境では動かない場合があります。
- 実ファイルに対して試す前に、テスト用フォルダとテスト用ZIPで動作確認してください。
コピー可能な実装コード
コードを読み込み中...初心者向けコード解説
GetFileListInZip(ByVal FolderPath As String) As Variantは、対象フォルダのパスを受け取り、ファイル一覧を配列で返す関数です。関数なので、呼び出し元ではarr = GetFileListInZip("C:\Test")のように戻り値を受け取れます。
FileSystemObjectは、対象フォルダの存在確認、一時フォルダ作成、結果ファイルの確認、最後の一時フォルダ削除に使っています。
WScript.Shellは、PowerShellを非表示で実行するために使っています。コマンド文字列にはパスが含まれるため、F__QuoteCommandArgでダブルクォート囲みにして、空白入りパスでも壊れにくくしています。
PowerShell側では、System.IO.Compression.ZipArchiveを使ってZIPを読みます。ZIP内に.zip拡張子のファイルが見つかった場合は、メモリ上に読み込んでさらに中身を確認します。
結果の区切り文字にはChrW$(31)を使っています。通常のファイル名に入りにくい制御文字を区切りにすることで、フォルダパスとファイル名を安全に分割しやすくしています。
PowerShellから出した結果はresult.txtへUTF-8で保存し、VBA側ではADODB.StreamでUTF-8として読み込みます。これにより、日本語ファイル名を含むZIPでも扱いやすくなります。
最後に、取得した行をReDim arr(1 To rowCount, 1 To 2)で二次元配列へ詰め直しています。1列目にパス、2列目にファイル名が入るため、そのままシートへ出力しやすい形です。
注意点
- Windows PowerShellと.NETを使うため、基本的にWindows向けです。
- Mac版Excelではそのまま動きません。
- パスワード付きZIPや破損ZIPは中身を読めない場合があります。
- ZIP内ZIPは最大10階層まで読む設計です。
- ZIP内のファイルを実際に展開する処理ではありません。
- ファイル数が非常に多いZIPでは、処理時間やメモリ使用量が増えます。
- PowerShell実行が禁止されているPCでは利用できない場合があります。
- 公開用コードでは、元素材の戻り値代入と思われる1行を
GetFileListInZip = Emptyへ補正しています。
軽いまとめ
GetFileListInZipを使うと、VBAからZIPファイルの中身を展開せずに一覧化できます。
ZIP内ZIPまで再帰的に確認できるため、納品ファイル、バックアップ、添付ファイル一式の検査に使いやすい汎用プロシージャです。VBAだけで無理にZIP処理を抱え込まず、PowerShellと.NETの得意な部分を呼び出すことで、実務向けの安定したファイル確認処理にできます。
