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

ファイルの属性を、整数で返してくれる関数「GetAttr」

使い方はこんな感じ

GetAttr("C:\VBA\第1階層\" & fd) And vbDirectory

GetAttr関数の結果、何の属性か調べるのであれば

GetAttr(“C:\VBA\第1階層\” & fd) = vbDirectory

「=」イコールでいいのでは???と思っていたのですが、「And」を使うのにはちゃんとした理由があります。

GetAttr関数を利用する場面

私がGetAttr関数をよく使うのは、Dir関数でフォルダ名を取得する時です。

fd = Dir("C:\VBA\第1階層\", vbDirectory)   '変数fdに1個目のフォルダ名を格納

Do While fd <> ""                          'fdが空になるまでDo While内の処理を続ける
    If GetAttr("C:\VBA\第1階層\" & fd) And vbDirectory Then '標準ファイルを取得しないために必要
        ~fdで行う処理~
    End If
    fd = Dir()     '変数fdに次のフォルダ名を格納(フォルダが無い場合は空欄になる)
Loop

Dir関数は、第1引数に指定したファイル・フォルダが存在する場合、パスを除いたファイル名・フォルダ名を返します。存在しない場合は長さ0の文字列 ”” (空欄)を返します。

Dir(ファイル名・フォルダ名を表す文字列,ファイル・フォルダの属性)

第2引数に指定した定数の値の合計で、どの属性を取得するか判断しています。

Dir関数の定数一覧を見てみましょう。オレンジ文字のところが定数の値です。

定数 属性
vbNormal (既定) 0 標準ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システム ファイル
vbVolume 8 ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
vbDirectory 16 フォルダ
vbAlias 64 エイリアスファイル

フォルダを取得する場合は「vbDirectory16)」を指定します。

fd = Dir("C:\VBA\第1階層\", vbDirectory)

Dir関数はこの「16」から

16 vbNormal0)+vbDirectory(16

標準ファイル vbNormal の「0」も含めて処理します。

どうあがいてもDir関数では、値が「0」の標準ファイルを処理対象としてしまいます。

指定した属性以外の標準ファイルを含めないようにするために、GetAttr関数を利用します。

GetAttr関数とは

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

If GetAttr("C:\VBA\第1階層\" & fd) And vbDirectory Then
End if
定数 説明
vbNormal(規定値) 0 標準ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システム ファイル
vbVolume 8 ボリューム ラベル
vbDirectory 16 フォルダ
vbArchive 32 アーカイブ
vbAlias 64 エイリアス ファイル

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

GetAttr("C:\VBA\第1階層\" & fd)

この場合、引数に指定した文字列がvbDirectory フォルダなら「16」を返します。

しかし、このフォルダに隠しファイルの属性がセットされていたら「18」を返します。

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

でも、「18」ではどの属性かわかりません。

それを解決してくれるのが「And演算子」なのです。

■スポンサーリンク

And演算子とは

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

A And B  →   A かつ B

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

A And B

この場合のAnd演算子は、左辺のAと右辺のBをそれぞれビット単位に分解し比較します。

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

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

という風に、属性の値の単位に分解します。

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

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

という場合は、And演算子

  • 左辺の  vbDirectoryフォルダ(16 
  • 右辺の  vbDirectoryフォルダ(16

が同じビットなので、「True」を返します。

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

【参考】

指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)

■スポンサーリンク

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

Microsoft Officeランキング