GetAttr関数とAnd演算子でビット演算の使い方 ファイルやフォルダの属性を取得

【本日のミッション】

GetAttr関数とAnd演算子でビット演算し、ファイルやフォルダの属性を取得せよ。

ミッションの概要

GetAttr関数とAnd演算子でビット演算し、ファイルやフォルダの属性を取得せよ、というのが今回のミッションです。

GetAttr関数とは

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

GetAttr(ファイル・フォルダのパス)

GetAttr関数が返すのは下記 値 になります。

定数説明
vbNormal(規定値)0標準ファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システム ファイル
vbVolume8ボリューム ラベル
vbDirectory16フォルダ
vbArchive32アーカイブ
vbAlias64エイリアス ファイル

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

例えば、下記のようなフォルダで・・・(それぞれのファイルには、ファイル名と同じ属性がつけられています。)

GetAttr("C:\VBA\Dir関数検証\03_読み取り専用ファイル.xlsx")

とした場合、読み取り専用ファイル  vbReadOnly の値「1」を返します。

GetAttr("C:\VBA\Dir関数検証\01_フォルダ")

とした場合、フォルダ  vbDirectory の値「16」を返します。

GetAttr("C:\VBA\Dir関数検証\11_隠しファイル属性付きフォルダ")

フォルダ vbDirectory(16)に、隠しファイル vbHidden(2の属性もセットされている場合、合計値の「18」を返します。

しかし、合計値の「18」だけでは何の属性を含んでいるのか判断できません。

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

■■■スポンサーリンク■■■

And演算子とは

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

A And B  →   A かつ B

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

A And B

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

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

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

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

左辺Aと右辺Bに同じビットが存在するときに、同じビットの値を返します。

“C:\VBA\Dir関数検証\11_隠しファイル属性付きフォルダ” が、隠しファイルの属性付きのフォルダ

GetAttr("C:\VBA\Dir関数検証\11_隠しファイル属性付きフォルダ") And vbDirectory

とした場合は「16」を返します。つまり「フォルダ」属性を含んでいることがわかります。

(GetAttr("C:\VBA\Dir関数検証\11_隠しファイル属性付きフォルダ") And vbDirectory) = vbDirectory

これらを括弧(  )で囲み上記のようなコードにすると、「vbDirectory」(16)と同じ値を返したら「True」を返します。

GetAttr("C:\VBA\Dir関数検証\11_隠しファイル属性付きフォルダ") And vbHidden

とした場合は「2」を返します。つまり「隠しファイル」属性を含んでいることがわかります。

(GetAttr("C:\VBA\Dir関数検証\11_隠しファイル属性付きフォルダ") And vbHidden) = vbHidden

これらを括弧(  )で囲み上記のようなコードにすると、「vbHidden」(2)と同じ値を返したら「True」を返します。

“C:\VBA\Dir関数検証\01_フォルダ”に「フォルダ」属性を含んでいるかどうか調べるときには、こんな感じにします。

If (GetAttr("C:\VBA\Dir関数検証\01_フォルダ") And vbDirectory) = vbDirectory Then
    MsgBox "フォルダです!"
End if

Dir関数の特性を除外するために、GetAttr関数とAnd演算を利用する

私がGetAttr関数とAnd演算をよく使うのは、Dir関数でフォルダを取得するときです。

下記サンプルは “C:\VBA\第1階層\” フォルダ内の「フォルダ名」のみをダイアログ表示させるというコードです。(変数宣言は省略しています。)

  

Sub 指定したフォルダ内のフォルダ名を全て取得()

    fd = Dir("C:\VBA\第1階層\", vbDirectory)   'Dir関数の引数に「vbDirectory」=「フォルダ」を指定

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

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

Dir(ファイル・フォルダのパス,ファイル・フォルダの属性)

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

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

定数属性
vbNormal (既定)0標準ファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システム ファイル
vbVolume8ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
vbDirectory16フォルダ
vbAlias64エイリアスファイル

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

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

Dir関数はこの「16」に、標準ファイル vbNormal の「0」も含めて処理します。

16 vbNormal0)+vbDirectory(16

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

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

なお、「If fd <> “.” And fd <> “..” Then」の「.」と「..」については、次項をご確認ください。

「.」と「..」の正体

「.」とは自分自身のいるカレントフォルダ、「..」はカレントフォルダの一つ上の階層のフォルダのことを指しています。

今回の処理では

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

「pt=C:\VBA\Dir関数検証」としているので

「.」は ・・・「C:\VBA\第1階層」自分自身のフォルダ

「..」は・・・「C:\VBA」             一つ上の階層のフォルダ

となります。

今回の処理では「.」や「..」フォルダを表示させないため

If fd <> "." And fd <> ".." Then
End if

という処理で、除外しています。

【参考】

指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttr関数とAnd演算子でビット演算の使い方 ファイルやフォルダの属性を取得
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(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)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)

■■■スポンサーリンク■■■