指定ディレクトリ内のフォルダ名を表示(その1)の詳細
(その1)の詳細
Dir関数の引数としてディレクトリパスをわたすとディレクトリ内のフォルダ名1つを返します。
Sub aaa() '「C:\work」フォルダ配下のフォルダ名を1つ表示します。 MsgBox folder = Dir("C:\work\", vbDirectory) End Sub |
二つ目、三つ目のフォルダ名を取得する場合は、引数をつけません。
Sub bbb() '「C:\work」フォルダ配下のフォルダ名を1つ表示します。 MsgBox Dir("C:\work\", vbDirectory) MsgBox Dir '←二つ目 MsgBox Dir '←三つ目 End Sub |
もし、すべてのフォルダを表示したい場合はNull文字になるまでループさせます。
Sub ccc() Dim folName As String folName = Dir("C:\work\", vbDirectory) MsgBox folName '一つ目 'Dir関数が""を返すまでループ Do While folName <> "" folName = Dir MsgBox folName '二つ目以降 Loop End Sub |
そのため、「.」と「..」には処置が必要です。if分を追加します。
Sub ddd() Dim folName As String folName = Dir("C:\work\", vbDirectory) 'Dir関数が""を返すまでループ Do While folName <> "" If folName <> "." And folName <> ".." Then MsgBox folName '←追加if文 folName = Dir '←最後に空白を表示させないため、ここにもってきました。 Loop End Sub |
これでフォルダのみ表示できるとおもいきや、これでは以下の条件のときファイルが表示されてしまいます。
・指定したディレクトリ内にフォルダが存在しない、かつ
・指定したディレクトリ内にファイルが存在する
そのため、Dirがかえしたものがフォルダなのかファイルなのかを判断をしたいです。
判断する手がかりとして「ファイルまたはフォルダの属性」があります。
定数 | 値 | 内容 |
vbNormal | 0 | 通常ファイル |
vbReadOnly | 1 | 読み取り専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システムファイル (Windows専用) |
vbDirectory | 16 | フォルダ |
vbArchive | 32 | アーカイブファイル (Windows専用) |
vbAlias | 64 | エイリアスファイル (Mac専用) |
読み取り専用フォルダの場合は1ビット目と16ビット目がONになってることになります。
そのため、フォルダかどうかを判断するには以下のようにします。
[1]Dir関数戻り値の属性値を取得する
(GetAttr関数を使います。引数に対象のファイルもしくはフォルダを指定すると属性値をかえしてくれます。)
↓
[2]取得した属性値と16(16ビット目のみON)を論理積する
※論理積とは以下のようなことです。
1と0を論理積すると0となる
0と0を論理積すると0となる
1と1を論理積すると1となる
もし、取得した属性値の16ビット目がOFFなら論理積の結果はすべてのビットがOFFの値(0)になります。
もし、取得した属性値の16ビット目がONなら論理積の結果は16ビット目のみONでそれ以外はOFFの値(16)になります。
(論理積はAnd演算子を使います。)
↓
[3]論理積の結果が16ならフォルダと判明
(if文で比較します。)
Sub eee() Dim folName As String folName = Dir("C:\work\", vbDirectory) Dim zokusei As Integer Dim enzan As Integer Do While folName <> "" zokusei = GetAttr("C:\work\" & folName) '←folNameの属性を取得する enzan = zokusei And 16 '←enzanに16(フォルダ)との論理積の結果をいれる If enzan = 16 Then '←enzanが16(フォルダ)だったら If folName <> "." And folName <> ".." Then MsgBox folName End If folName = Dir Loop End Sub |
以上です。