読み取り専用の設定と解除を行えるコマンドボタンが標準である
VBAでExcelブックを扱う際に読み取り専用かどうかの確認を行いたいことがあります。
また、その結果次第で読み取り専用の設定や解除を行うこともあります。
これを行うには以下のVBAの関数を利用してもいいのですが、標準でとても便利な「読み取り専用の設定/解除」コマンドが用意されています。
Excelオプション→クイックアクセスツールバー→コマンドの選択→すべてのコマンド→読み取り専用の設定/解除 にあります。
これを使うと、ブックの読み取り専用の設定と解除がブックを開いたままで行うことが出来ます。読み取り専用で開いていた場合に他のユーザーやExcelプロセスが更新してブックを閉じた場合、読み取り専用の設定/解除コマンドボタンを押すと更新内容が反映されて表示されます。
通常利用する場合は「読み取り専用の設定/解除」コマンドボタンを使う方が便利だと思いますが、どうしてもVBAで処理しなければならない場合は以下で紹介しているマクロを利用してください。
読み取り専用かどうか確認を行うマクロ
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub BookReadOnlyCheckTest() Dim wb As Workbook Dim readOnlyFlg Set wb = ActiveWorkbook readOnlyFlg = wb.ReadOnly If readOnlyFlg = True Then Debug.Print "読み取り専用です" Else Debug.Print "読み取り専用ではありません" End If End Sub |
コード説明
ブックの読み取り専用の確認には、WorkbookオブジェクトのReadOnlyプロパティを利用します。
6行目のReadOnlyプロパティがTrueの場合は読み取り専用で、Falseの場合は読み取り専用ではありません。
なお、ReadOnlyプロパティは参照専用のプロパティです。
読み取り専用の設定を行うマクロ
1 2 3 4 5 6 7 8 9 10 |
Sub BookReadOnlySetTest() Dim wb As Workbook Set wb = ActiveWorkbook '// 変更されていないとみなす(保存しない設定) wb.Saved = True '// 読み取り専用に設定 Call wb.ChangeFileAccess(xlReadOnly) End Sub |
コード説明
読み取り専用に設定するにはChangeFileAccessメソッドに設定値xlReadOnlyを渡して利用します。
直観的にはReadOnlyプロパティにTrueを設定すると読み取り専用になりそうですが、残念ながらできません。
読み取り専用を設定する前にブックの内容が変わっている場合は、6行目のChangeFileAccess(xlReadOnly)実行時に編集を保存するか確認するダイアログが表示されます。
この確認ダイアログは Application.DisplayAlerts = False とすると表示されなくなりますが、編集状態を保存してしまいます。その上で読み取り専用に切り替わります。
保存したくない場合は7行目のようにSavedプロパティ = True として回避するか、一度閉じてから開きなおすなどで対応する必要があります。
なお、既に読み取り専用の状態になっているのに、再度 ChangeFileAccess(xlReadOnly) を実行すると、エラー1004(’ChangeFileAccess’ メソッドは失敗しました: ‘_Workbook’オブジェクト)が発生します。
エラーを回避したい場合は事前に読み取り専用の状態を確認しておくとよいでしょう。
読み取り専用の解除を行うマクロ
1 2 3 4 5 6 7 8 9 10 11 |
Sub BookReadWriteSetTest() Dim wb As Workbook Set wb = ActiveWorkbook '// 変更されていないとみなす(保存しない設定) wb.Saved = True '// 読み取り専用を解除(通常ファイル化) Call wb.ChangeFileAccess(xlReadWrite) End Sub |
コード説明
読み取り専用を解除する場合は、設定時と同じでChangeFileAccessメソッドに設定値xlReadWriteを渡して利用します。
その際に、読み取り専用にしていた間に他のユーザーによる変更を反映させるために、ブックを再度読み込みなおします。なお、変更が無くても読み込みなおされます。
読み取り専用の状態のときにブックの内容が変わっている場合は、変更内容の扱いについて確認ダイアログが表示されます。
それを回避したい場合は、7行目のようにSaved = Trueとして変更なしとみなすように事前に設定します。
読み取り専用の設定時と同様で、既に読み取り専用が解除されている状態で再度解除を実行するとエラー1004が発生します。
エラーを回避したい場合は事前に読み取り専用の状態を確認しておくとよいでしょう。