Excel VBA Dir関数(1)基本仕様

Excel マクロ、VBA

スポンサーリンク

今回は、Excel VBAのDir関数について書いてみる。
私もこれをそんなに多用はしないが、それなりに大事な関数かとは思う。

Dir関数は、ファイルやフォルダの存在を調べるのだが

Dir( ファイル名やフォルダ名 , 属性)  As   String

というようにして、返り値として文字列を返す関数だ。

しかしこれ、属性の部分は省略できるし、ちょっと不便で混乱するばかりのことが多い。


属性
は、基本的には省略し、フォルダを指定したい時だけvbDirectoryを指定する、と覚えておくのも良いかと思う。

属性の指定は不便

標準ファイルが必ず含まれてしまう

では、この属性の何が不便なのか。
前回の記事で取り上げたGetAttr関数のように、属性には、読み取り専用(vbReadOnly)とか隠しファイル(vbHidden)などを指定できる。

Excel VBA 配列について(4)要素数が不定の配列

名前 属性
vbNormal (既定) 0 標準ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システム ファイル
vbVolume 8 ボリューム ラベル
vbDirectory 16 フォルダ

 

具体的には上表の通り属性を指定できるが、ひとまず読み取り専用vbReadOnly(=1)に注目する。

そして、Dir関数でvbReadOnlyを指定しても、これは内部的には
vbReadOnly(1) + vbNormal(0)
を指定したことになってしまう。

合計が1になるという意味では、vbReadOnlyvbReadOnly+vbNormalも同じなわけだが、これがマズい。

つまりこれは、vbReadOnly属性に指定しても、「読み取り専用のファイル」または「普通のファイル」を両方とも探してくることになるわけだ。

だから、「読み取り専用のファイルだけを抽出したい」といった用途には使えない。

属性にフォルダ=vbDirectoryを指定した場合も、フォルダだけでなくファイルまで全て検索されてしまう。

それらの、特定属性だけの抽出をしたければ、前回の記事のGetAttr関数を併用しなければならない。

属性を指定した検索の不便さの具体例(ソースコード)は、後ほど挙げることにする。

標準ファイルのみ検索しても読み取り専用ファイルが含まれてしまう

ちょっとこれは調べても分からなかったし、間違いがあったら教えていただけると幸いだが、属性を指定しないDir関数の動作に不具合ではないかというものがある。

属性を指定せず
Dir(“D:\ダウンロード\読み取り専用.xlsx”)
などとした場合、標準ファイルだけが検索されて、読み取り専用や隠しファイルなどは検索されない仕様のはずなのだが、私が試したところ読み取り専用ファイルは検索結果に含まれてしまう。

隠しファイルとかは検索されないのだけどね。

だからやっぱり、Dir関数を、厳密な属性の検索まで含めて使用するのはやめた方が良いだろう。
もっと大味に、ファイル・フォルダがあるかないかを調べるだけの用途に使えば良いかと思う。

Dir関数の返り値

Dir関数の返り値は文字列だけど、これはズバリ、そのファイル名・フォルダ名をそのまま文字列として返す。

フォルダの場合

まずフォルダなら、属性vbDirectoryは省略できないので

Dir(“D:\ダウンロード\週刊少年マガジン“,vbDirectory)

のように書くが、この結果はフォルダ名の「週刊少年マガジン」が返される。

ファイルの場合

次に、ファイル名を指定する時は、属性を省略し

Dir(“D:\ダウンロード\普通のファイル.xlsx“)

のように書き、この結果はファイル名の「普通のファイル.xlsx」が返される。

ファイル・フォルダが存在しない場合

実際に存在しないファイルやフォルダを指定すると、

Dir(“D:\ダウンロード\存在しないファイル.xlsx”)

といった指定に対し、結果は空の文字列が返される。

これらの性質を使って、指定したファイルを開いたりして扱う前に存在チェックをするということで、次のソースコードのような使い道が多いかと思う。

この他に、沢山あるファイルを全て書き出すような用途に使われることも多いので、それは次回の記事で紹介する。

Excel VBA Dir関数(2)ファイル・フォルダを複数検索する

読み取り専用など属性を指定した場合

先ほど、フォルダの場合でない限り属性の指定は不要と書いたが、では例えば、読み取り専用属性なんか付いていない普通のファイルを

Dir(“D:\ダウンロード\普通のファイル.xlsx“, vbReadOnly)

とやってみるとどうなるか。

vbReadOnlyが指定されているので、普通のファイルは検索結果として返ってきてはいけないはずだが、これの結果は「普通のファイル.xlsx」が返されてしまう。

これでは、読み取り専用のファイルだけを抽出するとかには使えないということだ。

スポンサーリンク