レシピ |
■ Microsoft Excel 2000/2003(FileSystemObjectが使えるWindows)。うまく動作しないときはWSHをバージョンアップしてみてください。 |
プログラミングをしていると,「プログラム・ファイルの構成一覧をExcelで用意してくれ」と言われることがよくあります。手作業だと面倒なんですよね,こういう作業。で,ExcelのVBA(Visual Basic for Applications)を使う方法を紹介しちゃいます。マクロだったら記入漏れやミスタイプもありません。
今回作成するファイル一覧生成マクロは,Excel/VBAを使って,指定されたフォルダ(ディレクトリ)にあるファイルの名前とファイル種別,最終更新日,コメント用の空欄を自動で生成します(図1[拡大表示])。大量のHTMLファイルや画像ファイルを扱う,PHP,PerlなどのWebプログラマの方なら,利用価値にうなずいていただけるかもしれません。
ところで,そもそもなんでMicrosoft Excelなのか,という声もあるでしょうが,このExcelというソフト。いろいろな資料をまとめて配布するには,大変優れています。プログラミングの仕事でお付き合いする営業やSE,客先はもちろん,プログラマもExcelならたいていは持っています。というわけで,今回はExcel/VBAを使うことにしました。ぜひ皆さんで使いまわしてください。
プログラムはきわめて単純
今回はプログラムも簡単ですが,プログラムの作成も簡単です。まずExcelを起動して新規ブック・ファイル(.xlsファイル)を作成し,メニューから[ツール]→[マクロ]→[Visual Basic Editor]とたどってエディタを開いてください。次に,[挿入]→[標準モジュール]で標準モジュールを新たに追加します。続いて,F7キーでコード・ウィンドウを表示してリスト1[拡大表示]のコードを入力。後は任意の名前でファイルを保存します。以上これだけ。
Sub MakeFileList() Target = InputBox("ディレクトリ名を入力", "ディレクトリの指定", "C:\Windows") Set FS = CreateObject("Scripting.FileSystemObject") Set Fol = FS.GetFolder(Target) Set Fil = Fol.Files ThisWorkbook.Sheets("Sheet1").UsedRange.Delete '見出しを付ける ThisWorkbook.Sheets(1).Range("B2") = "ファイル名" ThisWorkbook.Sheets(1).Range("C2") = "ファイル種別" ThisWorkbook.Sheets(1).Range("D2") = "最終更新日" ThisWorkbook.Sheets(1).Range("E2") = "説明" ThisWorkbook.Sheets(1).Range("B2:E2").Interior.Color = RGB(0, 0, 0) ThisWorkbook.Sheets(1).Range("B2:E2").Font.Color = RGB(255, 255, 255) ThisWorkbook.Sheets(1).Range("B2:Es2").HorizontalAlignment = xlCenter i = 3 For Each Fx In Fil 'ファイル名 sFile = Fx.Name 'ファイル名の書き出し ThisWorkbook.Sheets(1).Cells(i, 2) = sFile 'ファイル種別 sFType = Fx.Type '最終更新日時の書き出し ThisWorkbook.Sheets(1).Cells(i, 3) = sFType '最終更新日 sLMod = Fx.DateLastModified ThisWorkbook.Sheets(1).Cells(i, 4) = sLMod i = i + 1 Next End Sub |
実行する場合も簡単。ファイルをダブルクリックして起動し,メニューから[ツール]→[マクロ]→[マクロ..]と進んで「MakeFileList」を選択すれば動作します。
Excelのセットアップの仕方によってはVisual Basic Editorがインストールされていないことがありますが,その場合は追加でセットアップしてください。
実行するとInputBoxが出て,ディレクトリ名の入力を促されます(図2[拡大表示])。初期値として「C:\Windows」が入っているので,動作を見るだけであればそのままOKを押します。するとマクロが実行されてワークシート「Sheet1」には,図1[拡大表示]のようにC:\Windowsのファイル一覧が表示されるというわけです。
マクロそのものはシンプルです。指定されたディレクトリをFileSystemObject(FSO)を使って開き,そこにあるファイルに対してループでファイル名と情報を取得し,ループごとに1行ずつ下げた行に取得データを書き出しているだけです。
サンプルの仕様と注意点
このマクロは必ずSheet1に結果を書き出します。そのため連続実行したときに,前の結果が残らないように,最初にSheet1の内容を消去して初期化しています。抽出結果が必要な場合は,抽出後にコピーして別のブックにペーストするなどしてください。また抽出後にセル幅の調整をしていないので,表示が“#######”のようになることがあります。これはExcelの仕様です。マウスでセル幅を広げれば内容はちゃんと表示されます。
シートに書き出されるファイルの表示順はFSOの仕様のようですが,ファイル名での正順ソートになっています。ソート順を更新日時順にしたい,あるいはファイル種別ごとにまとめたいといった希望については,ちょっと頭を冷やして考えてください。「Filesコレクションは配列だから,これをソートする関数を作って…」という“プログラマ脳”はこの場合,非効率的です。これはExcelです。マクロにするかどうかは置いといて,Excelのソート機能でさくっと並べ替えたほうが手っ取り早いでしょう(これは私自身がはまった罠です)。“Excel脳”で考えてみるというのが今回のポイントです。
なお,指定されたフォルダ(ディレクトリ)の有無についてのエラー・トラップは入っていませんので,存在しないディレクトリを指定すると「パスが見つかりません」というエラーが出て処理が止まります。これはどうにもならないことなので,必要に応じてエラー・トラップを仕込んでください。
ご存知のようにセキュリティに厳しい今日ではマクロを含んだブック・ファイルを開こうとすると,ユーザーの設定によっては警告が出ることがあります。そのため,このサンプルを貼り付けたままのブック・ファイルを他人に渡した場合,必ずしも正しく動作してくれるとは断言できません。
セキュリティのレベル変更は[ツール]→[オプション]でオプション・ダイアログを開き,[セキュリティ]タブのところにある[マクロセキュリティ]で変更できます。レベルの変更とそれに伴う危険性については自己責任でお願いします。
面倒だから作らないのも不精なら,作って楽するのも不精。ものぐさだからこそ,たまには努力もしてみるものだと知った今回でした。