指定ディレクトリ内のフォルダ名を表示(その1)の詳細

(その1)の詳細
Dir関数の引数としてディレクトリパスをわたすとディレクトリ内のフォルダ名1つを返します。


Sub aaa()

    '「C:\work」フォルダ配下のフォルダ名を1つ表示します。

    MsgBox folder = Dir("C:\work\", vbDirectory)

End Sub
※第二引数には「vbDiretory」もしくは「16」を指定します。
二つ目、三つ目のフォルダ名を取得する場合は、引数をつけません。

Sub bbb()

    '「C:\work」フォルダ配下のフォルダ名を1つ表示します。

    MsgBox Dir("C:\work\", vbDirectory)

    MsgBox Dir  '←二つ目

    MsgBox Dir  '←三つ目

End Sub
※次に表示するフォルダが見つからなくなったらNull文字列("")を返します。
もし、すべてのフォルダを表示したい場合は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

※Dir関数はフォルダ名をかえしてくれますが、「.」「..」という文字列もかえしてきます。
そのため、「.」と「..」には処置が必要です。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がかえしたものがフォルダなのかファイルなのかを判断をしたいです。
判断する手がかりとして「ファイルまたはフォルダの属性」があります。

定数内容
vbNormal0通常ファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システムファイル (Windows専用)
vbDirectory16フォルダ
vbArchive32アーカイブファイル (Windows専用)
vbAlias64エイリアスファイル (Mac専用)
この中でフォルダの16は属性値の16ビット目がONになっているというようなことらしいです。
読み取り専用フォルダの場合は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

以上です。