はじめに

VBAでは、ファイル操作やデータ処理を自動化することが多いですが、ZIPファイルを解凍せずに中身を確認したい場面もあります。

たとえば、定期的に届くZIPファイルの中にどんなファイルが入っているかを一覧で確認したい場合や、展開前にファイル名をチェックしたい場合などです。

この記事では、VBAからPowerShellを使ってZIPファイル内のファイル一覧を取得し、テキストファイルに出力する方法を解説します。解凍不要で高速に処理できます。

ZIPの中身を確認する3つの方法

VBAでZIPファイルの内容を取得する方法は主に3つあります。

  1. PowerShellで一覧取得
    メリット:Windows標準機能で追加インストール不要
    デメリット:階層構造の取得がやや複雑
  2. Shell.Application.NameSpaceを使用
    メリット:VBAのみで完結
    デメリット:処理が遅い、大きなZIPで不安定、Windows 10以降では非推奨
  3. 7-Zipのコマンドラインで一覧取得
    メリット:高速で詳細情報も取得可能、パスワード付きZIPにも対応
    デメリット:7-Zipのインストールが必要

この記事では、最も汎用性の高いPowerShell方式を中心に解説します。Windows 7以降であれば標準で動作します。

事前準備:参照設定

VBAからPowerShellを呼び出すには、Windows Script Host Object Modelの参照設定が必要です。なお以下のサンプルコードではFileSystemObjectも利用しているため、同じ参照設定でまとめて有効にします。

設定手順:

  1. VBAエディタを開く(Alt + F11)
  2. メニューバーから「ツール」→「参照設定」を選択
  3. 「Windows Script Host Object Model」にチェックを入れる
  4. 「Microsoft Scripting Runtime」にチェックを入れる(FileSystemObject用)
  5. OKをクリック

なお、参照設定を行わず、CreateObject関数を使う場合は以下のように記述します。

参照設定を使う方が、コード補完(IntelliSense)が効くため開発効率が良くなります。

ZIP内の全てのファイルパスを取得する関数(GetZipFileList)

以下の関数は引数で渡されたZIPファイルパスに格納されている全てのファイルパスを取得して配列で返します。

ZIPファイル内のファイル取得には、PowerShellの.NET Frameworkクラスを利用しています。

コードの解説

PowerShellコマンドの内容:

  • Add-Type -AssemblyName System.IO.Compression.FileSystem:.NET FrameworkのZIP操作クラスを読み込み
  • ZipFile::OpenRead():ZIPファイルを読み取り専用で開く
  • Entries.FullName:ZIP内の各ファイルのフルパス(フォルダ構造を含む)を取得

戻り値:ファイル名の配列を返します。ZIP内にファイルがない場合は空の配列を返します。

ZIP内のフォルダについて:
ZIP内にフォルダが含まれる場合、フォルダ自体もパスの一部として返されます(末尾が/付与)。

使用例

ZIPファイルパスをGetZipFileList関数に渡し、その結果のファイルパスリストをZIPファイルと同じフォルダのresult.txtに出力するサンプルです。

出力例(result.txt の内容)
data/subfolder/test.xlsx
sample1.csv
sample2.txt

文字コードはANSI(Shift-JIS)で出力しています。Unicodeにしたい場合はfso.CreateTextFileの第3引数をTrueに変更します。
Set ts = fso.CreateTextFile(outputPath, True, False)

Set ts = fso.CreateTextFile(outputPath, True, True)

既に result.txt が存在する場合は上書きされます。

追記にしたい場合は CreateTextFile の代わりに OpenTextFile(…, 8) を使用してください。

よくあるエラーと対処法

エラー1:「ZipFile型が見つかりません」

原因:

  • .NET Framework 4.5以降が必要です。古いWindowsではSystem.IO.Compression.FileSystemが利用できません。

対処法:

  • Windows 7の場合:.NET Framework 4.5以降をインストール
  • Windows 10/11:標準で対応済み

エラー2:日本語ファイル名が文字化け

原因:

  • PowerShellの出力エンコーディングがデフォルトでShift-JISのため、UTF-8のZIPでは文字化けする可能性があります。

対処法:

  • PowerShellコマンドの冒頭にエンコーディング設定を追加します。

エラー3:「パスが見つかりません」

原因:

  • 指定したZIPファイルが存在しないか、パスに誤りがあります。

対処法:

  • 事前にFileSystemObjectのFileExistsメソッドで存在確認を行います(使用例で実装済み)。

エラー4:空の配列が返される

原因:

  • ZIPファイルが破損している
  • 中身が実際に空
  • パスワード保護されている(この方法では開けない)

対処法:

  • 手動でZIPを開けるか確認
  • パスワード付きZIPの場合は7-Zipを使用(別記事参照)