ヒガサラblog

サラリーマン向けに、仕事を効率良く進めていくための方法についてご紹介しています。プログラミングから対人スキルまでを幅広く掲載中。

ヒガサラblog

【VBA】Dir関数の特性を詳細解説!ファイル確認や一括処理に超便利!

f:id:yshgs_elec:20210125230318j:plain

 「フォルダの中身をすべてエクセルシート上に出力したい。」

 「指定した拡張子のファイルをすべて削除したい。」

こんな作業をエクセルVBAで行うとき、Dir関数を使うと非常に便利です。

 

この記事では、Dir関数の基本的な特性を、事例を用いて詳細解説していきます。

 

※あくまでも基礎講座の位置づけです。

実践編は後日、ご紹介させていただきます。

 

それでは早速やっていきます!

 

スポンサーリンク

 

Dir関数の特性解説

特性①:指定したファイル名を出力

まずはじめに今回の記事の主人公であるDir関数についてご紹介しておきます。

Dir関数とは、指定したファイルやフォルダの名前を出力してくれる関数です。

 

例えばデスクトップ上にあるtestというフォルダの中にtest.txtというファイルがあったとしましょう。

以下のような状態ですね。

f:id:yshgs_elec:20210204154141j:plain

 

このとき、以下のようなVBAコードを実行すると・・・

aaa = Dir("C:\Desktop\test\test.txt")
MsgBox aaa

このようなメッセージが出力されます。

f:id:yshgs_elec:20210204154204j:plain

「え?なんの意味があるの?」

ってなりますよね。

 

正直こんな使い方はしませんので、ここは覚えておかなくてもOKです。

 

本題はここからです。

 

スポンサーリンク

 

特性②:ファイル指定はあいまいでOK

 

 では次にこんなコードを実行してみましょう。

