VBAでzip圧縮ファイル内のファイル一覧を取得する場合、下記の手順を踏めば取得することができます。
- zipファイルを展開
- 展開したフォルダ内のファイル一覧を取得
- 展開したフォルダが不要であれば削除
ただ、zipファイル内のファイル一覧だけを取得したい時は、圧縮ファイルの展開処理と展開したフォルダの削除が面倒です。
WindowsのShell32.dllライブラリを使用すると、zipファイルを展開せずにファイルの一覧を取得することができます。
zip内のファイル一覧を取得するコード #
読み取り対象のzipファイルの内容 #
下記のようなTestZip.zipを用意しC:\vba-zip-test
に置きました。
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」を選択しておく必要があります。
VBAで参照設定を行う
·1 分
Programming
VBA
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ファイル内のファイル一覧が表示されます。
text1.txt
text2.txt
text3.txt
text4.txt
text5.txt