この記事ではGetAttr関数の使い方と注意点について解説します。
他のよく使うVBA関数一覧はこちら。
GetAttr関数の使い方と注意点
GetAttr関数は、ファイルやフォルダの属性を数値として取得する関数です。
取得した属性はビットごとの組み合わせになっており、隠しファイルやフォルダなど特定の条件を判定する際に使います。
構文
GetAttr(パス)
- パス : 属性を取得したいファイルまたはフォルダのパス
- 戻り値 : 属性を表す整数(定数のビット和)
属性を表す定数
| 定数 | 値 | 説明 |
|---|---|---|
| vbNormal | 0 | 通常のファイル |
| vbReadOnly | 1 | 読み取り専用 |
| vbHidden | 2 | 隠しファイルまたはフォルダ |
| vbSystem | 4 | システムファイルまたはフォルダ。Macintoshでは使用できません。 |
| vbDirectory | 16 | フォルダ |
| vbArchive | 32 | アーカイブ属性。Macintoshでは使用できません。 |
| vbAlias | 64 | エイリアスファイル。Macintoshでのみ使用できます。 |
使用例
ファイルの属性を確認する
Sub Sample()
Dim path As String
path = "C:\Temp\sample.txt"
If Dir(path, vbHidden Or vbSystem) <> "" Then
Dim attr As Integer
attr = GetAttr(path)
If attr And vbReadOnly Then Debug.Print "読み取り専用"
If attr And vbHidden Then Debug.Print "隠しファイル"
If attr And vbSystem Then Debug.Print "システム属性"
If attr And vbDirectory Then Debug.Print "フォルダ"
If attr And vbNormal Then Debug.Print "通常ファイル"
If attr And vbArchive Then Debug.Print "アーカイブ属性"
Else
Debug.Print "ファイルが存在しません"
End If
End Sub
▶ 出力結果(読み取り専用ファイルの場合)
読み取り専用
アーカイブ属性
基本的にアーカイブ属性がついている
属性を削除するツールやソフトで明示的に削除しない限り、
通常の操作(ファイル作成、上書き保存等)ではアーカイブ属性が付与された状態です。
フォルダかどうかを判定する
Sub sample()
Dim target As String
target = "C:\Temp"
If Dir(target, vbDirectory) <> "" Then
If GetAttr(target) And vbDirectory Then
Debug.Print target & " はフォルダです"
End If
End If
End Sub
▶ 出力結果(読み取り専用ファイルの場合)
C:\Temp はフォルダです
⚠️注意
存在しないファイルやフォルダはエラー
引数に存在しないファイルやフォルダのパスを指定するとエラーになります。
事前にDir()などでファイルの存在確認をするようにしましょう。
Sub sample()
Dim target As String
Dim attr As Long
target = "C:\Temp\notexist.txt"
attr = GetAttr(target)
End Sub
複数の属性を持つ場合は「加算値」で返される
たとえば、隠し属性 (2) と読み取り専用 (1) のファイルはGetAttrで3を返します。
判定にはAnd演算を使います。
Sub Sample()
Dim path As String
Dim attr As Integer
path = "C:\Temp\sample.txt"
If Dir(path, vbHidden) <> "" Then
attr = GetAttr(path)
If (attr And vbReadOnly) <> 0 And (attr And vbHidden) <> 0 Then
Debug.Print "読み取り専用+隠しファイル"
End If
End If
End Sub
▶ 出力結果
読み取り専用+隠しファイル
vbNormal は他の属性を一切持たない状態のみ
vbNormal = 0なので、他の属性が1つでもついていたら必ず0以外の値になります。
隠しや読み取り専用など、1つでも属性があるとvbNormalとは判定されません。
その他のVBA関数
【Excel VBA】VBAでよく使う関数一覧&基本の使い方
