メインコンテンツへスキップ
【VBA】zip内のファイル一覧を展開せずに取得する

【VBA】zip内のファイル一覧を展開せずに取得する

·2 分
Programming VBA
かずさプログラマー
著者
かずさプログラマー
業務の作業自動化を行っています。Go、VBA、Pythonを主に使用しています。過去にはC#、VB.Net、JavaScriptも使用していました。
目次

VBAでzip圧縮ファイル内のファイル一覧を取得する場合、下記の手順を踏めば取得することができます。

  1. zipファイルを展開
  2. 展開したフォルダ内のファイル一覧を取得
  3. 展開したフォルダが不要であれば削除

ただ、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

関連記事

【VBA】画像の幅と高さを取得する
··2 分
Programming VBA
【VBA】文字列が指定された文字列で始まる、または終わるか確認する(StartsWith,EndsWith)
··2 分
Programming VBA
【VBA】Backlog APIで課題を操作する
··8 分
Programming VBA Backlog