Excel Dir関数 存在しないファイル・フォルダが「存在している」と判定される理由(Excel VBA)

【本日のミッション】

エクセルでDir関数を使ってファイル(フォルダ)の有無を確認したところ、ファイル(フォルダ)が存在しないのに「存在します!」と判定された理由を解明せよ。

ミッションの概要

Dir関数を使ってファイルが存在するかどうかを確認しようとしたところ、ファイルの指定を忘れてしまった。(参考:エクセル Dir関数 を使ってファイルの存在(有無)を確認する(Excel VBA)

なのに・・・・

「ファイルは存在します!」

と、ウソの判定結果が返ってきてしまった。この謎を解明せよ、というのが今回のミッションです。


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

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

Dir関数でファイルの有無を確認するときは、下記のようなプロシージャにします。

(参考:エクセル Dir関数 を使ってファイルの存在(有無)を確認する(Excel VBA)

ファイル指定が空文字 “” になってしまう可能性があるときは、赤文字部Or fn = “”」を追加しておきます。

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

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

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

指定したファイル名が空欄のため「ご指定のファイル「」は存在しません。」と、正しい判定結果が返ってくるようになります。


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

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

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

Dir関数は、第1引数にファイル・フォルダのパスを指定します。(参考:Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)

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

今回のように、第1引数に空文字 “” を指定してしまったらどうなるのでしょうか。

Dir("")

この場合は、第1引数にはエクセルの「既定のローカルファイルの保存場所」のパスが指定されます。

第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)
Excel Dir関数 存在しないファイル・フォルダが「存在している」と判定される理由(Excel VBA)

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