小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

シート全体を保護し、任意のセルだけ保護解除する for VBA

Excelのシートで入力項目のセル以外は、ユーザに変更されたくない・・・というケースは結構ありますね。
Excelには、「シートの保護」という機能があります。


普通の発想としては、ユーザに変更されたくないセルをロックするということになりますが・・・。
Excelでは、逆発想で、まずシート全体をロックし、ユーザに変更してもらいたいところだけロックを外すのです。


もう少し詳しく言うと、すべてのセルにはロックするかしないかのプロパティ『Locked』があり、Protectメソッドが実行されると、『Locked』の値がTrueのセルはロックされ、Falseだとロックされないのです。

サンプルソース

Private Sub Worksheet_Activate()
    If ActiveSheet.ProtectContents = False Then
        Cells.Locked = True
        ActiveSheet.Range("A1:B10").Locked = False
        ActiveSheet.Protect Password:="0708", UserInterfaceOnly:=True
    End If
End Sub

◆ソース解説

  • Worksheet_Activate() - シートが選択(アクティブ)なったときの実行されるサブルーチン
  • ProtectContents - シートが保護されているとTrue、されていないとFalse。
  • Cells.Locked = True - すべてのセルをロック指定する。
  • Range("A1:B10").Locked = False - A1:B10の範囲を「ロックしない指定」にする。
  • Protect - シートを保護する。保護を解除するパスワードと保護はユーザインターフェイスだけとする。

◆留意点

  • 列単位や行単位の「ロックしない指定」はできない。あくまでセル単位のようです。
  • 「ロックしない指定」を結合があるセルに行うとエラーになるようです。
  • UserInterfaceOnly:=Trueをしないで「ロックしない指定」もできるのですが、この場合、ColorIndexプロパティが設定できず、以下のエラーがでます。
    『実行時エラー1004 InteriorクラスのColorIndxプロパティを設定できません』。
    これをできるようにするには、UserInterfaceOnly:=Trueを指定します。