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