GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問

前回お話ししました

フォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)

の続編です。

If GetAttr(pt & "\" & buf) And vbDirectory Then

にて、GetAttr関数の後ろに「And vbDirectory」となるのが疑問でした。

■GetAttrとは

そもそもGetAttrとはどういうものなのでしょうか?

前回もお話しした通り、「buf = Dir(pt & “\” & “*.*”, vbDirectory)」と、Dir関数だけではフォルダだけではなくファイル名は、謎の”.”や”..”なんて文字も取得してしまいます。

取得してきたものの中から、「フォルダ」のみを見つけ出してくれるのがこの関数です。

GetAttr関数はファイルまたはフォルダの属性を、整数 (Integer型) で返してくれます。

定数 説明
vbNormal(規定値) 0 標準ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システム ファイル
vbVolume 8 ボリューム ラベル
vbDirectory 16 フォルダ
vbArchive 32 アーカイブ
vbAlias 64 エイリアス ファイル

※4、8、32はMacでは使えません。また、64はMacintoshのみ使えます。

GetAttr(pt & “\” & buf)

で取得したものがフォルダなら、「16」を返してくれます。

しかし、このフォルダに隠しファイルの属性がセットされていたら

vbHidden 隠しファイル(2)+vbDirectory フォルダ(16)=18

18」を返します。GetAttrに続き、厄介な関数です。

それを解決してくれるのが「And」なのです!!

■スポンサーリンク

■And vbDirectoryとは

では、その後ろにある「And vbDirectory」とは何なのでしょう?

今まで自分の辞書にあるVBAコードの書き方としては

GetAttr(pt & “\” & buf) = vbDirectory

と「=」イコールを使いたいところなのですが、わざわざ「And」を使っているのには、何か理由がありそうです。

ここで使われるAnd演算子は私たちがよく知っている

A And B  →   AかつB

の意味では使われていません。

A And B

とある時、AとBをそれぞれビット単位に分解し比較します。

ビット単位とは?

Bが「18」という値だった場合、

vbHidden 隠しファイル(2)+vbDirectory フォルダ(16

という風に分解してくれるのです。

And演算子は、A And B とした時、

AとBに同じビットが存在するときに「True」を返します。

イメージとしては

GetAttr(vbHidden 隠しファイル(2)vbDirectory フォルダ(16) And vbDirectory フォルダ(16

だと、Andの左辺の vbDirectoryフォルダ(16」と「 vbDirectoryフォルダ(16」が同じビットなので、「True」を返します。

これが「= vbDirectory」としてはいけない理由だったんですね。

【参考】
指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
フォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)

■スポンサーリンク

■ランキングに参加しています。
↓このブログを気に入っていただけましたら、ポチッとお願いします。
にほんブログ村 IT技術ブログへ
にほんブログ村