この記事では、指定したフォルダに存在するファイル一覧を作成する方法について説明します。
ファイル一覧は以下の情報をついでに取得することができます。
- ファイル名
- 更新日時
- 種類
- サイズ
しかも、フォルダパスを変えて実行すれば、そのフォルダに存在するファイル一覧を取得できます。
1つ1つファイルの情報を調べればできますが、ボタン1つで一瞬でファイル一覧を簡単に作成します。
それでは、EXCELで指定したフォルダに存在するファイル一覧を作成していきましょう。
困っている女性
解決する男性
困っている女性
困っている女性
解決する男性
困っている女性
似たような機能で、ファイル一覧を取得し、一気にファイル名を変更機能については、以下の記事で説明しています。
【EXCEL:VBA】指定したフォルダに存在するファイル名を変更したい
ファイル一覧作成ツールに必要なものを、1つ1つ順番に説明していきます。
もくじ
1.フォルダ指定欄、ファイル一覧欄を準備する
まず、フォルダを指定する欄と取得したファイル一覧を書き込む欄を作成します。
「ファイル一覧取得」シートを作成する
- 「ファイル一覧取得」という名前のシートを作成します。
- 1行目に「フォルダパス」のタイトル行を作成します。
- 2行目に「フォルダパス」を入力する欄を作成します。
- 3行目に「ファイル一覧」というタイトル行を作成します。
- 4行目に「NO」、「ファイル名」、「更新日時」、「種類」、「サイズ」のタイトル行を作成します。
- 5行目以降は、取得したファイル一覧を書き込む欄になります。
5行目以降のファイル一覧情報は、VBAを使って書き込みます。
2.VBAでファイル一覧を取得する機能を記入する
「Microsoft Visual Basic for Applications」を起動します。
標準モジュールを追加して、以下のソースを書きます。
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 41 42 43 44 |
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プログラムを説明します。
①参照するシートを変数に格納する
1 2 |
'①参照するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル一覧取得") |
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“ファイル一覧取得”)」と入力するより、「sht」と入力するほうが少なくすむからです。
②セルの値をクリアする
1 2 |
'②セルの値をクリアする sht.Range("A5:E10000").ClearContents |
何度もファイル一覧を取得していると、前回取得したファイル一覧が残っていることがあります。
前回取得したフォルダには6つファイルが存在しており、作成されたファイル一覧は6行分記入されます。
今回取得するファイルには4つファイルが存在シた場合、ファイル一覧は4行分記入され、前回分の差分2行分が残ったままになります。
ですから、ファイル一覧を取得する前に、毎回5行目以降をクリアしています。
具体的には、5行目から10000行目までをクリアしています。
9995件以上ファイルが存在するフォルダを指定する場合は、ご注意ください。
③FileSystemObjectを変数に格納する
1 2 3 4 5 6 |
'③FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") nowRow = 4 For Each f In fso.GetFolder(sht.Range("A2")).Files |
「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。
また、A2セルに入力されている「フォルダパス」を指定して、FileSystemObject」からファイル一覧情報を取得しています。
ファイルを1つ1つ取得して、変数fに格納して、このあとの処理で利用できるようにしています。
④現在行を次の行に変更する
1 2 |
'④現在行を次の行に変更する nowRow = nowRow + 1 |
ループ処理の外側で、変数「nowRow」には4が格納されています。
ファイル一覧情報は、5行目から入力するので、ループ処理の内側に入ったときに変数「nowRow」を+1して、5を格納します。
もちろん、ループしてくると、さらに+1されて6が格納されます。
というように、ファイル情報を5行目以降に書き込みされるようにします。
⑤NOをセットする
1 2 |
'⑤NOをセットする sht.Range("A" & nowRow) = nowRow - 4 |
変数「nowRow」に5が格納されている場合、-4してセルA5に1が入力されます。
⑥ファイル名をセットする
1 2 |
'⑥ファイル名をセットする sht.Range("B" & nowRow) = f.Name |
変数「f」には1つ1つファイル情報が格納されています。
⑦更新日時をセットする
1 2 |
'⑦日付時刻をセットする sht.Range("C" & nowRow) = f.DateLastModified |
⑧種類をセットする
1 2 |
'⑧種類をセットする sht.Range("D" & nowRow) = f.Type |
PDFファイルなら「PDF Document」、Excelファイルなら「Microsoft Excel ワークシート」、
テキストファイルなら「TXT ファイル」のようにファイル種類が表示されます。
⑨サイズをセットする
1 2 |
'⑨サイズをセットする sht.Range("E" & nowRow) = f.Size |
ここで書き込みされるファイルのサイズは、バイト単位になります。
エクスプローラー上で表示されるサイズは、キロバイト(KB)単位になり、数字が異なる可能性があります。
⑩FileSystemObjectをクリアする
1 2 |
'⑩FileSystemObjectをクリアする Set fso = Nothing |
クリアしないと、ファイル情報をつかんだままになりますので、ご注意ください。
それでは、ファイル一覧を取得するツールを作って、作業を効率化してみましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。