あるフォルダに含まれるファイルの一覧を取得できると、ファイルの整理などに役立てることができる。Excelを使うことにより、ファイルの一覧情報を簡単に取得することができる。
対象ソフトウェア:Excel 2000/Excel 2002
例えば、ファイル・サーバ内のユーザー・ドキュメントを整理したいと思った場合、エクスプローラやファイル検索機能だけでは、どのファイルが必要で、どのファイルが不要なのか判断するのは簡単ではない。可能ならばファイルの一覧リストを取得して、判断したいところだが、Windows標準のエクスプローラは、あるフォルダの下にあるファイルの一覧を取得してリストにするような機能は持っていない。しかし、本サンプルを利用することで、ファイル・サイズや最終アクセス日などの主要情報をExcelワークシートとして取り込むことができる。これを使って、一定サイズ以上のファイルを降順にリストアップしてユーザーにアーカイブ化を求めたり、一定期間アクセスされていないファイルを削除する場合などの分析資料として利用することができるだろう。サーバ管理者の簡易な監視ツールとして役立ててほしい。
それではさっそく、作成までの流れを見てみることにしよう。
filelistワークシートのテンプレート・イメージは以下のとおりだ。
2行目には、タイトルとして「名前」「親フォルダ名」「サイズ(KB)」「種類」「作成年月日」「最終アクセス年月日」「更新年月日」といった項目を設置しておこう。さらにシートのプロパティ設定([コントロール ツールボックス]の[プロパティ]をクリックする)で、シートのオブジェクト名を「shtFile」、シートの名称を「filelist」に設定しておく。
表を作成したら、次はファイル・リスト生成のトリガーとなる[コマンド ボタン]を設置する。[コントロール ツールボックス]から[コマンド ボタン]を選択し、シート上の適当な場所に配置する。ボタンのプロパティとしては、今回は以下のような内容に変更している。「オブジェクト名」とは、プログラムの中でこのコマンド・ボタンを参照するときに使用される名前をいう。今回は、ほかのプロパティについては変更の必要はない。
プロパティ | 設定する値 |
---|---|
(オブジェクト名) | btnAction |
Caption | ファイル検索 |
変更するプロパティ オブジェクト名とボタンのラベルを設定する。 |
さて外枠ができたら、次はいよいよコードを記述してみよう。
デザインモードの状態(「コントロール ツールボックス」メニューバーの三角定規が選択された状態)で、シート上に配置したコマンド・ボタンをクリックすると、Visual Basic Editorが起動するはずだ。コード・エディタ上に、すでにイベント・プロシージャの骨格は生成されているはずなので、それの中に追加する形で以下のコードを記述して欲しい。
Private Sub btnAction_Click()
strPath = InputBox("調べたいフォルダを絶対パスで入力してください。", "ファイル一覧", "c:\")
shtFile.Cells(3, 2) = " "
Range("A3", ActiveCell.SpecialCells(xlLastCell)).ClearContents
Range("A3").Select
i = 3
FileDisp strPath, i
End Sub
btnAction_Clickは、コマンド・ボタンをクリックしたときに呼び出されるプロシージャだ。
InputBoxは、ExcelのVBAにあらかじめ用意されている組み込み関数の1つで、MsgBox関数に似ているが、入力可能なテキスト・ボックスを備えている点がメッセージ・ボックスとは異なる。第1引数にインプット・ボックスに表示されるメッセージを、第2引数にはタイトルを、そして第3引数にはテキスト・ボックスにデフォルトで表示される(入力されている)文字列を、それぞれ指定する。今回の例では、デフォルトでは「c:\」としている。InputBox関数は戻り値としてテキスト・ボックスに入力された文字列(この場合は入力されたフォルダのパス)を返す。
入力を受け付けると、次にシートの未使用部分(前回の表示結果)をクリアする。そして変数iをワークシート出力の開始列である「3」で初期化してから、FileDisp関数を呼び出す。FileDisp関数には、インプット・ボックスで指定されたフォルダ・パスと、ワークシートへの出力開始行を引数(パラメータ)として渡す必要がある。なお、後述するFileDisp関数は戻り値を返さないSubプロシージャである。Subプロシージャをコールする場合には、VBAでは引数をカッコで囲まないので注意が必要だ。
btnAction_Clickイベント・プロシージャの役割は、ここまでである。実際の出力作業は、FileDisp関数に委ねられる。
イベント・プロシージャではない一般的なSubプロシージャは、Visual Basic Editor上のメニューから[挿入]−[プロシージャ]を選択することで追加できる。このメニューを選択すると[プロシージャの追加]ダイアログが表示されるので、それぞれ以下のように入力してみよう。
以上の操作でコード・エディタ上にFileDispプロシージャのスケルトンが生成されているはずである。それに追記する形で、次のようなコードを記述しておこう。
Private Sub FileDisp(strPath, i)
Set objFs = CreateObject("Scripting.FileSystemObject")
Set objFld = objFs.GetFolder(strPath)
For Each objFl In objFld.Files
shtFile.Cells(i, 2) = objFs.GetBaseName(objFl.Path)
shtFile.Cells(i, 3) = objFl.ParentFolder.Path
shtFile.Cells(i, 4) = Int(objFl.Size / 1024)
shtFile.Cells(i, 5) = objFl.Type
shtFile.Cells(i, 6) = objFl.DateCreated
shtFile.Cells(i, 7) = objFl.DateLastAccessed
shtFile.Cells(i, 8) = objFl.DateLastModified
i = i + 1
Next
For Each objSub In objFld.SubFolders
FileDisp objSub.Path, i
Next
End Sub
コードは非常にシンプルである。このコードでどのようにしたら何層にも連なるファイル・システムの最下層までを検索し、出力できるのかと不思議に思われるかもしれない。しかし「再帰呼び出し」という手法を用いることで、これが容易に可能となる。
上記コードの2つ目のFor Eachブロック(End Sub直前の3行)に注目してみて欲しい。これは現在のフォルダ(FileSystemObjectのGetFolderメソッドで生成されたFolderオブジェクトobjFld)から、サブフォルダ(SubFoldersプロパティ)を順番に取り出し、自分自身(FileDisp関数)を呼び出している。呼び出し時には、そのサブフォルダへのパスと現在の出力行を渡している。
サブフォルダの数だけFileDispプロシージャが呼び出され、そのサブフォルダの中に再びサブフォルダが見つかれば、さらにその数だけFileDispプロシージャが呼び出される。このように自分自身を何重にも呼び出すことで(再帰呼び出しという)、短いプロシージャが文字通り一騎当千の役割を果たすのだ。これは、スマートなコードを記述する上で極めて有効な手法なので、ぜひ憶えておいていただきたい。
さて、大きな流れが見えたところで、1つ目のFor Eachブロック、つまりファイル情報の出力部分を簡単に紹介しておこう。ここでは、現在のフォルダ(objFld)に含まれる一連のファイル群(Filesプロパティ)から順番にファイルを取り出し、B〜H列(プログラム上は2〜8列)にファイル情報を表示している。なお、ここではファイルの拡張子を含まない名前(ベース・ネームという)を表示しているが、ファイル名に拡張子も付けたままにするには、
shtFile.Cells(i, 2) = objFs.GetBaseName(objFl.Path)
という行(1つ目のFor Eachの最初の行)を、次のように変更しておく。
shtFile.Cells(i, 2) = objFl.Name
最後に、Folder/Fileオブジェクトにおける主なプロパティをまとめておく。
プロパティ名 | 概要 | Folder | File |
---|---|---|---|
Attribute | 属性 | ○ | ○ |
DateCreated | 作成年月日 | ○ | ○ |
DateLastAccessed | 最終アクセス日 | ○ | ○ |
DateLastModified | 最終更新日 | ○ | ○ |
Drive | 属するドライブ名 | ○ | ○ |
Files | 配下のファイル群 | ○ | − |
Name | ファイル名(パス部分は除く) | ○ | ○ |
ParentFolder | 親フォルダ名 | ○ | ○ |
Path | フルパス名(+ファイル名) | ○ | ○ |
ShortName | ショート・ファイル名(8.3形式) | ○ | ○ |
ShortPath | ショート・パス名(8.3形式) | ○ | ○ |
Size | サイズ(bytes) | ○ | ○ |
SubFolders | 配下のサブフォルダ群 | ○ | − |
Type | 種類 | ○ | ○ |
Folder/Fileオブジェクトの主なプロパティ |
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.