指定パス下にある指定ファイルの最新版を取得(失敗談)
ある業務に於いて、書類(Excel)上のファイル名(複数)が、最新版か否か確認する必要が出てきた。実際とは異なるが、雰囲気は、例えばこんな感じ。
拡張子 :PDF
ファイル名:部署コード(3文字)+通し番号(4桁)+更新回数(1文字)
部署コードは、全てアルファベットの大文字(例.AAB)だ。
また更新回数は、数字ではなくアルファベットの大文字(1回目:A,2回目:B・・・)で表している。
書類に「AAB0001」と書かれていても、実際は「AAB0001C」が最新版かもしれない。
これらのファイルは保存箇所が細かくフォルダ分けされている(特定パス下)。
- 一階層目:部署コード
- 二階層目:通し番号範囲(例.0000~0099)
- 三階層目:ファイルの保管場所
さて、どうしたものか。
一つの書類上に、確認すべきファイル名が複数ある。そこでまず、全ファイル名の取得を試みた。作戦は、こうだ。
- コレクションを一つ準備する。
- 指定フォルダ内にあるファイル名を、コレクションに加えていく。
- フォルダ内にサブフォルダがあれば、再帰呼び出しで総浚いする。
なお再帰呼び出しについては多くの先達がWeb上で解説されているので、ここでの詳細説明を省くことにする。
Office TANAKA - Excel VBA Tips[ファイルを検索する]
作成したマクロ(雰囲気)がこちら。
Option Explicit Dim col As Collection Dim FSO As New FileSystemObject Private Sub Sample() Set col = New Collection Call GetAllFileName("何某かのパス") End Sub Sub GetAllFileName(folder_path As String) Dim myFile As File For Each myFile In FSO.GetFolder(folder_path).Files col.Add myFile.Name Next Dim myFolder As Folder For Each myFolder In FSO.GetFolder(folder_path).SubFolders Call GetAllFileName(myFolder.Path) Next End Sub
結果は・・・10分以上待っても処理が終わらない。確認したところ、取得しようとしたファイル数は数万件単位だった。100前後のファイル名を確認するために、100倍以上のデータ数を取得するのは無駄が多い。それにこの多さは、FileSystemObjectには不向きだったようで(失敗!)。
ということで作戦変更。
ファイル名を元にサブフォルダを潜航し、目的のファイルを探し出すことにした。
・・・
長くなりそうなので、明日に続きます。