パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

Dir関数によるファイル名、フォルダ名(ディレクトリ名)の取得

------------------------------------------------------------------------------------------
※ 本記事はVB4〜6/VBAが対象
Dir関数は、ファイル名やフォルダ名を取得したい場合に使用します。Visual basic, Excel(VBA)ともに
まったく同様に使用することができます。
ただし、Visual Basicではファイル名、フォルダ名を取得する時は、専用に用意されているドライブリストボックス
ディレクトリリストボックス、ファイルリストボックスを使用するのが一般的です。
また、ファイルを開きたい場合は、EXCELでは、それ専用にDialogs, GetOpenFilename というメソッドがあり
通常それらを使います。
Dir関数以外については、別途解説いたします。

VB.NETi以降でのDir関数の使用やファイル名の一覧の取得は、ファイル名の一覧の取得(VB.NET)にあります
のでそちらをご参照下さい。
-------------------------------------------------------------------------------------------

1 Dir関数
いろいろパソコンを使っていると、「あるフォルダの中にある.xlsファイルを検索したい」とか「100M以上の
サイズのファイルだけを検索したい」というようなことが必要になる場合がでてきます。そういう場合に威力
を発揮するのがDirです。

Dir
書式  Dir [ (FileSpec [ ,Attr] ) ]   [ ]は省略可
FileSpecには取得したいファイル名、拡張子などを指定します。ワイルドカードの使用ができます。
たとえば、EXCELファイルだけを検索したいなら、Dir ("*.xls") と書けばいいわけです。
Attr は取得したいファイルの属性を指定します。複数の属性を指定するには各値を合計したものを
指定します。値は以下の通りです。

記号定数 意味
vbNormal 0 通常のファイル
vbHidden 2 隠しファイル
vbSystem 4 システムファイル
vbVolume 8 ボリュームラベル
vbDirectory 16 ディレクトリ(フォルダ)

Dir の使い方は、最初のファイルのマッチング(検索)には、必ずFileSpecを記述して使い、2個目以降は
FileSpec等は省略し、Dir 単独で使います。マッチングするファイルが見つからない時はNullが返されます。

あるディレクトリにある全てのEXCELファイルを検索するには、以下のコーディングが標準形となります。

Filename = Dir ("*.xls", vbNormal) '@
Do While Filename <> ""
'
' 処理
'
Filename = Dir ()
Loop

たとえば、Cドライブにある全てのフォルダ名を取得したければ、@の部分を以下のように記述すれば
いいわけです。
Dirname = Dir ("C:\" ,16)


2 実用例

ある作業用のフォルダをりMOにバックアップしたり、あるいは2箇所(のPC)で作業する場合、フォルダの中身
が同じになっているかどうか確認したり、最新のファイルをバックアップ環境(あるいはもう1台のPCの方)
にコピーしたりしたい場合があります。
そういう時のために2つのフォルダの中身(ファイル)を比較するVBAアプリをEXCELで作りました。
Filecmp.xls EXCEL活用例(EXCEL自作アプリ)からダウンロードできます。
このアプリでファイル名の取得にDir を使用しています。

Filecmp.xls 画面


以下に、PATH1の「ドライブ選択」ボタンを押した時のコードを抜粋しておきます。
動作としては、
(1) InputBoxでドライブ名を変数mypathに取得
(2) 最初のファイル名(フォルダ名)を検索。全てのファイル、フォルダを検索対象にしているためAttrは
    22にしています。
(3) ファイル名もフォルダ名もごちゃまぜに混在した状態で検索してくるので、このIf文では、フォルダ
   の前には[Dir] を付加して、ファイル名とフォルダ名の区別をつけられるようにしています。
   ここで使っているGetAttr関数は、ファイルの属性を調べる関数です。返す値はDir関数のAttrで
   指定する値と同じです。ここでは、16が返った場合、フォルダ(ディレクトリ)として処理しています。
(4) Do While 以降は全ファイル検索のお決まりパターンです。取得したファイル名を順次ListBoxに追加
   していきます。

ちなみに、セルB1に現在検索をかけているフォルダを表示しています。

Sub Sheet1_ボタン1_Click()
Close
start:
Message = "ドライブを指定して下さい。 例) c:"
Title = "ドライブの指定"
mypath = InputBox(Message, Title)           '(1)
If Right$(mypath, 1) = ":" Then GoTo L1
v = MsgBox("ドライブの指定の仕方が不正です")
GoTo start
L1:
Sheets(1).Unprotect
Columns(3).Value = "": Columns(5).Value = "": Columns(6).Value = ""
Columns(4).Value = ""
x = 4
For i = 1 To 4
Sheets(1).Cells(i, 1).Value = ""
Next
Sheets(1).ListBoxes(1).RemoveAllItems
fname = Dir(mypath + "\*", 22)               '(2)
If fname = "" Or fname = "." Or fname = ".." Then    '(3)
Sheets(1).ListBoxes(1).AddItem Text:=fname
ElseIf GetAttr(mypath + "\" + fname) = 16 Then
Sheets(1).ListBoxes(1).AddItem Text:="[DIR]  " + fname
Else
Sheets(1).ListBoxes(1).AddItem Text:=fname
End If

Do While fname <> ""                      '(4)
fname = Dir()
If fname = "" Or fname = "." Or fname = ".." Then
Sheets(1).ListBoxes(1).AddItem Text:=fname
ElseIf GetAttr(mypath + "\" + fname) = 16 Then
Sheets(1).ListBoxes(1).AddItem Text:="[DIR]  " + fname
Else
Sheets(1).ListBoxes(1).AddItem Text:=fname
End If

Loop
Cells(1, 2).Value = mypath

Sheets(1).Protect

End Sub


3 補足(ファイルの属性や、ファイルサイズを調べる関数)
Dir関数でファイルを検索し、マッチしたファイル名を取得したあと、そのファイルにいろいろな処理をする
ことになりますが、その際によく使うかもしれない関数を3つほど補足であげておきます。

取得したファイルの属性やファイルサイズ、作成日を調べる関数です。
GetAtrr ( Filename ) ファイルの属性を調べます。戻り値は上述の通りです。
FileLen ( Filename ) ファイルサイズ(バイト)を調べます。
FileDateTime ( Filename ) ファイルの作成日(または最後の更新日)を調べます。
                戻り値はyear/month/date tt:mm:ss の形です



TopPage > Visual BasIc&Excel活用研究目次