2022/06/13

ファイルの存在確認

ファイルの存在を確認する方法には、「Dir関数」と「FileSystemObjectのFileExistsメソッド」の2種類があります。探したいファイル名(pathname)をパス付で指定します。
構文戻り値特徴
DirDir[(pathname[,attributes])]一致する最初のファイル名ワイルドカード可能
FileExistsFileSystemObject.FileExists(pathname)True(有る) 又は False(無い)固定ファイル名のみ
図1


Dir関数は、第二引数にファイル属性(attributes)を指定でき、属性で絞って探索することが出来ます。
またワイルドカードとして「*(アスタリスク:複数の文字)」 と「?( クエスチョンマーク:1 文字) 」が使用でき、第一引数の無い「Dir()」を続けて実行することで複数のファイル名の存在を確認することが可能です。

Dir関数の一般的な使用例は以下図2となります。
  1. Sub its001_01()
  2.  Dim Fpath As String   '←ファイルのパス
  3.  Dim Fname As String   '←ファイル名
  4.  Fpath = ThisWorkbook.Path
  5.  Fname = "Sample.xlsx"
  6.  If Dir(Fpath & "¥" & Fname) = Fname Then
  7.   MsgBox Fname & "は存在します"
  8.  Else
  9.   MsgBox Fname & "は存在しません"
  10.  End If
  11. End Sub
図2


05~06行目でパス名・ファイル名を指定し、08行目でDir関数を実行します。その戻り値がファイル名(変数Fname)であれば「ファイルは存在する」ことになります。

05行目で指定しているパス名は、ThisWorkbook.Pathと「自分のPC内」のため特にエラーは出ません。しかしこのパスを「社内ファイルサーバ」などを指定すると状況は変わります。
例えばファイルサーバであれば「Fpath = "¥¥Server¥Excel"」等となりますが、サーバー名が間違っていたり、通信が出来ない状態だったりした場合には実行時エラー(エラー番号=52)が発生します(インターネット先と間違えhttps://・・・などとしてしまった場合も同様です)。
ファイルパスの記述ミス等の種類とエラーの出方を図3にまとめます。
パス名の内容Err.Number
正常0
ドライブ名が違う0
サーバー名が違う52
フォルダー名が違う0
ファイル名が違う0
URL形式52
通信不可52
図3


そこで、エラーが出た時は「設定したパスが間違えている」と判断するのが図4です。エラーが出た時には33行目で別なコメントを出します。
  1. Sub its001_02()
  2.  Dim Fpath As String   '←ファイルのパス
  3.  Dim Fname As String   '←ファイル名
  4.  Dim buf As String    '←Dir関数の戻り値
  5.  Fpath = ThisWorkbook.Path
  6.  Fname = "Sample.xlsx"
  7.  On Error Resume Next
  8.   buf = Dir(Fpath & "¥" & Fname)
  9.   If Not Err.Number = 0 Then
  10.    MsgBox "パス(" & Fpath & ")が間違っています"
  11.   ElseIf buf = Fname Then
  12.    MsgBox Fname & "は存在します"
  13.   Else
  14.    MsgBox Fname & "は存在しません"
  15.   End If
  16.  On Error GoTo 0
  17. End Sub
図4


FileSystemObjectのFileExistsメソッドでは、引数に指定したファイルが存在するときTrueを返します。FileExistsを使った例は図5になります。
なおFileExistsでは、図3のようにサーバー名や通信不可の場合でもエラーは発生せず、全て「False(ファイルは存在しない)」となるため「On Error Resume Next」でのエラー番号取得・仕訳けは不要となります(逆に、仕訳けが不可能なメソッドとも言えます)。
  1. Sub its001_03()
  2.  Dim Fpath As String   '←ファイルのパス
  3.  Dim Fname As String   '←ファイル名
  4.  Dim Fso As Object    '←ileSystemObjectオブジェクト
  5.  Fpath = ThisWorkbook.Path
  6.  Fname = "Sample.xlsx"
  7.  Set Fso = CreateObject("Scripting.FileSystemObject")
  8.  If Fso.FileExists(Fpath & "¥" & Fname) Then
  9.   MsgBox Fname & "は存在します"
  10.  Else
  11.   MsgBox Fname & "は存在しません"
  12.  End If
  13.  Set Fso = Nothing
  14. End Sub
図5


アプリ実例

ブックを開いた時に自動的にバックアップを取る
回転させた画像をシートに貼り付ける
CSVファイルでデータを読み書きする月間予定表
アンケートの回収と集計方法
Excelで作った日報をPDFでそのままメール送信
共有資料の登録と閲覧ができるサーバーシステム
図形カレンダーをクリックし日付入力
ExcelからAccessデータベースを作成・操作