和風スパゲティのレシピ

日本語でコーディングするExcelVBA

DirとFSO.FileExistsの違い

ファイルが存在するか判定する際に使用する、
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

あたりで使い分けると良さそうに思います。