和風スパゲティのレシピ

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

FileSystemObject.FileExistsメソッド

FileSystemObject(以下FSO)にてファイルの存在を判定する、
FileExistsメソッドについて解説します。

基本形

If FSO.FileExists(判定したいファイルのパス) Then

実行例

Dim FSO As New FileSystemObject

' ファイルが存在すれば開く
If FSO.FileExists("C:\Users\○○\Desktop\テスト\Book1.xlsx") Then
    Workbooks.Open "C:\Users\○○\Desktop\テスト\Book1.xlsx"
End If

解説

FileSystemObjectのFileExistsメソッドは、
判定したいファイルパスを引数として受け取り、
そのファイルがあればTrue/なければFalseを返します。


同じ処理を行う方法としてDir関数を使う方法がありますが、
Dirの場合は「存在した場合はそのファイル名が返ってくる」という仕様のため、
存在判定に使用する場合は「=""」「<>""」などで比較する必要があります。

If Dir(判定ファイルパス) = "" Then


それに比べるとFSO.FileExistは素直にTrue/Falseを返すため、
仕様がストレートで分かりやすいですね。


ただしDir関数では出来た、「ファイルの曖昧検索(ワイルドカード*の使用)」は、
FileExistsメソッドでは使えません。

ファイル名のあいまい検索を行いたい場合は、Dir関数を使用してください。


しかしFileSystemObjectには「Unicode文字を扱える」という特長があります。

簡単な例ですと、

  • フォルダ名に①~⑳を使うのはDir関数でもOK
  • フォルダ名に㉑~㊿を使うのはFSOでなければダメ

という差があります。


もし「㉑~~~.xlsx」というファイルの存在確認を行いたい場合は、
For Eachステートメントで地道に探すよりほかありません。

Dim FSO As New FileSystemObject

Dim ファイル As File
For Each ファイル In FSO.GetFolder("C:\Users\○○\Desktop\テスト").Files
    If ファイル.Name Like "㉑*.xlsx" Then

    End If
Next


GetFolderで取得したフォルダ内の全ファイルをFilesプロパティで取得し、
それをFor Eachステートメントでファイルごとにループ、
そのNameの部分一致判定をLike演算子で行うコードです。


すべてのファイルを走査するコードと同じものを書く必要があり少し面倒ですが、
これ以外の方法がありませんので地味に判定してください。


ちなみに本筋からそれるため簡略化しましたが、上記コードは正しくは

If ファイル.Name Like ChrW(12881) & "*.xlsx" Then 

こう書く必要があります。

㉑はVBEには書けません(?と表示されてしまう)。


Dir関数で扱えず、FileSystemObjectで扱う必要のある文字は、
ほぼ間違いなくVBEにも書くことができません。


ChrW関数もセットで使用する必要がありますのでご注意ください。