こんにちは、Ryoです。
ファイル処理を行う際に用途によって属性の調査や取得、設定等をおこないたいこともあるかと思います。特に利用機会が多そうな読み取り専用ファイルとしての設定や解除などもAttributesプロパティを利用することで可能なので、今回はその内容について書いていきます。
1.サンプル概要
今回使用するサンプルとして作成したExcelファイル「Sample1.xlsx」の属性を読み取り専用として設定しています。
この読み取り専用として設定したファイルと同じ場所に保存された実行ファイルからサンプルコードを起動しますが、先ず対象のファイルが読み取り専用か否かを確認し、読み取り専用であれば属性解除についてYes/No確認を行います。
「はい(Yes)」であれば対象ファイルの読み取り専用ファイル属性を解除して標準ファイルとし、解除した旨をメッセージボックスで表示します。
「いいえ(No)」であれば現在の状態を維持する旨をメッセージボックスにて表示します。
以上がサンプル概要になります。
2.サンプルコード
Sub sample1() Dim FSO As Object Dim fObj As Object Dim b As Long 'FileSystemObjectオブジェクトを作成 Set FSO = CreateObject("Scripting.FileSystemObject") '確認対象のファイルをFileオブジェクトに代入する '(この実行ファイルと同じ場所に保存されているファイル ' Sample1.xlsxが対象) Set fObj = FSO.GetFile(ThisWorkbook.Path _ & "\Sample1.xlsx") '対象ファイルが読み取り専用か否かを確認 '属性設定有無は「AND演算子」を使用して判定 ' ⇒「取得したい属性(fObj.Attributes) AND ' 確認したい属性(1:読み取り専用ファイル) If fObj.Attributes And 1 Then '読み取り専用ファイルであればメッセージボックスを表示し、 '属性解除についてYes/No確認 b = MsgBox("このファイルは読み取り専用です。" & vbLf _ & "属性を解除しますか?", vbYesNo) 'Yesボタンクリック(vbYes)であれば読取り専用属性を解除 If b = vbYes Then fObj.Attributes = 0 '0:標準ファイル指定 MsgBox "読取り専用属性を解除しました", vbInformation Else 'Noボタンクリック(vbNo)での処理 MsgBox "現在の属性を維持します" End If End If '※※Attributeプロパティでの値と属性※※ '0:標準ファイル '1:読み取り専用ファイル '2:隠しファイル '4:システムファイル '8:ディスクドライブボリュームラベル(取得のみ可) '16:フォルダまたはディレクトリ(取得のみ可) '32:アーカイブファイル '64:リンクまたはショートカット(取得のみ可) '128:圧縮ファイル(取得のみ可) '※※※※※※※※※※※※※※※※※※※※ End Sub
このようにファイルの属性を扱うにはAttributesプロパティを利用します。
構文:オブジェクト.Attributes
Attributesプロパティはオブジェクトに指定したFileオブジェクトの属性を取得/設定できますが、その設定する属性は数値で指定します。
≪Attributesプロパティでの設定値≫
値 | 属性 |
0 | 標準ファイル |
1 | 読み取り専用ファイル |
2 | 隠しファイル |
4 | システムファイル |
8 | ディスクドライブボリュームラベル(取得のみ可) |
16 | フォルダまたはディレクトリ(取得のみ可) |
32 | アーカイブファイル |
64 | リンクまたはショートカット(取得のみ可) |
128 | 圧縮ファイル(取得のみ可) |
サンプルコードですが、このファイル操作を行う上でFileSystemObjectオブジェクトを使用しますので、作成と対象ファイルをFileオブジェクトとして変数(fObj)に代入します。
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Set fObj = FSO.GetFile(ThisWorkbook.Path _
& “\Sample1.xlsx”)
次に対象となっているファイルの属性を確認しますので、属性設定の有無は「AND演算子」を使用して判定します。サンプルコードのコメントとしても記載していますが「取得したい属性 AND 確認したい属性」のように記述します。
If fObj.Attributes And 1 Then
対象が読み取り専用ファイルであれば、属性解除を行う or 行わないについてメッセージボックスにて問合せ、選択に応じて処理を分岐します。Yesであれば属性解除&メッセージ表示、Noであれば属性維持(何もしない)&メッセージ表示とする処理になります。
b = MsgBox(“このファイルは読み取り専用です。” & vbLf _
& “属性を解除しますか?”, vbYesNo)
If b = vbYes Then
fObj.Attributes = 0
MsgBox “読取り専用属性を解除しました”, vbInformation
Else
MsgBox “現在の属性を維持します”
End If
◆参考1:ファイルのアーカイブ属性
サンプルでは解除する上で「標準ファイル指定=0」としていますが、通常ファイルなどの初期値は「32:アーカイブファイル」となっています。これはファイルのプロパティで確認すると「ファイルをアーカイブ可能にする」にチェックが入っていることによるものです。
このチェックは増分バックアップの目印的な役割を果たすもので、チェックされていれば更新されていると判断してバックアップ処理が行われ、未チェックであれば前回バックアップ処理から更新されていないと判断し、処理がスキップされるというものです。
ただファイル自体が更新されれば自動的にチェックが入る為、未チェック状態が保持されるようなことはないので大丈夫ですが、このアーカイブ属性とはこのようなものであることを知っておくと良いと思います。
◆参考2:ファイルへの複数の属性を設定する
例えば対象のファイルに対し「読み取り専用属性」と「隠しファイル属性」を設定したい場合は「+演算子」を用いて記述します。
Sub Sample2() Dim FSO As Object Dim fObj As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set fObj = FSO.GetFile(ThisWorkbook.Path _ & "\Sample1.xlsx") '読み取り専用ファイルと隠しファイル属性を設定する場合 fObj.Attributes = 1 + 2 '複数属性設定は +演算子を使用 End Sub
上の項に書いた通り「読み取り専用属性:1」「隠しファイル属性:2」なので、fObj.Attributes = 1 + 2のように記述して実行することで複数の属性を設定することができます。
サンプルコード、及び参考情報(アーカイブ属性/属性の複数設定)については以上になります。
3.まとめ
ファイル属性を調べる手段を知っておくと、ファイルを扱った処理をする際に役に立つことも多いかと思います。
同様にフォルダに関しても同じように取得や設定ができるかと思いましたが、今回のような手段ではうまく設定や取得ができませんでしたので、何れ手段がわかったら書いてみようと思います。
以上、ファイル属性の取得/設定をおこなう方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo