更新日:、 作成日:

VBA ファイルの読み取り専用などの属性を取得または変更する

はじめに

Excel VBA マクロでファイルの読み取り専用などの属性を取得または変更する方法を紹介します。

Attributes プロパティを使って、指定したファイルの属性を取得または設定できます。

フォルダ内のファイル一覧から指定したファイルのみ設定できます。

フォルダの属性を取得または設定するには「フォルダの属性を取得または変更」をご覧ください。

FileSystemObject について

ここでは VBA の標準の関数より便利な FileSystemObject を使った方法を紹介しています。基本的な使い方については「FileSystemObject ファイル操作の基礎」をご覧ください。

コードを見やすくするため FileSystemObject を参照設定しています。また、エラー処理は行っていません。

ファイルの属性を取得または変更する

ファイルの属性を取得

Dim fso As FileSystemObject
Set fso = New FileSystemObject ' インスタンス化

Dim f As File
Set f = fso.GetFile("D:\Tips.txt") ' ファイルを取得

Dim a As Long
a = f.Attributes ' 属性を取得
Debug.Print(a)

' 後始末
Set fso = Nothing

fso.GetFile 関数で指定したパスの File オブジェクトを取得します。ファイルが存在しないときはエラーが発生します。

f.Attributes プロパティから、属性を取得または変更できます。Attributes の値には次のものがあります。

定数 説明
Normal0標準ファイル
ReadOnly1読み取り専用
Hidden2隠しファイル
System4システム ファイル
Volume8ディスク ドライブ ボリューム ラベル。値の取得のみ可能
Directory16フォルダまたはディレクトリ。値の取得のみ可能
Archive32ファイルが前回のバックアップ以降に変更されているかどうか
Alias1024リンクまたはショートカット。値の取得のみ可能
Compressed2048圧縮ファイル。値の取得のみ可能

複数の属性が設定されているときは (読み取り専用と隠しファイルなら) 1 + 2 で 3 の値が取得されます。

どの属性が設定されているかは「ビット演算」を使用して判定できます。Normal (標準ファイル) の値は 0 なので、全てのファイルに設定されていると考えられます。

Dim a As Long
a = f.Attributes ' 属性を取得

If a And ReadOnly Then
    Debug.Print("読み取り専用")
End If
If a And Hidden Then
    Debug.Print("隠しファイル")
End If

ファイルに属性を設定

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim f As File
Set f = fso.GetFile("D:\Tips.txt") ' ファイルを取得

f.Attributes = Normal ' 属性を設定

' 後始末
Set fso = Nothing

f.Attributes プロパティから、属性を取得または変更できます。

複数の値を設定するときは各属性を足し算します。

f.Attributes = ReadOnly + Hidden ' 読み取り専用と隠しファイルを設定

既存の属性に新しい属性を追加するには「ビット演算」を使用してできます。

Dim a As Long
a = f.Attributes

f.Attributes = a Or ReadOnly ' 読み取り専用を追加する

f.Attributes = a Or Hidden   ' 隠しファイルを追加する

Directory (フォルダ) など値の取得のみ可能な属性を設定した時は、強制的に標準ファイルになります。

フォルダ内のファイルの属性を取得または変更

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim fl As Folder
Set fl = fso.GetFolder("D:\") ' フォルダを取得

Dim f As File
For Each f In fl.Files ' フォルダ内のファイルを取得
    If f.Name = "Tips.txt" Then  ' 属性を取得または変更したいファイル
        Dim a As Integer
        a = f.Attributes         ' 属性を取得
        Debug.Print(a)

        f.Attributes = Normal    ' 属性の設定
    End If
Next

' 後始末
Set fso = Nothing

fso.GetFolder 関数で指定したパスの Folder オブジェクトを取得します。フォルダが存在しないときはエラーが発生します。

fl.Files プロパティから、そのフォルダの File オブジェクトの一覧を取得できます。

f.Attributes プロパティから、属性を取得または変更できます。