即効テクニック |
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