【ExcelVBA】Dir関数でファイルの存在をチェックする

ExcelVBA
記事内に広告が含まれています。

ファイルがあるかないかを確認するには、Dir関数が便利で簡単です。

Dir関数の考え方

Dir関数は、指定したファイルのファイル名を返します。

最初からファイル名分かっているのに、何でわざわざ調べるの?

と思うかもしれませんが、そうではありません。

ファイル名が返ってくるのは、そのファイルが確かにある(存在している)ときだけなのです。

ファイルがなければ””(空文字)しか返ってこないのです。

Dir関数は、
・値が返ってきたら⇒指定したファイルがあるということ
・””(長さ0の文字列)が返ってきたら⇒指定したファイルがないということ

この事を利用して、ファイルの存在チェックをします。

Dir関数は色々な使い方ができる関数ですが、

ファイルの存在チェックのときは、このように書きます。

Dir(ファイルパス,ファイル属性)

Dir関数:ファイル存在チェックの引数

引数1:ファイルパス

1つ目の引数は、ファイルパスです。

ファイル名がはっきり決まっている場合

例えば、Desktopフォルダ内の「一覧.xlsx」というファイルを調べたいときは、そのファイルパスを書きます。

“C:\Users\ユーザー名\Desktop¥一覧.xlsx

カレントディレクトリがそのファイルの場所になっている場合は、ファイル名だけでもいいのですが、そうでない場合はパスも含めてください。

※カレントディレクトリとは、今作業しているフォルダはここだよ、ということを示すものです。

この例でいうと、

「一覧.xlsx」ファイルが、カレントディレクトリ内にない場合
  ⇒パスを入れる(例:”C:\Users\ユーザー名\Desktop¥一覧.xlsx”)

 

「一覧.xlsx」ファイルが、カレントディレクトリ内にある場合
  ⇒ファイル名だけでOK(例:”一覧.xlsx”)
   パスを入れてもOK(例:”C:\Users\ユーザー名\Desktop¥一覧.xlsx”)

となります。

でも実際には、

あまり深く考えず、最初からパスを含めて書いておけばいいかと思います。

その方が、他の誰が読んでも理解しやすいというメリットがあります。

ファイル名がはっきり決まっていない場合

調べたいファイルが、さっきのように、はっきりと「一覧.xlsx」と言えず、

例えば「一覧」という言葉で始まるファイルがあるかチェックしたいときもあります。

その場合は、

“C:\Users\ユーザー名\Desktop¥一覧*

というふうに、ワイルドカード「*」を使います。

ワイルドカード「*」の意味は、その部分は、何文字でも・どんな文字でもOKという意味なので、

このように書けくことで、「一覧」で始まるファイルという意味になります。

引数2:ファイル属性

2つ目の引数は、必須ではありません。

1つ目の引数で指定したファイルに、さらに条件を追加したいときだけ使います。

例えば、「一覧」で始まるファイル名で、さらに読み取り専用のファイル、という条件を追加したいとき、

Dir(“C:\Users\ユーザー名\Desktop¥一覧*“,vbReadOnly)

という書き方をします。

「vbReadOnly」は実は「1」という番号を意味しています。

なので、「vbDirectory」の代わりに「1」と書いても大丈夫です。

でも「1」という番号を覚えておくのは大変なので、「1」を意味する定数「vbReadOnly」が用意されています。

「vbReadOnly」ぐらいなら、頭の片隅にでも、こんな定数だったなぁと覚えておけますよね。

実際にコーディングするときには、引数の候補が表示されるので、その中からそれを選べばいいだけです。

ちなみに、「vbReadOnly」は定数なので「”」(ダブルコーテーション)で囲む必要はありません。

「vbReadOnly」以外にも定数があるのですが、詳細はMicrosoftのページに載っています。ご参考まで。

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.filesystem.dir?view=net-6.0

Dir関数:ファイル存在チェックの戻り値

最初にお話しした通り、

Dir関数は、そのファイルが確かにある(存在している)ときはファイル名を、ファイルがないときは長さ0の文字列を返してきます。

戻り値によって処理を分けたいときは、このように書きます。

If Dir(“C:\Users\ユーザー名\Desktop\一覧.xlsx”)=”” Then
  MsgBox “ファイルなし”
Else
      MsgBox “ファイルあり”
End If

ファイルのある・なしで、処理を分けることができました。

ちなみに、戻り値は「ファイル名」のみです。パスは含まれません。

上の例だと「一覧.xlsx」と返ってきます。

戻り値の値を使って何かするときは、その点、気をつけてください。

サイト運営者
もぐらっとん

シスエムエンジニア歴15年。フリーランスになって2年。家庭と両立するため在宅で仕事をしています。
RPA(Uipath)開発・運用と、ブログ運営(Wordpress)をしています。
※当ブログとは別に、主婦ブログも運営しています
https://syufumesen.com/

もぐらっとんをフォローする
ExcelVBA
シェアする
もぐらっとんをフォローする
もぐらっとんWEB
タイトルとURLをコピーしました