ファイルの存在チェック方法は2通り
VBAでファイル操作を行う際に、目的のファイルが既に存在するかをチェックしたいことがあります。
ファイルの存在チェックの方法として2通りあります。
1つはFileSystemObjectのFileExists関数を利用する方法。
もう1つはDir関数を利用する方法です。
なお、FileSystemObjectを使う場合はVBA画面のツールメニュー→参照設定で、Microsoft Scripting Runtimeにチェックを付ける必要があります。
FileExistsとDirのどちらを使ったらよいか
FileSystemObjectのFileExists関数とDir関数はいずれも一長一短があります。
単純にファイルの存在をチェックする場合はワイルドカードが指定できるDir関数を利用した方がよいです。
FileSystemObjectのFileExists関数はワイルドカードは指定できず固定ファイル名しか判定できません。
ファイル名の存在以外にもファイル関連の情報を調べる必要があるのであればFileSystemObjectを利用した方がよいでしょう。
拡張子の種類やタイムスタンプやファイルの属性などで処理の方法を変える必要がある場合などですね。
FileExistsとDirの処理速度の違い
処理速度についてですが、ファイルの存在チェックだけであれば、FileSystemObjectのFileExists関数とDir関数の処理速度はほぼ同じです。
もちろん大量のファイルを検索するような場合であれば速度差は出ますが、10万件程度であれば最近のPCであればいずれも数秒程度終わります。
ただし、FileSystemObjectの場合はCreateObjectの負荷が高い(処理が遅い)ため、CreateObjectとFileExistsをそれぞれ独立させる工夫が必要になります。
Dir関数のソースコード例
まず、Dir関数を利用する場合です。
1 2 3 4 5 6 7 8 9 10 11 |
Public Function IsExistFileDir(a_sFilePath) As Boolean Dim a a = Dir(a_sFilePath) If (a <> "") Then IsExistFileDir = True Else IsExistFileDir = False End If End Function |
利用例です。
1 2 3 4 5 6 7 8 9 10 11 |
Sub IsExistFileDir利用例() Dim a Dim i Dim bResult As Boolean a = "C:\aaa\TextDocument.Txt" For i = 0 To 100000 bResult = IsExistFileDir(a) Next End Sub |
FileSystemObjectのFileExistsのソースコード例
次に、FileSystemObjectのFileExists関数を利用する場合です。
CreateObjectを1度だけ処理するようにするために、呼び出し元でFileSystemObjectの変数を定義しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Public Function IsExistFileFS(ofso, a_sFilePath) As Boolean If (ofso Is Nothing) Then Set ofso = CreateObject("Scripting.FileSystemObject") End If If (ofso.FileExists(a_sFilePath) = True) Then IsExistFileFS = True Else IsExistFileFS = False End If End Function |
利用例です。
1 2 3 4 5 6 7 8 9 10 11 |
Sub IsExistFileFS利用例() Dim a Dim i Dim ofso As FileSystemObject Dim bResult As Boolean a = "C:\aaa\TextDocument.Txt" For i = 0 To 100000 bResult = IsExistFileFS(ofso, a) Next End Sub |
是非活用してください。