VBA入門
ファイル操作Ⅰ(Dir)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-10-20

第79回.ファイル操作Ⅰ(Dir)


VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、
Dir関数は、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。
引数に指定したファイルが存在するとそのファイル名を返し、存在しないと空欄を返します。



Dir関数

Dir[(pathname[, attributes])]

pathname 省略可能です。
ファイル名を表す文字列式を指定します。
フォルダ名およびドライブ名も含めて指定できます。
引数 pathname に指定した内容が見つからないときは、長さ 0 の文字列 (" ") を返します。
"*"または"?" のワイルドカードを使用できます。
attributes 省略可能です。
取得するファイルが持つ属性の値の合計を表す数式または定数を指定します。
省略すると、標準ファイルの属性になります。

attributesの設定値
定数 内容
vbNormal 0 標準ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システム ファイル。
Macintosh では使用できません。
vbVolume 8 ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
Macintosh では使用できません。
vbDirectory 16 フォルダ
vbAlias 32 エイリアス ファイル。
Macintosh でのみ使用できます。

この値はビット演算に対応するように作成されています。

10進 2進
0 00000000
1 00000001
2 00000010
4 00000100
8 00001000
16 00010000
32 00100000
64 01000000

任意の複数の値を足し算した値は、他の組み合わせと同一になることはありません。
したがって任意の組み合わせを、上記設定値の足し算で指定することが可能となっています。
この場合の足し算は論理演算のOrと同等です。
論理積(And)論理和(Or)と真(True)偽(False)の判定|VBA技術解説
・Trueとは何か、Falseとは何か ・論理積(And) ・論理和(Or) ・Ifステートメントにおける真偽の判定 ・例.指定のフルパスがフォルダかの判定


Dir関数は、pathnameに一致する最初のファイル名を返します。

フォルダ内のすべてのファイルに対して繰り返して処理を実行する場合は、引数を指定せずにDir を実行してください。
一致するファイル名がなくなると、Dir関数は長さ0の文字列 ("") を返します。
ただし、vbDirectory属性を付けてDirを呼び出しても、継続してサブディレクトリが返されることはありません。

複数のファイルを指定するための "*" または "?" のワイルドカードを使用できます。

ファイル名は特定の順序で取得されるわけではありませんので、取得される順番を期待しないようにしてください。


Dir関数の使用例

変数 = Dir("C:\test.xls")
"C:\test.xls"が存在する場合は"test.xls"が、存在しない場合は""が変数に入ります。

変数 = Dir("C:\*.xls")
Cドライブ直下にある、.xlsファイルの先頭のファイル名が入ります。

変数 = Dir("C:\", vbNormal + vbReadOnly + vbHidden)
Cドライブ直下にある、.標準+読取専用+隠しファイルの先頭のファイル名が入ります。

変数 = Dir("C:\test", vbDirectory)
"C:\test"のフォルダが存在する場合は"test"が、存在しない場合は""が変数に入ります。


Dir関数の実践例

Cドライブ直下のエクセルファイルを全て取得
変数 = Dir("C:\*.xls")
Do While 変数 <> ""
  ・・・
  変数 = Dir()
Loop

Cドライブ直下のエクセルファイルを全て取得しています。
注意
拡張子を、.xlsと指定していますが、この場合は、.xls、.xlsx、.xlsm等々
xlsで始まる拡張子全てが対象となります。

サブフォルダだけを取得する
strDir = Dir(パス, vbDirectory)
Do While strDir <> ""
  If strDir <> "." And strDir <> ".." Then
    If GetAttr(パス & strDir) And vbDirectory Then
      Debug.Print strDir 'strDirはフォルダです
    End If
  End If
  strDir = Dir()
Loop

このVBAの解説については以下のページをお読みください。

論理積(And)論理和(Or)と真(True)偽(False)の判定|VBA技術解説
・Trueとは何か、Falseとは何か ・論理積(And) ・論理和(Or) ・Ifステートメントにおける真偽の判定 ・例.指定のフルパスがフォルダかの判定


Dir関数の制限について

Dir関数には、いくつかの制限があります。

・3桁拡張子の指定時の問題
・256バイトを超えるパス名が扱えない
・環境依存文字が扱えない
・特殊なネットワークドライブでエラー
等々の多くの制限があります。

これらの問題に対する詳細な解説は、以下を参照してください。
Dir関数の制限について
・3桁拡張子の指定時の問題 ・256バイトを超えるパス名が扱えない ・UNICODEファイル名が扱えない ・特殊なネットワークドライブでエラー ・Dir関数の制限の最後に


Dir関数の関連記事

以下の記事も参考にしてください。
ファイル一覧を取得する(Do~LoopとDir関数)
・Dir関数 ・Dir関数の使い方 ・ファイルの一覧を取得するマクロVBAコード ・Do~Loopステートメント ・ExcelマクロVBA入門等の対応ページ
Dir関数で全サブフォルダの全ファイルを取得
・Dir関数でサブフォルダも含むファイル一覧を取得するVBA ・ファイル一覧を取得するVBAの使用例と解説 ・Dir関数の関連記事




同じテーマ「マクロVBA入門」の記事

第76回.ファイルダイアログ(FileDialog)
第77回.組み込みダイアログ(Dialogs,xlDialogPrint)
第78回.総合練習問題8
第79回.ファイル操作Ⅰ(Dir)
第80回.ファイル操作Ⅰ(その他)
第81回.総合練習問題9
第82回.RangeのResizeプロパティ
第83回.RangeのOffsetプロパティ
第84回.RangeのAddressプロパティ
第85回.結合セルの扱い
第86回.総合練習問題10


新着記事NEW ・・・新着記事一覧を見る

シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)
新旧マスタの差異比較|Power Query(M言語)入門(2023-02-28)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-26)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-21)
グルーブ内の最小・最大|Power Query(M言語)入門(2023-02-17)
2つのテーブルのマージ|Power Query(M言語)入門(2023-02-15)
「売上」が数値の行のみ取り込む|Power Query(M言語)入門(2023-02-13)
A列のヘッダー名を変更する|Power Query(M言語)入門(2023-02-11)
CSVのA列が日付の行だけを取り込む|Power Query(M言語)入門(2023-02-10)
列数不定のCSVの取り込み|Power Query(M言語)入門(2023-02-09)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