更新日:、 作成日:

VBA フォルダの隠しフォルダなどの属性を取得または変更する

はじめに

Excel VBA マクロでフォルダの隠しフォルダなどの属性を取得または変更する方法を紹介します。

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

サブフォルダの属性の変更もできます。

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

FileSystemObject について

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

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

フォルダの属性を取得または変更する

フォルダの属性を取得

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

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

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

' 後始末
Set fso = Nothing

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

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

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

フォルダには必ず Directory (16) が設定されています。

複数の属性が設定されているときは (フォルダと隠しフォルダなら) 16 + 2 で 18 の値が取得されます。

どの属性が適用されているかは「ビット演算」を使用して判定できます。

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

If a And Directory Then
    Debug.Print("フォルダ")
End If
If a And Hidden Then
    Debug.Print("隠しフォルダ")
End If

フォルダに属性を設定

Dim fso As FileSystemObject
Set fso = New FileSystemObject

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

fl.Attributes = Directory ' 属性を設定

' 後始末
Set fso = Nothing

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

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

fl.Attributes = Directory + Hidden ' フォルダと隠しフォルダを設定

次のように Directory 属性を指定しなくても自動で設定されます。

fl.Attributes = ReadOnly ' 読み取り専用
Debug.Print(fl.Attributes) ' 17 (16 + 1)

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

Dim a As Long
a = fl.Attributes

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

fl.Attributes = a Or Hidden   ' 隠しフォルダを追加する

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

エクスプローラーではフォルダ自身を読み取り専用にはできませんが、VBA のコードではそれができます。

サブフォルダの属性を取得または変更

Dim fso As FileSystemObject
Set fso = New FileSystemObject

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

Dim folderName As String
Dim fl As Folder
For Each fl In pfl.SubFolders ' サブフォルダの一覧を取得
    If fl.Name = "TipsFolder" Then  ' 属性を取得または変更したいフォルダ
        Dim a As Integer
        a = fl.Attributes           ' 属性を取得
        Debug.Print(a)

        fl.Attributes = Directory   ' 属性の設定
    End If
Next

' 後始末
Set fso = Nothing

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

pfl.SubFolders プロパティから、そのフォルダ内にある Folder オブジェクトの一覧を取得できます。

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