VBA備忘録

VBAソースの備忘録。当面Excelのみ。

Dir関数を複数同時実行してはいけない

前回「フォルダ内のファイルを取得する」の時、Dir関数についての注意事項をこう述べた。

注意事項 フォルダ内からファイルを取得するDir関数があるが、Dir関数は入れ子になる(Dir関数実行中に、内部で別のフォルダでDir関数を実行する)と戻り値が被るのであまり使用しない方が良い

フォルダ内のファイルを取得する - VBA備忘録

その詳細な説明を行う。

 

一般的なDir関数の使い方

上記のようなフォルダのファイルを一つ一つ取りに行く

実行後、イミディエイトウインドにファイル名が表示される

 

このような単体の使用ならば問題はないが、DirのLoopを行っている間、別のDirのLoopを実行すると、参照先フォルダが意図しないフォルダに変わってしまう場合がある。

 

Dir関数を入れ子にして使用した場合

二つのフォルダを参照する

1つ目

2つ目

 

 

実行

  1. ①でstrFileName1 : 1_Test.csvが格納
  2. ②のIfでFlaseになるので、
  3. ③に飛んで、strFileName1 : 1_Test2.csvが格納
  4. また②のIfに戻り、今度はTrueになるので、
  5. ④でstrFileName2:2_Test.csvが格納
  6. ⑤のIfでFalseになり
  7. ⑦でstrFileName2:2_Test2.csvが格納
  8. また⑤のIfに戻り、今度はTrueになるので
  9. ⑥でひとつLoopをぬけ、③に戻る
  10. この③のDirでstrFileName1 : 2_Test3.csvが格納
    本来なら①のDirと同じフォルダ("D:\Macro\テスト領域1\*.*")を見に行ってほしいのだが、直前の⑦のDirのフォルダ("D:\Macro\テスト領域2\*.*")を見に行ってしまう

この現象は④~⑦を別関数として作成し、内部で呼び出しても同様なので(この方が入れ子になっていることが分かりづらい)、フォルダのファイルを取得する際は、Dir()でなくFileSystemObjectを使用するようが望ましい。

 

FileSystemObjectによるフォルダ内のファイル取得はこちら↓

senpine.hatenablog.com