| すぐマク YNxv91831 | Home | Search | Contents | Gallery | Introduction | Service | Support | What's New! |
| GetAttr関数と"And vbDirectory"との関連(ビット演算)について? |
|
|
||||||||||||||||||||||||
|
拙著「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ページの解説にあるとおり、ファイルまたはフォルダの「属性を表す整数」の合計値を返してくれます。 「属性を表す整数」とは、本書の解説にもありますが、下表の値を組み合わせたものになります。 |
||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
返してくれる値は「合計値」ですから、たとえば、フォルダであっても、読み取り専用でないなら '16' ですが、読み取り専用になっていると 16 + 1 で '17' となります。 And演算子は、その前にある値と、後ろにある値をビット単位で比較し、双方ともオンであるビットが存在するときに演算結果として 真(True)を返してくれます。
右図の場合、1のビットは片方だけがオンですが、16のビットは双方ともオンですから、演算結果としては Trueが返され、フォルダであることを意味します。 以上で“And vbDirectory” の意味 の解説を終わりますが、6行目は If文ですから、= 演算子により、その左辺の値と右辺の値が等しい場合に次行のコードを実行することになります。日本語的に表現しますと、 GetAttr関数で属性を表す整数の合計値を取得して定数vbDirectoryとビット演算し、その結果が定数vbDirectoryと等しい場合は となります。 これでもまだ分かりにくいでしょうが、じっくり読み直すなりして理解してください。 |
| http://www.geocities.jp/happy_ngi/ | Home | Contents | Gallery | Introduction | Service | Support | What's New! |