【EXCEL:VBA】指定したフォルダに存在するファイル一覧を取得したい

指定したフォルダに存在するファイル一覧を取得する

この記事では、指定したフォルダに存在するファイル一覧を作成する方法について説明します。

 

ファイル一覧は以下の情報をついでに取得することができます。

  • ファイル名
  • 更新日時
  • 種類
  • サイズ

 

しかも、フォルダパスを変えて実行すれば、そのフォルダに存在するファイル一覧を取得できます。

 

1つ1つファイルの情報を調べればできますが、ボタン1つで一瞬でファイル一覧を簡単に作成します。

 

 

それでは、EXCELで指定したフォルダに存在するファイル一覧を作成していきましょう。

 

困っている女性

フォルダに存在するファイル名一覧を作るのが大変なの・・・、わかる!?
今は、どうやっているの?

解決する男性

困っている女性

それは、ファイル1つ1つの名前をコピーして、貼り付けている。

困っている女性

たまに、大量にファイルがあると、1つ2つもれてしまうわ・・・。
それなら、VBAを使えばボタン1つ押すだけで、ファイル名や更新日時、サイズも取得することができるよ。

解決する男性

困っている女性

それそれ、早く教えてよ。

 

似たような機能で、ファイル一覧を取得し、一気にファイル名を変更機能については、以下の記事で説明しています。

【EXCEL:VBA】指定したフォルダに存在するファイル名を変更したい

 

ファイル一覧作成ツールに必要なものを、1つ1つ順番に説明していきます。

1.フォルダ指定欄、ファイル一覧欄を準備する

まず、フォルダを指定する欄と取得したファイル一覧を書き込む欄を作成します。

「ファイル一覧取得」シートを作成する

ファイル一覧取得シートを作成する

ファイル一覧取得シートを作成する

 

  1. 「ファイル一覧取得」という名前のシートを作成します。
  2. 1行目に「フォルダパス」のタイトル行を作成します。
  3. 2行目に「フォルダパス」を入力する欄を作成します。
  4. 3行目に「ファイル一覧」というタイトル行を作成します。
  5. 4行目に「NO」、「ファイル名」、「更新日時」、「種類」、「サイズ」のタイトル行を作成します。
  6. 5行目以降は、取得したファイル一覧を書き込む欄になります。

 

5行目以降のファイル一覧情報は、VBAを使って書き込みます。

 

2.VBAでファイル一覧を取得する機能を記入する

「Microsoft Visual Basic for Applications」を起動します。

VBAプログラムを記入する

VBAプログラムを記入する

 

標準モジュールを追加して、以下のソースを書きます。

Public Sub MainProc()
    Dim sht As Worksheet
    Dim fso As Object
    Dim f As Object
    Dim nowRow As Long
    
    '①参照するシートを変数に格納する
    Set sht = ThisWorkbook.Sheets("ファイル一覧取得")
    
    '②セルの値をクリアする
    sht.Range("A5:E10000").ClearContents
    
    '③FileSystemObjectを変数に格納する
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    nowRow = 4
    
    For Each f In fso.GetFolder(sht.Range("A2")).Files
    
        '④現在行を次の行に変更する
        nowRow = nowRow + 1
    
        '⑤NOをセットする
        sht.Range("A" & nowRow) = nowRow - 4
    
        '⑥ファイル名をセットする
        sht.Range("B" & nowRow) = f.Name
        
        '⑦日付時刻をセットする
        sht.Range("C" & nowRow) = f.DateLastModified
        
        '⑧種類をセットする
        sht.Range("D" & nowRow) = f.Type
        
        '⑨サイズをセットする
        sht.Range("E" & nowRow) = f.Size

    Next
        
    '⑩FileSystemObjectをクリアする
    Set fso = Nothing
    
    MsgBox "完了"
End Sub

 

最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。

 

3.ファイル一覧を取得する機能の使い方

それでは、フォルダを指定して、ファイル一覧を取得する方法を説明します。

 

まず、A2セルにフォルダパスを入力します。

マクロを実行する

マクロを実行する

次に、「開発」タブの「マクロ」をクリックします。

 

実行ボタンをクリックする

実行ボタンをクリックする

 

先程作成した自作関数「MainProc」が一覧に表示されていますので、選択します。

次に、「実行」ボタンをクリックしてファイル一覧を作成します。

 

しばらく待つと、指定したフォルダに存在するファイル一覧が5行目以降に作成されます。

ファイル一覧を取得した結果

ファイル一覧を取得した結果

 

