ロックしたセルに、シート保護を解除せずにデータを書き込む。

ユーザーオペレーションでは、ロックして保護されたセルには文字を入力したりすることはできませんが、マクロ上からだけは保護を無視して操作することを許す設定があります。

通常はセルをロック(Locked=True)しておいて、そのワークシートを保護(Protect)すると、そのセルに対しては手入力であろうと、マクロからであろうと値の入力はできません。

この時は、マクロ動作であってもこのようなエラーが発生します。

さて、そこでマクロ動作とユーザーインターフェース(マウスやキー操作)の動作を分けてしまいます。マクロ上からはセルロックの影響を受けないで値や式の書き換えができるようにします。
マクロはセルロックの影響を受けないサンプル
(画像をクリックすると、このサンプルがダウンロードできます)
このサンプルは、開いてTabキーを押してみて頂ければ全セルがロックされ、シート保護されているのが判ります。
ここで、「A1セルを加算する。」のボタンをクリックすると、A1セルが「1」ずつ加算されていくのが判ります。

A1セルを加算する。」から呼ばれているマクロは、シート保護の操作はしておらず、


'***************************************************************************************************
'   ロックしたセルに書き込むサンプル                                Module1(Module)
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'03/07/16(1.00)新規作成
'04/02/26(1.01)初回修正
'20/02/22(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit
Option Private Module

'***************************************************************************************************
'   ■■■ ワークシート側からの呼び出し処理 ■■■
'***************************************************************************************************
'* 処理名 :ADD_A1
'* 機能  :A1セルを加算
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年07月16日
'* 作成者 :井上 治
'* 更新日 :2020年02月22日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub ADD_A1()
    '-----------------------------------------------------------------------------------------------
    Cells(1, 1).Value = Cells(1, 1).Value + 1
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
このように加算させる式の1行だけになっています。
ではどうして、上記のエラーにならないかを説明します。これは簡単なので試してみて下さい。

このワークブックを立ち上げる時点で起動するマクロを記述します。

'***************************************************************************************************
'   ロックしたセルに書き込むサンプル                                ThisWorkbook(Class)
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'03/07/16(1.00)新規作成
'04/02/26(1.01)初回修正
'20/02/22(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit

'***************************************************************************************************
'   ■■■ ワークブックイベント ■■■
'***************************************************************************************************
'* 処理名 :Workbook_Open
'* 機能  :ブックを開くイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年01月01日
'* 作成者 :井上 治
'* 更新日 :2020年02月22日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub Workbook_Open()
    '-----------------------------------------------------------------------------------------------
    '' 一旦、シート保護を解除 ← 不要!
    'ActiveSheet.Unprotect
    ' シート保護を設定(UIのみ)
    ActiveSheet.Protect UserInterfaceOnly:=True
    ' 保存済みにする
    ThisWorkbook.Saved = True
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
立ち上げ時のマクロは、この「ThisWorkbook」クラスの「Workbook_Open」でも、標準モジュールの「Auto_Open」でも同様に動作します。
このように再度シート保護を設定します。設定時に「UserInterfaceOnly:=True」を引数に加えるだけです。これを加えないと上のようにエラーになります。 この時に以前のシート保護を解除する必要はありません。
これで、値や式、書式設定などはセルロックを意識せずにマクロから変更できるようになります。
また、「UserInterfaceOnly:=True」を記述していても、行列の操作やコメント、入力規則などはシート保護を解除しないと変更できません。もし解除する場合は、再設定時には再度「UserInterfaceOnly:=True」を記述します。
さらに「UserInterfaceOnly:=True」の有効期間はそのワークブックを閉じるまでで、開いた時には再設定が必要です。このため、立ち上げ時のマクロに記述しています。