指定パス下にある指定ファイルの最新版を取得(失敗談)

ある業務に於いて、書類(Excel)上のファイル名(複数)が、最新版か否か確認する必要が出てきた。実際とは異なるが、雰囲気は、例えばこんな感じ。

拡張子  :PDF
ファイル名:部署コード(3文字)+通し番号(4桁)+更新回数(1文字)

部署コードは、全てアルファベットの大文字(例.AAB)だ。
また更新回数は、数字ではなくアルファベットの大文字(1回目:A,2回目:B・・・)で表している。
書類に「AAB0001」と書かれていても、実際は「AAB0001C」が最新版かもしれない。

これらのファイルは保存箇所が細かくフォルダ分けされている(特定パス下)。

  • 一階層目:部署コード
  • 二階層目:通し番号範囲(例.0000~0099)
  • 三階層目:ファイルの保管場所

さて、どうしたものか。
f:id:Infoment:20181023221618p:plain

一つの書類上に、確認すべきファイル名が複数ある。そこでまず、全ファイル名の取得を試みた。作戦は、こうだ。

  1. コレクションを一つ準備する。
  2. 指定フォルダ内にあるファイル名を、コレクションに加えていく。
  3. フォルダ内にサブフォルダがあれば、再帰呼び出しで総浚いする。

なお再帰呼び出しについては多くの先達が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には不向きだったようで(失敗!)。

ということで作戦変更。
ファイル名を元にサブフォルダを潜航し、目的のファイルを探し出すことにした。

・・・

長くなりそうなので、明日に続きます。