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技術解説
And演算子、Or演算子は、2つの数式内のビット単位の比較を行います、そして、IfステートメントのThenは、Trueの時と言うより、False以外の時に実行されます。何を言っているのか分かりずらいと思いますので、順に解説します。Trueとは何か、Falseとは何か True、Falseを数値で表すと、


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技術解説
And演算子、Or演算子は、2つの数式内のビット単位の比較を行います、そして、IfステートメントのThenは、Trueの時と言うより、False以外の時に実行されます。何を言っているのか分かりずらいと思いますので、順に解説します。Trueとは何か、Falseとは何か True、Falseを数値で表すと、


Dir関数の制限について

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

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

これらの問題に対する詳細な解説は、以下を参照してください。
Dir関数の制限について
Dir関数は、VBAでフォルダ・ファイルの存在確認や一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。


Dir関数の関連記事

以下の記事も参考にしてください。
ファイル一覧を取得する(Do~LoopとDir関数)
マクロVBAで他のブック(ファイル)を扱う時、まず問題となるのがファイル名です。ファイル数が常に同じでファイル名も変化しなければ良いのですが… ファイル数もファイル名も決まっていない場合は、まずはファイルの一覧を取得する必要があります。ファイル名を取得するには、Dir関数を使います。
Dir関数で全サブフォルダの全ファイルを取得
指定フォルダ以下の全サブフォルダ内の全ファイルを取得する場合、通常はFileSystemObjectの再帰モジュールで実現しますが、これをDir関数だけで、かつ、再帰ではなく二重ループで実現しています。FileSystemObjectの再帰プロシージャーについては、エクセルでファイル一覧を作成 こちらをご覧ください。




同じテーマ「マクロ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 ・・・新着記事一覧を見る

ピッボットテーブルって便利だよね|還暦のVBA(2021-10-18)
還暦のVBA:VBAまでたどりつけるか… (2021-09-29)
VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.並べ替え(Sort)|VBA入門




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


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



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