HOME > 即効テクニック > Excel VBA > ファイル操作関連のテクニック > ファイルの属性を取得/設定する

即効テクニック

ファイル操作関連のテクニック

ファイルの属性を取得/設定する

(Excel 97/2000/2002/2003/2007)
CD-ROMやDVDからハードディスクにコピーしたファイルには、「読み取り専用」というファイル属性が設定されることがあります。
こうしたファイル属性は、Excelの設定ではなくWindowsが管理しています。

読み取り専用属性のファイルをExcelで開くと、タイトルバーに[読み取り専用]と表示されます。
読み取り専用なのですから、もちろん、このファイルを上書き保存はできません。

手動で操作するのなら、タイトルバーを確認してから[名前を付けて保存]を実行すればいいのですが、こうした読み取り専用ファイルをマクロで操作する場合には、予期せぬエラーを招くことがあります。

Sub Sample1()
  Workbooks.Open "C:\Work\Book1.xlsx"
  Range("A1") = Now
  ActiveWorkbook.Save
End Sub   
上記のマクロに間違いはありませんが、もしC:\Work\Book1.xlsxが読み取り専用だった場合は、Saveメソッドがエラーになります。 開いたブックが読み取り専用かどうかは、WorkbookオブジェクトのReadOnlyプロパティで確認できます。
Sub Sample2()
  Workbooks.Open "C:\Work\Book1.xlsx"
  If ActiveWorkbook.ReadOnly Then
    MsgBox "読み取り専用です"
  Else
    MsgBox "上書き保存できます"
  End If
End Sub   
ただし、ReadOnlyプロパティは値の取得のみ可能なプロパティですから、このReadOnlyプロパティで、読み取り専用属性を解除することはできません。 このようなファイルの属性は、VBAから調べたり設定できたりします。 ファイルの属性を取得するには、GetAttr関数を使います。
Sub Sample3()
  Dim Result As Long
  Const Target As String = "C:\Work\Book1.xlsx"
  Result = GetAttr(Target)
  If Result And vbReadOnly Then
    MsgBox "読み取り専用です"
  Else
    Workbooks.Open Target
  End If
End Sub   
読み取り専用属性かどうかを判定するには、GetAttr関数の返値と、定数vbReadOnlyをAnd演算子で比較します。 読み取り専用属性が設定されていると、比較した結果がTrueになります。 VBAからファイル属性を設定するには、SetAttrステートメントを使います。 読み取り専用を解除するには、通常のファイルを表す定数vbNormalを設定します。
Sub Sample4()
  Dim Result As Long
  Const Target As String = "C:\Work\Book1.xlsx"
  Result = GetAttr(Target)
  If Result And vbReadOnly Then
    SetAttr Target, vbNormal
  End If
  Workbooks.Open Target
End Sub   
読み取り専用のファイルがフォルダ内に多数存在する場合は、事前に、すべてのファイルに対して属性を変更しておくこともできます。
Sub Sample5()
  Dim buf As String
  Const Path As String = "C:\Work\"
  buf = Dir(Path & "*.xls")
  Do While buf <> ""
    If GetAttr(Path & buf) And vbReadOnly Then
      SetAttr Path & buf, vbNormal
    End If
    buf = Dir()
  Loop
End Sub