【VBAリファレンス】VBA再入門:Dir関数とDo Loopでフォルダ内の全ファイルを制する技術

スポンサーリンク

概要

業務効率化の第一歩は「ファイル操作の自動化」にあります。特定のフォルダ内に格納された数百、数千のExcelファイルやCSVファイルを一つずつ開いてデータを集計する――そんな作業を手動で行っていませんか?VBAにおけるファイル操作の基本であり、かつ最も強力な武器となるのが「Dir関数」と「Do Loopステートメント」を組み合わせた手法です。本記事では、この古典的かつ極めて実用的な手法を、ベテラン講師の視点から徹底的に解説します。単にコードを書くのではなく、メモリ管理やエラーハンドリングまで意識した「プロの書き方」を習得しましょう。

詳細解説:Dir関数とDo Loopのメカニズム

VBAでファイル一覧を取得する際、避けて通れないのがDir関数です。この関数は、指定したパス(フォルダ)に存在するファイル名を、一つずつ順番に返すという特殊な性質を持っています。

まず、Dir関数の基本構造を理解しましょう。Dir関数は、初回呼び出し時に「フォルダのパスと検索条件(ワイルドカード)」を引数に取ります。そして、見つかった最初のファイル名を返します。次に、引数を省略して再度Dir関数を呼び出すことで、2番目、3番目と続くファイル名を順次取得できるのです。

ここで重要になるのが「Do Loop」の役割です。Dir関数は、最後にファイル名を取得した後に、これ以上ファイルが存在しない場合「空文字(””)」を返します。この「空文字が返ってくるまでループを繰り返す」というアルゴリズムを組み立てることで、フォルダ内の全ファイルを漏れなく取得することが可能となります。

初心者の方は「For Each文」を想像するかもしれませんが、ファイルシステムオブジェクト(FSO)を使わない環境や、特定の条件下でメモリ消費を抑えたい場合には、このDir関数によるループが最も軽量で安定した動作を保証します。

サンプルコード:堅牢なファイル取得ルーチン

以下のコードは、指定したフォルダ内のすべてのExcelファイル(.xlsx)のファイル名を取得し、イミディエイトウィンドウに出力する実務的なサンプルです。


Sub GetFileNameList()
    Dim folderPath As String
    Dim fileName As String
    
    ' フォルダパスの設定(末尾に必ずパス区切り文字を含める)
    folderPath = "C:\Users\TargetFolder\"
    
    ' Dir関数の初回呼び出し(検索条件を指定)
    fileName = Dir(folderPath & "*.xlsx")
    
    ' ファイルが見つからない場合を考慮したエラーハンドリング
    If fileName = "" Then
        MsgBox "対象のファイルが見つかりません。", vbExclamation
        Exit Sub
    End If
    
    ' Do Loopによる繰り返し処理
    Do While fileName <> ""
        ' ここでファイル名を使った処理を実行
        Debug.Print fileName
        
        ' 次のファイルを取得
        fileName = Dir()
    Loop
    
    MsgBox "全ファイルの取得が完了しました。"
End Sub

実務アドバイス:プロとして意識すべき「3つの落とし穴」

現場でDir関数を使用する際、多くのエンジニアが陥りやすい罠があります。ベテランとして、これらを回避するための知見を共有します。

1. パスの区切り文字(\)の処理
Dir関数に渡す文字列の末尾が「\」でない場合、正しくフォルダを認識できません。常に「If Right(folderPath, 1) <> “\” Then folderPath = folderPath & “\”」のようなチェックを入れ、パスを正規化する癖をつけましょう。

2. 再帰的な呼び出しとDir関数の限界
Dir関数は単一のフォルダ内を検索するのには適していますが、サブフォルダを含めた階層構造の探索には不向きです。サブフォルダまで探索したい場合は、再帰処理(自分自身を呼び出すプロシージャ)を組む必要があります。しかし、Dir関数は「入れ子」にすると状態がリセットされる性質があるため、階層構造の探索にはFSO(FileSystemObject)を推奨します。あくまでDir関数は「直下のファイル取得」に特化させることが、バグを未然に防ぐコツです。

3. 処理中のファイル名変更
ループ内でDir関数を使って取得したファイルを開き、名前を変更したり移動したりすると、Dir関数の内部ポインタが狂い、無限ループやエラーを引き起こすことがあります。「一覧を取得する処理」と「ファイルを開いて加工する処理」は、可能な限りロジックを分離すべきです。まずは配列(Array)やコレクションにファイル名をすべて格納してから、そのリストを元に順次処理を行うのが、最も保守性の高い設計です。

まとめ:VBAの基礎は「制御構造」にある

Dir関数とDo Loopの組み合わせは、VBAにおける「制御構造」の真髄です。単なるファイル操作を超えて、メモリを効率的に使い、コンピュータに「順番に処理を行わせる」というプログラムの基本動作を学べます。

現代のVBA開発ではFSOが主流となりつつありますが、それでもDir関数が廃れないのには理由があります。それは「軽快さ」と「依存関係の少なさ」です。複雑なライブラリを参照設定することなく、どのような環境でも確実に動作するこの手法は、ツール開発の「最後の砦」となります。

本記事で紹介したコードをベースに、皆さんの業務環境に合わせてカスタマイズしてみてください。例えば、取得したファイル名をセルに出力する、あるいは特定の文字列を含むファイルだけを抽出するなど、応用範囲は無限大です。VBA再入門の過程で、ぜひこの「Dir関数の美学」を身につけ、日々のルーチンワークを瞬時に終わらせる自動化の達人を目指してください。技術は使ってこそ磨かれます。明日からの業務で、まずはこのコードを一行ずつ実行し、その挙動を体感することから始めてみてください。

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