【VBAリファレンス】VBAサンプル集エクセルでファイル一覧を作成.№2(Dir関数1)

スポンサーリンク

VBAでファイル一覧を作成する:Dir関数による基本実装と技術的考察

Excel VBAを用いた業務自動化において、特定のフォルダ内に格納されているファイル名の一覧をシート上に書き出すという作業は、自動化の第一歩であり、かつ極めて需要の高いスキルです。本稿では、VBAにおける標準関数である「Dir関数」を用いたファイル一覧取得手法について、その仕組みから実務における注意点までを詳細に解説します。

Dir関数の概要と動作原理

Dir関数は、指定したパスや属性に一致するファイル名、またはフォルダ名を返すVBAの組み込み関数です。この関数の最大の特徴は、一度呼び出した後に「引数を省略して再度呼び出す」ことで、次のファイル名を取得できるという「イテレータ的」な挙動にあります。

プログラミング初心者にとって、Dir関数は「ループ処理との組み合わせ」が必須であるという点で少しハードルが高く感じられるかもしれません。しかし、この関数をマスターすることで、外部ライブラリ(FSOなど)に依存することなく、極めて軽量かつ高速にファイル操作が可能になります。

Dir関数の基本的な構文は以下の通りです。
Dir(pathname, attributes)

pathnameには検索対象のパス(ワイルドカード指定可)を指定し、attributesにはファイル属性(読み取り専用、隠しファイルなど)を指定します。最初の呼び出しではpathnameを指定し、二回目以降の呼び出しではpathnameを省略することで、フォルダ内の次なるファイルを順次取得していきます。

Dir関数を用いたファイル一覧取得のサンプルコード

以下に、指定したフォルダ内のExcelファイル(.xlsx)を列挙し、アクティブシートのA列に書き出す標準的なプロシージャを示します。


Sub GetFileListByDir()
    Dim targetPath As String
    Dim fileName As String
    Dim rowCount As Long
    
    ' フォルダパスの設定(末尾の¥マークに注意)
    targetPath = "C:\Users\Public\Documents\"
    
    ' 検索対象の拡張子を指定
    fileName = Dir(targetPath & "*.xlsx")
    
    ' 書き出し用の行カウンタを初期化
    rowCount = 1
    
    ' ファイルが見つからなくなるまでループ
    Do While fileName <> ""
        ' シートにファイル名を書き出し
        Cells(rowCount, 1).Value = fileName
        
        ' 次のファイルを取得
        fileName = Dir()
        
        ' 行をインクリメント
        rowCount = rowCount + 1
    Loop
    
    MsgBox "ファイル一覧の作成が完了しました。", vbInformation
End Sub

このコードのポイントは、Do Whileループの条件式です。Dir関数は対象となるファイルがなくなった時点で空文字(””)を返す仕様になっています。この性質をループの終了条件として利用するのがVBAにおける定石です。

Dir関数使用時の重要な技術的注意点

Dir関数は非常に強力ですが、実務で扱う際にはいくつかの「落とし穴」が存在します。これらを理解していないと、予期せぬバグやエラーに直面することになります。

1. 再帰呼び出しの不可
Dir関数は、内部的に検索状態を保持しています。そのため、一つのプロシージャ内で別のDir関数を呼び出すような二重ループ構造を作ると、内部の検索状態が上書きされ、正常に動作しなくなります。複数のフォルダを同時に走査したい場合は、FileSystemObject(FSO)を使用するか、一度配列に結果を格納するなどの工夫が必要です。

2. ネットワークパスの制限
Dir関数はUNCパス(\\ServerName\Folderなど)を直接扱うことは可能ですが、非常に深い階層やネットワークドライブの遅延状況によっては、タイムアウトや予期せぬ挙動を示すことがあります。安定性を求める大規模なシステム開発では、APIレベルでの制御やFSOの検討が必要です。

3. ファイル属性の指定
Dir関数には、第2引数でvbDirectoryなどの属性を指定できます。これを利用することで、ファイルだけでなく「フォルダ名」も同時に取得することが可能です。しかし、通常のファイル検索と混在させるとロジックが複雑化するため、目的を明確にして使い分けることが肝要です。

4. 検索結果の順序
Dir関数が返すファイル名の順序は、OSのファイルシステムに依存します。多くの場合、ファイル名順や作成日順にはならず、非常にランダムな順序で返されることがあります。もし特定の順序でリストを作成したい場合は、一度配列に格納した後、VBA側でソート処理を実装する必要があります。

実務における最適化アドバイス

実務でこのコードを運用する際、単にファイル名を書き出すだけでは不十分なケースがほとんどです。以下のステップを追加することで、実用性を飛躍的に高めることができます。

・フルパスの取得
Dir関数が返すのはファイル名のみです。後続の処理でファイルを開いたり、プロパティを取得したりする場合は、targetPathとfileNameを結合したフルパスを生成する必要があります。

・エラーハンドリングの追加
指定したフォルダが存在しない場合、Dir関数はエラーを発生させたり、空文字を返してループに入らなかったりします。Dir関数の呼び出し前に、Dir関数自体の属性指定(vbDirectory)を用いて、フォルダの存在確認を行うのがプロフェッショナルの作法です。

・画面更新の停止
数千件のファイルを処理する場合、Cellsへの書き込みを一つずつ行うとExcelの描画処理がボトルネックとなります。`Application.ScreenUpdating = False` を利用して画面更新を停止させることで、処理速度を劇的に向上させることが可能です。

・配列への一括転送
さらに高速化を目指すなら、一度配列にファイル名を格納し、最後に `Range.Value = Array` とすることで、シートへの書き込みを1回で完了させる手法を推奨します。これはVBAにおける高速化の鉄則です。

まとめ

Dir関数は、VBAにおけるファイル操作の原点であり、そのシンプルさゆえに多くのエンジニアに愛用されています。複雑なオブジェクトモデルであるFSO(FileSystemObject)を導入する前に、まずはDir関数で「何ができるのか」「どこに限界があるのか」を正しく理解することは、VBAエンジニアとしての基礎体力を養うことに直結します。

本稿で解説した基本的なループ構造と、実務で必要となる属性指定やエラーハンドリングを組み合わせることで、日常の業務効率化は大きく前進します。まずはサンプルコードを自身の環境で実行し、Dir関数がどのようにファイルを拾い上げているのか、ステップ実行で一つずつ確認してみてください。技術の習得に近道はありません。一つひとつの関数の挙動を深く理解することが、堅牢なVBAプログラムを構築する唯一の道なのです。

タイトルとURLをコピーしました