Excelでシートの保護を複数ページで行ったときに,作業効率を考えると,「選択している(グループ化している)シートをいっぺんに保護・解除したい」というときがあると思います。今回はその機能を実装する方法を紹介します。
流れ
-
- 選択してるシートを全て保護・保護解除するマクロを作成
- 右クリックメニューで「1のマクロ」を起動するマクロを作成
- 「2のマクロ」をExcelの起動・終了時に実行するイベントの設定
選択しているシートを全て保護・保護解除するマクロを作成
標準モジュールに下記のマクロをコピペしてください。標準モジュールはエディターの挿入から追加できます。

VBAにおいて,選択されているシートを調べるには,SelectedSheetsコレクションを参照するのですが,その親オブジェクトはThisworkbookではなく,ActiveWindowです。おそらく,同じブックのウィンドウが複数ある場合は,それぞれで,選択されているシートが異なるため,Thisworkbookオブジェクトでは,一意的に選択されているシートが定められないからだと思われます。
Sub シートの保護()
On Error GoTo myerror
Dim WS As Worksheet
Dim sName() As String
Dim i As Integer
Dim startsheet As String
startsheet = ThisWorkbook.ActiveSheet.Name
For Each WS In ActiveWindow.SelectedSheets
ReDim Preserve sName(i)
sName(i) = WS.Name
i = i + 1
Next WS
For i = LBound(sName, 1) To UBound(sName, 1)
ThisWorkbook.Worksheets(sName(i)).Select Replace:=True
ThisWorkbook.Worksheets(sName(i)).Unprotect
ThisWorkbook.Worksheets(sName(i)).Protect DrawingObjects:=False, _
contents:=True, _
Scenarios:=True
Next i
ThisWorkbook.Worksheets(startsheet).Select
Exit Sub
myerror:
MsgBox ("保護できませんでした。")
End Sub
Sub シートの保護解除()
On Error GoTo myerror
Dim WS As Worksheet
Dim sName() As String
Dim i As Integer
Dim j As Integer
Dim startsheet As String
startsheet = ThisWorkbook.ActiveSheet.Name
For Each WS In ActiveWindow.SelectedSheets
ReDim Preserve sName(i)
sName(i) = WS.Name
i = i + 1
Next WS
For i = LBound(sName, 1) To UBound(sName, 1)
ThisWorkbook.Worksheets(sName(i)).Select
ThisWorkbook.Worksheets(sName(i)).Unprotect
Next i
ThisWorkbook.Worksheets(startsheet).Select
Exit Sub
myerror:
MsgBox ("保護解除できませんでした。")
End Sub
コードの説明をすると,シート1枚に対してシートの保護解除をするメソッドは「Protect」「Unprotect」です。選択されているシートの名前を取得し,その名前のシートを保護解除するというマクロです。
右クリックメニューで「1のマクロ」を起動するマクロを作成
下記のマクロは右クリックメニュー(改ページビューを除く)に先ほど作成したマクロを追加するマクロです。
Sub CommandAdd()
On Error GoTo myerror
'■右クリックメニューの初期化
CommandBars("Cell").Reset
'■右クリックメニューに追加
With CommandBars("Cell").Controls.Add(Before:=1)
.Caption = "シートの保護"
.OnAction = "シートの保護"
End With
With CommandBars("Cell").Controls.Add(Before:=1)
.Caption = "シートの保護解除"
.OnAction = "シートの保護解除"
End With
Exit Sub
myerror:
MsgBox ("メニューの追加に失敗しました。")
End Sub
Sub OpenEvents()
Call CommandAdd
End Sub
Sub EndEvents()
CommandBars("Cell").Reset
End Sub
これらのマクロをExcelの起動時に実行し,メニューを追加し,Excelの終了時にメニューを初期化すれば,そのExcelのBookのみで有効なメニューバーが作成できます。
このまま実行してもメニューは追加できます。

「2のマクロ」をExcelの起動・終了時に実行するイベントの設定
Excelの起動・終了時にイベントを設定する場合は,「標準モジュールではなく,ThisWorkbookオブジェクトに直接書き込みます。

'起動時に実行するマクロ
Private Sub Workbook_Open()
Call OpenEvents
End Sub
'終了時に実行するマクロ
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call EndEvents
End Sub
使って見ましょう
それでは,シートを複数選択(Shift+クリック)でマクロを実行してみましょう。
![]()
↓まとめて保護・解除できました。
![]()
シートの選択が離散的でも大丈夫です。(Ctrl+クリックでも可)
おまけ
お疲れ様でした。これで,右クリックメニューからシートを複数選択している状況でもシートの保護解除できます。ちなみに,右クリックメニューのアイコンを設定したいという方は,FaceIDを検索して設定してみてください。かわいいものやマクロに合ったIDを付けるのは楽しいですよ。

