連載
» 2003年07月05日 05時00分 UPDATE

Tech TIPS:Excelでファイルの一覧情報リストを取得する

あるフォルダに含まれるファイルの一覧を取得できると、ファイルの整理などに役立てることができる。Excelを使うことにより、ファイルの一覧情報を簡単に取得することができる。

[山田祥寛,著]
「Tech TIPS」のインデックス

連載目次

対象ソフトウェア:Excel 2000/Excel 2002



解説

 例えば、ファイル・サーバ内のユーザー・ドキュメントを整理したいと思った場合、エクスプローラやファイル検索機能だけでは、どのファイルが必要で、どのファイルが不要なのか判断するのは簡単ではない。可能ならばファイルの一覧リストを取得して、判断したいところだが、Windows標準のエクスプローラは、あるフォルダの下にあるファイルの一覧を取得してリストにするような機能は持っていない。しかし、本サンプルを利用することで、ファイル・サイズや最終アクセス日などの主要情報をExcelワークシートとして取り込むことができる。これを使って、一定サイズ以上のファイルを降順にリストアップしてユーザーにアーカイブ化を求めたり、一定期間アクセスされていないファイルを削除する場合などの分析資料として利用することができるだろう。サーバ管理者の簡易な監視ツールとして役立ててほしい。

ファイル一覧の取得例 ファイル一覧の取得例
指定されたフォルダの下にある、全ファイルの情報をExcelのシート上に取得することができる。
  (1)これをクリックすると、情報を取得するフォルダ名の入力ダイアログ・ボックスが表示される。
  (2)取得されたファイルの一覧情報。

操作方法

 それではさっそく、作成までの流れを見てみることにしよう。

●手順1―ワークシート上にタイトル行を生成する

 filelistワークシートのテンプレート・イメージは以下のとおりだ。

作成するfilelistワークシート 作成するfilelistワークシート
このようなタイトル行とボタンを持つワークシートを作成する。
  (1)コマンド・ボタン。
  (2)見出しタイトル行。

 2行目には、タイトルとして「名前」「親フォルダ名」「サイズ(KB)」「種類」「作成年月日」「最終アクセス年月日」「更新年月日」といった項目を設置しておこう。さらにシートのプロパティ設定([コントロール ツールボックス]の[プロパティ]をクリックする)で、シートのオブジェクト名を「shtFile」、シートの名称を「filelist」に設定しておく。

●手順2―コマンド・ボタンを配置する

 表を作成したら、次はファイル・リスト生成のトリガーとなる[コマンド ボタン]を設置する。[コントロール ツールボックス]から[コマンド ボタン]を選択し、シート上の適当な場所に配置する。ボタンのプロパティとしては、今回は以下のような内容に変更している。「オブジェクト名」とは、プログラムの中でこのコマンド・ボタンを参照するときに使用される名前をいう。今回は、ほかのプロパティについては変更の必要はない。

プロパティ 設定する値
(オブジェクト名) btnAction
Caption ファイル検索
変更するプロパティ
オブジェクト名とボタンのラベルを設定する。

●手順3―ファイルを検索し、ワークシートに出力するためのコードを記述する

 さて外枠ができたら、次はいよいよコードを記述してみよう。

 デザインモードの状態(「コントロール ツールボックス」メニューバーの三角定規が選択された状態)で、シート上に配置したコマンド・ボタンをクリックすると、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関数に委ねられる。

●手順4―再帰呼び出し用の関数FileDispを定義する

 イベント・プロシージャではない一般的なSubプロシージャは、Visual Basic Editor上のメニューから[挿入]−[プロシージャ]を選択することで追加できる。このメニューを選択すると[プロシージャの追加]ダイアログが表示されるので、それぞれ以下のように入力してみよう。

[プロシージャの追加]ダイアログ [プロシージャの追加]ダイアログ
Visual Basic Editor上のメニューから[挿入]−[プロシージャ]を選択し、このようにプロシージャの名前を入力すると、プロシージャのスケルトンが生成される。
  (1)プロシージャの名前として「FileDisp」と入力し、[OK]をクリックする。

 以上の操作でコード・エディタ上に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オブジェクトの主なプロパティ

「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。