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関数もセットで使用する必要がありますのでご注意ください。