【VBAリファレンス|実務向け】実務で差がつく!Dir関数の「意外な落とし穴と賢い活用法」

スポンサーリンク

皆さん、こんにちは。VBA講師の佐藤です。実務でフォルダ内のファイル一覧を取得する際、皆さんはどのような手法を使っていますか?FileSystemObject(FSO)を使う方が多いかと思いますが、実はDir関数には「メモリ負荷が極めて低い」という、FSOにはない強力なメリットがあります。しかし、このDir関数、実は意外な「クセ」があり、正しく理解していないとバグの温床になります。今回は、ベテランだからこそ知っているDir関数の深淵を解説します。

1. なぜ「入れ子(ネスト)」で暴走するのか

多くの初学者が陥る罠が、Dir関数を二重ループで使ってしまうケースです。「フォルダAの中にあるフォルダBの中身を列挙しよう」として、外側のループと内側のループの両方でDir関数を呼び出すと、取得結果が途中で途切れたり、無限ループに陥ったりすることがあります。
これは、Dir関数が「最後に検索した状態」をExcelの内部メモリで一つだけ保持しているためです。入れ子にする場合は、FSOと組み合わせるか、一度配列に格納してから処理を行うのが鉄則です。

2. 属性引数の「隠れた挙動」

Dir関数の第二引数「属性」を指定する際、デフォルトのままだと隠しファイルやシステムファイルが除外されてしまうことをご存知でしょうか。
実務で「特定のフォルダの中身を全てバックアップする」ようなツールを作る際、「vbHidden」や「vbSystem」を組み合わせるのを忘れると、重要な設定ファイルが漏れてしまい、データ破損の原因になります。
特に、Windowsのデスクトップにある「desktop.ini」などの存在を意識せず、全ファイルコピーのプログラムを組むと、思わぬところでエラーが発生します。常に取得漏れがないか確認する癖をつけましょう。

3. ゼロ幅スペースと文字化けの罠

稀なケースですが、共有サーバー上のファイル名に特殊文字が含まれていると、Dir関数がそのファイルを見つけられない(あるいは名前を正しく返さない)ことがあります。
これは、Dir関数が古いAPIをベースにしていることに起因します。もし「ファイルは間違いなくそこにあるのにDirで見つからない」という事態に直面したら、それは文字コードやパスの長さ制限(MAX_PATH)の問題である可能性が高いです。
この場合は無理にDirにこだわらず、FSOの「GetFolder」メソッドに切り替える判断力が必要です。

講師からのアドバイス

Dir関数は、小規模なデータ処理であれば最も軽量で高速な武器になります。しかし、「状態を保持する」という関数としての性質を忘れてはいけません。
「とりあえず動けばいい」ではなく、その関数のメモリ管理がどうなっているのかを想像しながらコードを書く。これができると、あなたのVBAスキルは一段上のステージへ上がります。ぜひ、次のコードでは「Dir関数を使い終わった直後に、他の処理でDirを再利用していないか」をチェックしてみてください。

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