前回はGetAttr関数を使ってファイル・フォルダの属性値をVBFileAttribute列挙型で取得する方法を紹介した。
今回は取得した返り値から自分が探している属性値を含んでいるかどうかを判定する方法を検証する。
どうして判定が必要か?
GetAttr関数で属性値を取得しているなら、それを見ればわかるのでは?というのはもっともな疑問。プログラム上で判断する場合も返り値でやればいいじゃないか。
確かに属性を1つしか持っていない場合は単純な比較で可能。
例えばこのような感じ。
if(GetAttr("C:\Users\XXX\Desktop\TEST") =16) then
この例は調査対象としているものがファイル属性が16=フォルダーであるかどうかを調べている。
結果としては対象は普通のフォルダーなので 16=16となりIF判定はTRUEとなる。
ところが同じように下記のフォルダーを調査するとうまくいかない
if(GetAttr("C:\Users\XXX\IntelGraphicsProfiles"))=16 then
調査対象としているIntelGraphicsProfilesはフォルダーなのだが普通のフォルダではない。
隠し&システムフォルダのためGetAttr関数の返り値が16ではなく22を返すようになっている。
そのため上述の例のように16と比較をしても 22 = 16 の式となりIF判定はFALSEとなる。
ではどうすれば調査対象がフォルダーなのかを正確に調べることができるのか?
ビット演算で判定
ビット演算とは2進数を利用した比較方法である。
2進数については以下をご参考。
ビット演算については以下をご参考
22と16のビット演算は次のように記載する
22 and 16
この計算式の結果は16となる。
ではなぜそのような結果になるのか。
順を追って見てみる。
2進数での表記
まず22と16という数字を2進数で表記するとどうなるか
16 | 8 | 4 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|
22 | 1 | 0 | 1 | 1 | 0 | 0 |
16 | 1 | 0 | 0 | 0 | 0 | 0 |
1行目は2進数の位(ビット)です。
上述の表から22は101100、16は100000と2進数では表記されます。
Excel関数ではDEC2BIN関数を使えば10進数を2進数に変換することが出来ます。
DEC2BIN(数値, [桁数])
引数「桁数」は返り値が桁数に満たないときに 0 (ゼロ) を前に付加して桁を埋める事ができます。
ANDビット演算
次に作成された2進数をANDビット演算で比較します。
16 | 8 | 4 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|
22 | 1 | 0 | 1 | 1 | 0 | 0 |
16 | 1 | 0 | 0 | 0 | 0 | 0 |
AND | 1 | 0 | 0 | 0 | 0 | 0 |
1行目は2進数の位です。
最下段AND行がANDビット演算の返り値です。
ANDビット演算では2進数のそれぞれの位を比較して両方が1の時に1を返します。
それ以外のときは0を返します。
今回の22と16の例では2進数16の位のみ1を返して、他は全て0を返しています。
22 and 16 ⇛ 101100 and 100000 = 100000
という答えが返ってきています。
Excel関数ではBITANDをすればAndビット演算ができます。
BITAND(数値 1, 数値 2)
引数「数値」には10進数を指定します。
10進数へ変換
では上述の2進数100000を10進数に変換するにはどうすればいいか。
理屈としては
2進数の位の数字とビット演算の返り値をそれぞれ乗算した数値を加算
で求められます。
今回の例では以下のとおりです。
16×1+8×0+4×0+2×0+1×0+0×0 = 16
となります。
Excel関数ではBIN2DEC関数を使えば2進数を10進数に変換できます。
BIN2DEC(数値)
条件判定
ではいよいよ指定した属性が含まれているかの条件判定をします。
16 | 8 | 4 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|
22 | 1 | 0 | 1 | 1 | 0 | 0 |
16 | 1 | 0 | 0 | 0 | 0 | 0 |
AND | 1 | 0 | 0 | 0 | 0 | 0 |
上述した、隠し&システムフォルダとフォルダーの属性のAndビット演算の結果です。
Andビット演算の結果16という値が返ってきています。
16 | 8 | 4 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|
22 | 1 | 0 | 1 | 1 | 0 | 0 |
18 | 1 | 0 | 0 | 1 | 0 | 0 |
AND | 1 | 0 | 0 | 1 | 0 | 0 |
隠し&システムフォルダと隠しフォルダーの属性のAndビット演算の結果です。
Andビット演算の結果18という値が返ってきています。
つまりAndビット演算した結果が条件指定した値と同じ値が返ってきていれば条件を満たしていることになります。
(22 and 18 )= 18
このような条件式の結果がTrueであれば、指定した条件を満たしたことになります。
まとめ
2進数とビット演算を勉強したことで、なんかプログラミングの入り口に立てた気がします。
今回これを勉強したのはファイル検索のマクロを組むに当たって躓いたからでした。
次回からはその辺りを検証してみたいと思います。
以下の書籍にそれぞれ数ページずつビット演算について記載があります。
そこが知りたい!Excel VBAプロの技 Excel97/2000/2002/2003対応!
- 作者: 井川はるき
- 出版社/メーカー: ナツメ社
- 発売日: 2003/11
- メディア: 単行本
- 購入: 1人 クリック: 4回
- この商品を含むブログ (4件) を見る
入門レベルでは決して足りない実務に必須のスキルとは ExcelVBA 実戦のための技術
- 作者: 沢内晴彦
- 出版社/メーカー: ソシム
- 発売日: 2018/05/24
- メディア: 単行本
- この商品を含むブログを見る