エクセル Dir関数 を使ってファイルの存在(有無)をチェックする(Excel VBA)

【本日のミッション】

エクセルでDir関数を使ってファイルの存在(有無)をチェックせよ。

ミッションの概要

エクセルでDir関数を使ってファイルが存在するかどうかをチェックせよ、というのが今回のミッションです。

(参考:エクセル FileSystemObject を使ってファイルの存在(有無)をチェックする(Excel VBA))


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

ファイルの準備とプロシージャ

Excelマクロ有効ブック(.xlsm)のファイルを新規作成します。

そのファイルのシートに下記の通り、ファイルパスを指定するセル(A3)を準備します。

ファイルパスには、存在を確認したいファイルのフルパスを入力します。

このシートをアクティブにした状態で、Alt+F11でVsual Basic Editerを起動します。

[挿入]-[標準モジュール]で新規モジュールを作成し、下記の通りコードを記入します。

Sub ファイルの有無を確認()
    '【変数】
    Dim ws As Worksheet '処理対象シート
    Dim fn As String    'ファイルパス
    
    '■変数セット
    Set ws = ActiveSheet    '変数ws=アクティブシートをセット
    fn = ws.Range("A3")     'ファイルパス

    '■ファイル存在確認
    If Dir(fn) = "" Then
'    If Dir(fn) = "" Or fn = "" Then    ’ファイル指定が空欄になる可能性がある場合
        MsgBox "ご指定のファイル「" & fn & "」は存在しません。"
    Else
        MsgBox "ご指定のファイル「" & fn & "」は存在します!"
    End If 
End Sub  

「Sub ファイルの有無を確認() 」プロシージャのどこかにカーソルを置いてF5キーをクリックしてください。

ファイルが存在する場合は、「ご指定のファイル「〇〇〇」は存在します!」と表示されます。


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

ファイルが存在しない場合は、「ご指定のファイル「〇〇〇」は存在しません。」と表示されます。


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

■■■スポンサーリンク■■■

Dir関数とは

Dir関数は、第1引数に指定したファイル・フォルダが存在する場合、パスを除いたファイル名・フォルダ名を返します。存在しない場合は長さ0の文字列 ”” (空欄)を返します。

Dir(ファイル・フォルダのパス,ファイル・フォルダの属性)

Dir (“C:\VBA\Dir関数検証\02_標準ファイル.xlsx”)  の場合

  • ファイルが存在する場合(ファイル名を返す)→  02_標準ファイル.xlsx
  • ファイルが存在しない場合(空欄を返す)      →  ””

第1引数にはワイルドカードを使用することができるので、取得したいファイル名・フォルダ名の幅を広げることができます。

Dir(”C:\VBA\Dir関数検証\*.*“)

参考:ワイルドカードとは。使い方いろいろ。(Excel)

引数の指定には下記注意事項があります。
このページの最後でご説明していますのでご覧ください。

  • 第1引数の指定拡張子が3文字になる場合の注意点
  • 引数のファイル(フォルダ)のパスが256バイトを超えるとエラーになる
  • 第1引数に空文字””を指定した場合の注意点

第2引数に下記定数(値)を指定することで、特定の属性のオブジェクトのみを取得の対象とすることができます。

定数属性
vbNormal (既定)0標準ファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システム ファイル
vbVolume8ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
vbDirectory16フォルダ
vbAlias64エイリアスファイル

※4、8はMacでは使えません。また、64はMacintoshのみ使えます。

【Dir関数について参考ページ】
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
Dir関数が取得するファイルの順番

【FileSystemObject を使ってファイルの存在(有無)をチェックする方法はコチラ↓】
エクセル FileSystemObject を使ってファイルの存在(有無)をチェックする(Excel VBA)

第1引数の指定拡張子が3文字になる場合の注意点

Dir関数では、3文字の拡張子を指定する時に注意しないといけない点があります。

Dir(”C:\VBA\Dir関数検証\*.xls")

とした場合、「*.xls」だけではなく「*.xlsx」「*.xlsm」の拡張しファイルも取得されてしまいます。

Dir関数は3文字の拡張子を指定した時、「3文字の拡張子から始まる拡張子」として処理してしまいます。

↓Dir関数は、勝手にこういう拡張子指定だと判断します。

Dir(”C:\VBA\Dir関数検証\*.xls*")

「.xls」のみを取得したい場合は、下記の条件式で除外しましょう。

Do While fn <> ""        
    If LCase(fn) Like "*.xls" Then
        Cells(t_row, 1) = fn   
        t_row = t_row + 1      
    End If
    fn = Dir()    
Loop

引数のファイル(フォルダ)のパスが256バイトを超えるとエラーになる

Dir関数の引数のファイル(フォルダ)パスが256バイトを超えてしまうと、下記エラーが表示されるのでご注意ください。

実行時エラー '53': ファイルが見つかりません。

第1引数に空文字 ”” を指定した場合の注意点

Dir関数は、第1引数にファイル・フォルダのパスを指定しますが、何らかの不具合があって、第1引数が空文字 ”” になってしまったらどうなるのでしょうか。
(例:ファイルパスを参照するセルが空欄)

Dir("")

この場合は、エクセルの「既定のローカルファイルの保存場所」のパスが指定されます。第1引数を指定していないので、結果は「長さ0の文字列 ”” (空欄)」が返ってくると思ったら大間違いです。思いがけない間違いにつながるので気を付けましょう。

第1引数に空白が指定される可能性がある場合は、If関数で除外しておきましょう。

If Dir(fn) = "" Or fn = "" Then
    MsgBox "ご指定のファイル「" & fn & "」は存在しません。"

「既定のローカルファイルの保存場所」のパスは[ファイル]-[オプション]の[保存]でご確認ください。

【参考】

指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
エクセル Dir関数 を使ってファイルの存在(有無)をチェックする(Excel VBA)
エクセル FileSystemObject を使ってファイルの存在(有無)をチェックする(Excel VBA)

■■■スポンサーリンク■■■