シート全体を保護し、任意のセルだけ保護解除する 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を指定します。