aaa = Dir("C:\Desktop\test\")
MsgBox aaa

※先ほどと違う点は、test.txtというファイル名を指定していないというところです。

f:id:yshgs_elec:20210204154204j:plain

先ほどとまったく同じ結果が出力されました。

 

「Dir関数とは、指定したファイルやフォルダの名前を出力してくれる関数です。」

と説明しましたが、ファイルを指定する際は、適当に指定しても何かしら手当たり次第に出力してくれるのです。

これが覚えておいてほしいDir関数の特徴一つ目です。

(乱暴な説明ですが、ざっくりこんなイメージを持っておけばOKです。)

 

スポンサーリンク

 

特性③:繰り返すと別ファイルを拾ってくる

次に状況を少し変えてみましょう。

次は先ほどと同じフォルダの中にtest2.txtというファイルを追加しました。

f:id:yshgs_elec:20210204154233j:plain

 

この状況で以下を実行すると・・・

aaa = Dir("C:\Desktop\test\")
MsgBox aaa
aaa = Dir
MsgBox aaa

 

まずは先ほどと同じようにtest.txtが出力されました。

(こいつが一回目のMsgBoxです。)

f:id:yshgs_elec:20210204154204j:plain

OKを押すと次は、test2.txtが出力されました。

f:id:yshgs_elec:20210204154253j:plain

このようにDIr関数は、一度使った後にもう一度なにも指定しないで使用すると、同じ条件内で先ほど拾ったファイルとは別のファイルをまた拾ってきてくれるのです。

これが、覚えておいてほしいDir関数の特徴二つ目です。

 

スポンサーリンク

 

特性④:拾うものがなくなったら空を出力する

次にまったく同じ状況で以下のコードを実行してみましょう。

aaa = Dir("C:\Desktop\test\")
MsgBox aaa
aaa = Dir
MsgBox aaa

aaa = Dir
MsgBox aaa

現在フォルダの中には2つしかファイルがありません。

この状況で3回目のDirではなにが出力されるのか見てみましょう。

一回目(想定通り)

f:id:yshgs_elec:20210204154204j:plain

二回目(想定通り)

f:id:yshgs_elec:20210204154253j:plain

三回目(!?)

f:id:yshgs_elec:20210204154322j:plain

 

なにも出力されませんでしたね。

つまり、Dir関数は拾うものがないときは空(VBA上でいう"")を出力してきます。

これが、覚えておいてほしいDir関数の特徴三つ目です。

 

特性⑤:基本はファイルだけ(フォルダは無視)

もう少し変えてみましょう。

次は先ほどの状況から追加でひとつフォルダを作っておきましょう。

f:id:yshgs_elec:20210204154336j:plain

さて、ここで問題です。

この状況で以下のコードを実行するとどうなるでしょうか?

aaa = Dir("C:\Desktop\test\")
MsgBox aaa
aaa = Dir
MsgBox aaa

aaa = Dir
MsgBox aaa

 

Dirが三回あるからフォルダのTESTも出力されるような気がしますが、この場合は先ほどと同じく、

一回目がtest.txt

二回目がtest2.txt

三回目が空

で出力されます。

 

 

なぜか?

Dir関数は特に何も指定をしていない場合は、ファイルだけを出力してきます。

 

スポンサーリンク

 

特性⑥:フォルダ取得もできるけど要注意

ではどうすればフォルダも出力してくれるのか?

 

フォルダも一緒に出力したい場合は最初のDirの指定を以下のように記述します。

aaa = Dir("C:\Desktop\test\",vbDirectory)

これでフォルダも一緒に拾ってくれるようになります。

要はvbDirectoryを付けることで、フォルダもとってきてね~という指示に変わるわけです。

 

簡単ですね。

しかしながら注意点が二つあります。

◆通常は見えていないフォルダも拾ってしまう。

◆フォルダだけ指定しているわけではなく、ファイルも一緒に拾われる

 

この注意点を説明するために以下のコードを実行してみましょう。

(状況は先ほどと同じでファイルが二つ、フォルダが一つある状態です。)

f:id:yshgs_elec:20210204154336j:plain

aaa = Dir("C:\Desktop\test\")
MsgBox aaa
aaa = Dir
MsgBox aaa

aaa = Dir
MsgBox aaa

aaa = Dir
MsgBox aaa

aaa = Dir
MsgBox aaa

 

一回目

f:id:yshgs_elec:20210204154404j:plain

二回目

f:id:yshgs_elec:20210204154417j:plain

こいつら( . & .. )が先ほど言った注意点一つ目です。

こいつらは、【.】が今いるフォルダ、【..】ひとつ上の階層のフォルダを意味しています。

通常、フォルダを開いて中身をみてもこんなものはないと思いますが、PC上のすべてのフォルダに実はこいつらは隠されているのです。

※Dir関数は使い方によっては非常に便利なんですが、こうゆう面倒なやつを処理する必要があります。まぁその辺は次回の実践編でご紹介しましょう。

 

 

三回目

f:id:yshgs_elec:20210204154430j:plain

四回目

f:id:yshgs_elec:20210204154204j:plain

五回目

f:id:yshgs_elec:20210204154253j:plain

 

三回目以降は狙い通り、指定したフォルダ内に入っているデータを順番にとりだしてくれていますね。

 

「フォルダだけ取り出したい場合はどうすればいいの?」

こんな疑問が当然わいてくるとおもいますが、残念ながらDir関数をシンプルに使っただけでは、フォルダだけを取り出すことはできません。

すこし工夫をする必要があります。

 

とはいえ、そこを説明し始めると基礎講座の域を超えてしまいそうなので、ここも次回の実践編でご紹介します。

 

スポンサーリンク

 

おわりに

というわけで今回はDir関数の基本的な特性を詳細解説していきました。

すこし複雑ですが、使いこなすことができれば業務効率を格段にあげることができる関数です。

 

今回はあくまで基礎講座編ですので、ぜひ後日公開する実践編もご覧ください。

 

このように私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。

・日々の残業時間を減らしたい。

・業務をもっと効率的にこなしたい。

・もっと勉強する時間を作りたい。

こんな思いを持っている人は、ぜひ他の記事も見てみてくださいね。

 

この記事が役に立ったという方は、ぜひ応援よろしくお願いします。

 ↓ 応援ボタン

にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

 

それではまた!