VBAでzip圧縮ファイル内のファイル一覧を取得する場合、下記の手順を踏めば取得することができます。
- zipファイルを展開
- 展開したフォルダ内のファイル一覧を取得
- 展開したフォルダが不要であれば削除
ただ、zipファイルの内容一覧を取得したいだけのときは、圧縮ファイルの展開処理と展開したフォルダの削除が面倒です。
WindowsのShell32.dllライブラリを使用するとzipファイルを展開せずに、ファイルの一覧を取得することができます。
zip内のファイル一覧を取得するコード
読み取り対象のzipファイルの内容
下記のようなTestZip.zipを用意し「C:\vba-zip-test」に置きました。
1 2 3 4 5 6 7 8 9 10 11 |
TestZip.zip │ ├─SubFolder1 │ └─text1.txt │ └─text2.txt │ ├─SubFolder2 │ └─text3.txt │ └─text4.txt │ └─text5.txt |
zip内にファイルとフォルダが圧縮されているので、フォルダ内のファイルも読み取りつつ
text1.txtからtext5.txtまでの一覧をイミディエイトウィンドウに表示してみます。
zipファイルの内容を一覧表示するコード
下記のコードはzipファイルの内容を展開せずに、ファイル一覧を表示するコードです。
事前に参照設定で「Microsoft Shell Controls And Automation」を選択しておく必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Option Explicit Public Sub GetFilesInZip(zip_path As String) '以下の参照設定が必要 'Microsoft Shell Controls And Automation Dim objShell As New Shell32.Shell Dim objFolder As Shell32.Folder Set objFolder = objShell.Namespace(zip_path) Call GetFiles(objFolder) Set objShell = Nothing Set objFolder = Nothing End Sub Private Sub GetFiles(obj_folder As Shell32.Folder) Dim objFile As Shell32.FolderItem For Each objFile In obj_folder.Items If objFile.IsFolder Then 'フォルダであれば再帰処理 Call GetFiles(objFile.GetFolder) Else Debug.Print objFile.Name End If Next objFile Set objFile = Nothing End Sub Public Sub TestGetFilesInZip() Call GetFilesInZip("C:\vba-zip-test\TestZip.zip") End Sub |
TestGetFilesInZip()を実行すると「C:\vba-zip-test\TestZip.zip」のzipファイルを読み込み
zipファイル内のファイル一覧が表示されます。
1 2 3 4 5 |
text1.txt text2.txt text3.txt text4.txt text5.txt |
コメント