GetAttr関数と"And vbDirectory"との関連(ビット演算)について?

Question 053k 拙著「組み方講座」 Previous Next
135ページ [1-6-10図] ◆ 環境・・ Excel 2002 & Windows XP
詳細は こちら
初めまして。VBA初心者です。
6行目のGetAttr関数で “And vbDirectory” とする必要性が理解できず、インターネットで調べたところ、『GetAttr関数では、ファイルの属性が取得できます。実際の値は
複数の属性を表意していることがあるので And演算子を使ってビット単位比較の必要があります。』 とありましたが言葉が難しく、解りませんでした…。
ここでの “And vbDirectory” の意味を教えて下さい。 よろしくお願い致します。
Answer   Copyright (C) 2005.5.12 永井善王
拙著「ExcelVBAマクロ組み方講座」をご購読、ありがとうございます。
[1-6-10図]のマクロは下記のとおりで、6行目の If文の中にある And vbDirectory についてのご質問ですね。
Private Sub フォルダ名とサブフォルダ名を取得してシートにセットする()
  貼付行 = 2                                  '貼付用の行カウンタをセット
  取得名 = Dir(親フォルダパス, vbDirectory)   'フォルダ名を取得する
  Do While 取得名 <> "": Debug.Print 取得名
    If 取得名 <> "." And 取得名 <> ".." Then '現在フォルダ、親フォルダでなければ
      If (GetAttr(親フォルダパス & 取得名) And vbDirectory) = vbDirectory Then
                                             'フォルダか
        Cells(貼付行, 1) = 親フォルダパス & 取得名 & "\" '取得したフォルダへのパス
        貼付行 = 貼付行 + 1
      End If
    End If
    取得名 = Dir                            '次の名前を取得する
  Loop
End Sub
「インターネットで調べて得られた解説文の言葉を理解できないので」とのこと、ご自分で出来ることをやった上でのご質問、とても好感が持てます。 順に解いていきましょう。
GetAttr関数は本書137ページの解説にあるとおり、ファイルまたはフォルダの「属性を表す整数」の
合計値を返してくれます。 「属性を表す整数」とは、本書の解説にもありますが、下表の値を組み合わせたものになります。
定数 内容
vbNormal 0 通常ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システムファイル (Windows専用)
vbDirectory 16 フォルダ
vbArchive 32 アーカイブファイル (Windows専用)
vbAlias 64 エイリアスファイル (Mac専用)
返してくれる値は「合計値」ですから、たとえば、フォルダであっても、読み取り専用でないなら '16' ですが、読み取り専用になっていると 16 + 1 で '17' となります。

And演算子は、その前にある値と、後ろにある値をビット単位で比較し、双方ともオンであるビットが存在するときに演算結果として 真(True)を返してくれます。
右図の場合、
1のビットは片方だけがオンですが、16のビットは双方ともオンですから、演算結果としては Trueが返され、フォルダであることを意味します。

以上で“And vbDirectory” の意味 の解説を終わりますが、6行目は If文ですから、= 演算子により、その左辺の値と右辺の値が等しい場合に次行のコードを実行することになります。日本語的に表現しますと、
GetAttr関数で属性を表す整数の合計値を取得して定数vbDirectoryとビット演算し、その結果が定数vbDirectoryと等しい場合は
となります。 これでもまだ分かりにくいでしょうが、じっくり読み直すなりして理解してください。

 

Excel VBA Macro