Dir関数を複数同時実行してはいけない
前回「フォルダ内のファイルを取得する」の時、Dir関数についての注意事項をこう述べた。
注意事項 フォルダ内からファイルを取得するDir関数があるが、Dir関数は入れ子になる(Dir関数実行中に、内部で別のフォルダでDir関数を実行する)と戻り値が被るのであまり使用しない方が良い
その詳細な説明を行う。
一般的なDir関数の使い方
上記のようなフォルダのファイルを一つ一つ取りに行く
実行後、イミディエイトウインドにファイル名が表示される
このような単体の使用ならば問題はないが、DirのLoopを行っている間、別のDirのLoopを実行すると、参照先フォルダが意図しないフォルダに変わってしまう場合がある。
Dir関数を入れ子にして使用した場合
二つのフォルダを参照する
1つ目
2つ目
実行
- ①でstrFileName1 : 1_Test.csvが格納
- ②のIfでFlaseになるので、
- ③に飛んで、strFileName1 : 1_Test2.csvが格納
- また②のIfに戻り、今度はTrueになるので、
- ④でstrFileName2:2_Test.csvが格納
- ⑤のIfでFalseになり
- ⑦でstrFileName2:2_Test2.csvが格納
- また⑤のIfに戻り、今度はTrueになるので
- ⑥でひとつLoopをぬけ、③に戻る
- この③のDirでstrFileName1 : 2_Test3.csvが格納
本来なら①のDirと同じフォルダ("D:\Macro\テスト領域1\*.*")を見に行ってほしいのだが、直前の⑦のDirのフォルダ("D:\Macro\テスト領域2\*.*")を見に行ってしまう
この現象は④~⑦を別関数として作成し、内部で呼び出しても同様なので(この方が入れ子になっていることが分かりづらい)、フォルダのファイルを取得する際は、Dir()でなくFileSystemObjectを使用するようが望ましい。
FileSystemObjectによるフォルダ内のファイル取得はこちら↓