指定したフォルダには、6つファイルが存在しており、各ファイルの「ファイル名」、「更新日時」、「種類」、「サイズ」が5行目以降に書き込みされました。

指定フォルダの中身

指定フォルダの中身

 

4.ファイル一覧を取得するVBAプログラムの説明

それでは、VBAプログラムを説明します。

①参照するシートを変数に格納する

'①参照するシートを変数に格納する
Set sht = ThisWorkbook.Sheets("ファイル一覧取得")

ここでは、このあとの処理で何度も使う「ファイル一覧取得」シートを変数に格納しています。

そうすることにより、入力するプログラムを短くすることができるからです。

何度も「ThisWorkbook.Sheets(“ファイル一覧取得”)」と入力するより、「sht」と入力するほうが少なくすむからです。

 

②セルの値をクリアする

'②セルの値をクリアする
sht.Range("A5:E10000").ClearContents

ここでは、5行目以降に書き込みされたファイル一覧をクリアしています。

何度もファイル一覧を取得していると、前回取得したファイル一覧が残っていることがあります。

前回取得したフォルダには6つファイルが存在しており、作成されたファイル一覧は6行分記入されます。

今回取得するファイルには4つファイルが存在シた場合、ファイル一覧は4行分記入され、前回分の差分2行分が残ったままになります。

ですから、ファイル一覧を取得する前に、毎回5行目以降をクリアしています。

 

具体的には、5行目から10000行目までをクリアしています。

9995件以上ファイルが存在するフォルダを指定する場合は、ご注意ください。

 

③FileSystemObjectを変数に格納する

'③FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
     
nowRow = 4

For Each f In fso.GetFolder(sht.Range("A2")).Files

ここでは、「FileSystemObject」オブジェクトを変数に格納して、このあとの処理で利用できるようにします。

「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。

 

また、A2セルに入力されている「フォルダパス」を指定して、FileSystemObject」からファイル一覧情報を取得しています。

ファイルを1つ1つ取得して、変数fに格納して、このあとの処理で利用できるようにしています。

 

④現在行を次の行に変更する

'④現在行を次の行に変更する
nowRow = nowRow + 1

ここでは、現在行を次の行に変更するため、変数「nowRow」に格納している値+1を、変数「nowRow」に格納しています。

ループ処理の外側で、変数「nowRow」には4が格納されています。

ファイル一覧情報は、5行目から入力するので、ループ処理の内側に入ったときに変数「nowRow」を+1して、5を格納します。

もちろん、ループしてくると、さらに+1されて6が格納されます。

というように、ファイル情報を5行目以降に書き込みされるようにします。

 

⑤NOをセットする

'⑤NOをセットする
sht.Range("A" & nowRow) = nowRow - 4

ここでは、A列(NO)に1からの連番を入力します。

変数「nowRow」に5が格納されている場合、-4してセルA5に1が入力されます。

 

⑥ファイル名をセットする

'⑥ファイル名をセットする
sht.Range("B" & nowRow) = f.Name

ここでは、B列(ファイル名)に「FileSystemObject」オブジェクトから取得したファイル名を書き込みします。

変数「f」には1つ1つファイル情報が格納されています。

 

⑦更新日時をセットする

'⑦日付時刻をセットする
sht.Range("C" & nowRow) = f.DateLastModified

ここでは、C列(更新日時)にファイルの更新日時を書き込みします。

 

⑧種類をセットする

'⑧種類をセットする
sht.Range("D" & nowRow) = f.Type

ここでは、セルD列にファイルの種類を書き込みします。

PDFファイルなら「PDF Document」、Excelファイルなら「Microsoft Excel ワークシート」、

テキストファイルなら「TXT ファイル」のようにファイル種類が表示されます。

 

⑨サイズをセットする

'⑨サイズをセットする
sht.Range("E" & nowRow) = f.Size

ここでは、セルE列にファイルのサイズを書き込みします。

ここで書き込みされるファイルのサイズは、バイト単位になります。

エクスプローラー上で表示されるサイズは、キロバイト(KB)単位になり、数字が異なる可能性があります。

 

⑩FileSystemObjectをクリアする

'⑩FileSystemObjectをクリアする
Set fso = Nothing

ここでは、これまで使ってきた「FileSystemObject」をクリアしています。

クリアしないと、ファイル情報をつかんだままになりますので、ご注意ください。

 

それでは、ファイル一覧を取得するツールを作って、作業を効率化してみましょう。

 

以上です。

 

最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です