ファイルが存在するか判定する際に使用する、
Dir関数と、FileSystemObject.FileExistsメソッドの違いを解説します。
※ FileSystemObjectは以下FSOと略記します。
同じところ
どちらもファイルが存在するかを判定できます。
以下のコードは実際には同じ動きになります。
If Dir(判定したいファイルパス) <> "" Then ファイルがあったときの処理 End If
Dim FSO As New FileSystemObject If FSO.FolderExists(判定したいファイルパス) Then ファイルがあったときの処理 End If
違うところ
まず大きな点として、返り値が異なります。
Dir関数はファイルがあれば「ファイル名」、なければ「""」を返すのに対し、
FileExistsメソッドはファイルのあるなしをTrue/Falseで返します。
このため判定するIfステートメントの書き方が異なり、
Dir関数で判定する場合は「=""」「<>""」で判定する必要があります。
また、Dir関数では部分一致検索を行うワイルドカード*が使用できます。
FileExistメソッドでは*を使用することはできません。
続いてDir系列ステートメントとFSO全般に言える違いですが、
ファイル名にUnicode文字が混じった場合にDir関数はうまく動きません。
例えば、
- ①~⑳のファイルは正確にファイル名を取得可能
- ㉑~㊿のファイルは丸数字部分が「?」になってしまう。
という問題が発生します。
「ファイル名のUnicode文字が?になる」という挙動のため、
実は「=""」「<>""」で行うファイルの存在判定は正しく動きます。
しかし、この後Workbooks.Openを使用したり、
NameステートメントやCopyステートメントを使用すると、
当然ですがファイルパスが?に変わるためエラーになります。
なかなか「判定だけすればOK」という場面はないでしょうし、
Unicode文字を使用する場合は、おとなしくFSOを使っておきましょう。
また、Dir関数には「ファイルパスに255文字制限」があります。
といっても、これはWindows標準ファイルの制約と同じであり、
さらにはWorkbook.Openなども同様の制約があります。
FileSystemObjectが256文字以上のファイルパスに耐えたところで、
結局他の部分でエラーになってしまっては意味がありません。
原則ファイル(ファイル)パスは255文字以内で運用すべきですのでご注意ください。
使い分け
フォルダ名にUnicode文字を使用する可能性がある場合は、
FSOのFileExistsメソッドを使用する必要があります。
対して、ワイルドカード*で部分一致検索を行う場合は、
Dir関数を使用してください。
もし「Unicode文字+ワイルドカード*」をセットで使いたい場合は、
どちらも使うことができません。
この場合はFSOの「Filesプロパティ」を使用し、
一つ一つのファイルをLike演算子で判定する必要があります。
詳しくはこちらの記事を参考ください。
www.limecode.jp
これ以外の場合はだいたい同じものですので、好きな方を使ってください。
- 単発で使うなら書くのが楽なDir関数
- 前後にFSOを使ったコードがあるなら統一感を出すためにFolderExists
あたりで使い分けると良さそうに思います。