シートの保護/解除
初心者でも迷わないように、「保護(Protect)」「解除(Unprotect)」の基本から、よく使うオプション、実務で安全なテンプレート、まとめて保護/解除、編集可能にする設定まで、動くコードで丁寧に解説します。
基本:1枚のシートを保護/解除する
Sub ProtectSheet_Basic()
ThisWorkbook.Worksheets("設定").Protect
End Sub
Sub UnprotectSheet_Basic()
ThisWorkbook.Worksheets("設定").Unprotect
End Sub
VB- ポイント:
- Protect/Unprotect: シートの編集を禁止/解除します。
- パスワードなし: 引数を省略するとパスワードなしで保護されます。
パスワード付き保護と解除
Sub ProtectSheet_WithPassword()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("機密")
ws.Protect Password:="secret123"
End Sub
Sub UnprotectSheet_WithPassword()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("機密")
ws.Unprotect Password:="secret123"
End Sub
VB- ポイント:
- 解除に必要: パスワード付きで保護したら、解除時にも同じパスワードが必要。
- 見せたくない設定: パスワードはコード直書きより、入力や外部管理が安全。
実務テンプレート:一時解除して処理→再保護
Sub EditUnderProtection()
Dim ws As Worksheet, pwd As String
Set ws = ThisWorkbook.Worksheets("レポート")
pwd = "secret123"
'一時解除
ws.Unprotect Password:=pwd
'必要な処理(例:値の更新)
ws.Range("A1").Value = "更新日"
ws.Range("B1").Value = Date
'再保護
ws.Protect Password:=pwd
End Sub
VB- ポイント:
- 安全手順: 解除→編集→再保護をワンセットに。
- 解除忘れ対策: 例外が出ても再保護されるように構造化すると安心。
よく使うオプション:操作を一部許可する
Sub ProtectSheet_WithOptions()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Protect Password:="1234", _
DrawingObjects:=False, _
Contents:=True, _
Scenarios:=False, _
AllowFormattingCells:=True, _
AllowFormattingColumns:=True, _
AllowFormattingRows:=True, _
AllowInsertingRows:=False, _
AllowDeletingRows:=False, _
AllowSorting:=True, _
AllowFiltering:=True, _
AllowUsingPivotTables:=True
End Sub
VB- ポイント:
- 柔軟運用: 並べ替え・フィルタ・書式など、許可したい操作だけ開放。
- Contents:=True: セル内容の編集を保護する設定の中心です。
VBAからは編集可能にする(UserInterfaceOnly)
Sub Protect_UserInterfaceOnly()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
'マクロからは編集可能、ユーザーの手操作は保護
ws.Protect Password:="1234", UserInterfaceOnly:=True
End Sub
VB- ポイント:
- 自動処理と両立: マクロはセル変更できるが、ユーザー手操作は守られる。
- 起動時設定: 一部環境ではブック再オープンで無効化されるため、ThisWorkbook.Openイベントで毎回設定する運用が安定。
まとめて保護/解除(全シート・指定シート)
Sub ProtectAllSheets(Optional pwd As String = "")
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Protect Password:=pwd, AllowFiltering:=True, AllowSorting:=True
Next
End Sub
Sub UnprotectAllSheets(Optional pwd As String = "")
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Unprotect Password:=pwd
Next
End Sub
Sub ProtectByList()
Dim names As Variant, i As Long, ws As Worksheet
names = Array("設定", "機密", "集計")
For i = LBound(names) To UBound(names)
On Error Resume Next
Set ws = ThisWorkbook.Worksheets(CStr(names(i)))
On Error GoTo 0
If Not ws Is Nothing Then ws.Protect Password:="lock"
Set ws = Nothing
Next
End Sub
VB- ポイント:
- 一括操作: 実務でよくある「全体を守る/解く」。
- 指定名で管理: 重要シートだけ保護する運用に合う。
ブック構造の保護(シート追加・削除・並べ替えを禁止)
Sub ProtectWorkbookStructure()
ThisWorkbook.Protect Password:="book", Structure:=True
End Sub
Sub UnprotectWorkbookStructure()
ThisWorkbook.Unprotect Password:="book"
End Sub
VB- ポイント:
- Structure保護: シートの追加・削除・並べ替えを禁止。
- シート保護とは別: シート内編集の保護と、ブック構造の保護は目的が違う。
入力と解除のユースケース(パスワードを見せない)
Sub UnprotectWithInputBox()
Dim pwd As String, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("機密")
pwd = InputBox("機密シートのパスワードを入力してください")
If Len(pwd) = 0 Then Exit Sub
ws.Unprotect Password:=pwd
End Sub
VB- ポイント:
- 見せない配慮: パスワードをコードに書かず、入力で対応。
- 運用負担: 入力のたびに必要なので、頻用シーンは外部設定や暗号化保管も検討。
実務の落とし穴と対策
- 解除忘れ/再保護漏れ:
- 対策: 必ず「解除→処理→再保護」をひとまとまりに。例外時にも再保護される構造にする。
- フィルタや並べ替えが使えない:
- 対策: Protect時にAllowFiltering/AllowSortingを有効化。
- UserInterfaceOnlyが消える:
- 対策: ブックを開くたびに再設定(ThisWorkbook.OpenでProtectを呼ぶ)。
- 保護されていても書き換えたい(マクロだけ):
- 対策: UserInterfaceOnly:=True、または一時Unprotect→処理→Protect。
- ブック構造まで守りたい:
- 対策: ThisWorkbook.Protect Structure:=True を併用。
例題で練習
例題1:全シートを、フィルタ・並べ替えは可能な保護に
Sub Example_ProtectAllFriendly()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Protect Password:="lock", AllowFiltering:=True, AllowSorting:=True
Next
MsgBox "全シートを保護(フィルタ・並べ替え可)にしました。"
End Sub
VB例題2:レポート更新時だけ一時解除→更新→再保護
Sub Example_UpdateReportSafely()
Dim ws As Worksheet, pwd As String
Set ws = ThisWorkbook.Worksheets("レポート")
pwd = "rpt"
ws.Unprotect Password:=pwd
ws.Range("B2").Value = Date
ws.Range("B3").Value = Environ$("Username")
ws.Protect Password:=pwd
MsgBox "レポートを更新して再保護しました。"
End Sub
VB例題3:ブック構造保護+目次と機密をVeryHiddenにして表示面を整理
Sub Example_SecureLayout()
'ブック構造保護
ThisWorkbook.Protect Password:="book", Structure:=True
'シート保護
ThisWorkbook.Worksheets("目次").Protect
ThisWorkbook.Worksheets("機密").Protect Password:="key"
'完全非表示
ThisWorkbook.Worksheets("機密").Visible = xlSheetVeryHidden
MsgBox "構造を保護し、表示面を整理しました。"
End Sub
VB