VBAマクロでシートを一括で保護したり保護を解除したりするコードを紹介します。
- シートの保護/保護解除をExcelVBAで行いたい
- 複数のExcelファイルに対して保護/保護解除を行いたい
こんな方に読んでもらいたいです。
誤って保護をかけてパスワードがわからなくなった場合シートの編集ができなくなるので利用は慎重にお願いします。
シート保護/保護解除のやり方
シートの保護はWorksheetsオブジェクトのProtectとUnprotectメソッドを使用します。
開いているシートの保護
開いているシートの保護解除
また保護のパスワードがある場合はスペースを空けて後ろにパスワードを付け加えます。
開いているシートの保護パスワード付き
開いているシートの保護解除パスワード付き
コピペ用コード
保護解除(パスワードを指定しない)
開いているシート
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
パスワードがある場合は終了する。

Sub 開いているシートの保護を解除する()
On Error GoTo エラー処理
ActiveSheet.Unprotect
Exit Sub
エラー処理:
MsgBox "シート「" & ActiveSheet.Name & "」の保護を解除できませんでした。" & vbCrLf & Err.Description & vbCrLf & vbCrLf & "処理を終了します。"
End Sub
開いているブックのシート全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
パスワードがある場合は終了する。

Sub 全てのシートの保護を解除する()
For シートカウント = 1 To Worksheets.Count
On Error GoTo エラー処理
Worksheets(シートカウント).Unprotect
Next
Exit Sub
エラー処理:
MsgBox "シート「" & Worksheets(シートカウント).Name & "」の保護を解除できませんでした。" & vbCrLf & Err.Description & vbCrLf & vbCrLf & "処理を終了します。"
End Sub
フォルダ内のエクセル全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護有り | 保護有り | 保護有り |
| ブック2.xlsx | 保護無し | 保護無し | 保護有り |
実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
パスワードがある場合は終了する。

Sub 同じフォルダにある全てのブックの保護を解除する()
Set マクロブック = ThisWorkbook
Set FSO = CreateObject("Scripting.FileSystemObject")
Application.DisplayAlerts = False
For Each ファイル In FSO.GetFolder(ThisWorkbook.Path).Files
If ファイル.Name = マクロブック.Name Then Exit For
If ファイル.Name Like "*.xl*" Then
Set ターゲットブック = Workbooks.Open(ファイル.Name)
For ターゲットシート = 1 To ターゲットブック.Worksheets.Count
On Error GoTo エラー処理
ターゲットブック.Worksheets(ターゲットシート).Unprotect
Next
ターゲットブック.Save: ターゲットブック.Close
End If
Next
Application.DisplayAlerts = True
Set FSO = Nothing
Exit Sub
エラー処理:
Application.DisplayAlerts = True
Set FSO = Nothing
MsgBox "ファイル:" & ファイル.Name & vbCrLf & "シート「" & Worksheets(ターゲットシート).Name & "」の保護を解除できませんでした。" & vbCrLf & Err.Description & vbCrLf & vbCrLf & "処理を終了します。"
End Sub
保護解除(パスワード有り)
開いているシート
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
解除用のパスワードを入力

実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
パスワードに誤りがある場合は終了する。

Sub 開いているシートの保護を解除する、PW有り()
パスワード = InputBox(prompt:="解除する為のパスワードを入力してください。")
On Error GoTo エラー処理
ActiveSheet.Unprotect パスワード
Exit Sub
エラー処理:
MsgBox "シート「" & ActiveSheet.Name & "」の保護を解除できませんでした。" & vbCrLf & Err.Description & vbCrLf & vbCrLf & "処理を終了します。"
End Sub
開いているブックのシート全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
解除用のパスワードを入力

実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
パスワードに誤りがある場合は終了する。

Sub 全てのシートの保護を解除する、PW有り()
パスワード = InputBox(prompt:="解除する為のパスワードを入力してください。")
For シートカウント = 1 To Worksheets.Count
On Error GoTo エラー処理
Worksheets(シートカウント).Unprotect パスワード
Next
Exit Sub
エラー処理:
MsgBox "シート「" & Worksheets(シートカウント).Name & "」の保護を解除できませんでした。" & vbCrLf & Err.Description & vbCrLf & vbCrLf & "処理を終了します。"
End Sub
フォルダ内のエクセル全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護有り | 保護有り | 保護有り |
| ブック2.xlsx | 保護無し | 保護無し | 保護有り |
解除用のパスワードを入力

実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
パスワードに誤りがある場合は終了する。

Sub 同じフォルダにある全てのブックの保護を解除する、PW有り()
パスワード = InputBox(prompt:="解除する為のパスワードを入力してください。")
Set マクロブック = ThisWorkbook
Set FSO = CreateObject("Scripting.FileSystemObject")
Application.DisplayAlerts = False
For Each ファイル In FSO.GetFolder(ThisWorkbook.Path).Files
If ファイル.Name = マクロブック.Name Then Exit For
If ファイル.Name Like "*.xl*" Then
Set ターゲットブック = Workbooks.Open(ファイル.Name)
For ターゲットシート = 1 To ターゲットブック.Worksheets.Count
On Error GoTo エラー処理
ターゲットブック.Worksheets(ターゲットシート).Unprotect パスワード
Next
ターゲットブック.Save: ターゲットブック.Close
End If
Next
Application.DisplayAlerts = True
Set FSO = Nothing
Exit Sub
エラー処理:
Application.DisplayAlerts = True
Set FSO = Nothing
MsgBox "ファイル:" & ファイル.Name & vbCrLf & "シート「" & Worksheets(ターゲットシート).Name & "」の保護を解除できませんでした。" & vbCrLf & Err.Description & vbCrLf & vbCrLf & "処理を終了します。"
End Sub
保護(パスワードを指定しない)
開いているシート
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
Sub 開いているシートを保護する()
ActiveSheet.Protect
End Sub
開いているブックのシート全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護有り | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
Sub 全てのシートを保護する()
For シートカウント = 1 To Worksheets.Count
Worksheets(シートカウント).Protect
Next
End Sub
フォルダ内のエクセル全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護有り | 保護有り | 保護有り |
| ブック2.xlsx | 保護有り | 保護有り | 保護有り |
Sub 同じフォルダにある全てのブックを保護する()
Set マクロブック = ThisWorkbook
Set FSO = CreateObject("Scripting.FileSystemObject")
Application.DisplayAlerts = False
For Each ファイル In FSO.GetFolder(ThisWorkbook.Path).Files
If ファイル.Name = マクロブック.Name Then Exit For
If ファイル.Name Like "*.xl*" Then
Set ターゲットブック = Workbooks.Open(ファイル.Name)
For ターゲットシート = 1 To ターゲットブック.Worksheets.Count
ターゲットブック.Worksheets(ターゲットシート).Protect
Next
ターゲットブック.Save: ターゲットブック.Close
End If
Next
Application.DisplayAlerts = True
Set FSO = Nothing
End Sub
保護(パスワード有り)
開いているシート
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
保護用のパスワードを入力

実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
Sub 開いているシートを保護する、PW有り()
パスワード = InputBox(prompt:="保護する為のパスワードを入力してください。")
ActiveSheet.Protect パスワード
End Sub
開いているブックのシート全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
保護用のパスワードを入力

実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護有り | 保護有り | 保護有り |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
Sub 全てのシートを保護する、PW有り()
パスワード = InputBox(prompt:="保護する為のパスワードを入力してください。")
For シートカウント = 1 To Worksheets.Count
Worksheets(シートカウント).Protect パスワード
Next
End Sub
フォルダ内のエクセル全て
マクロ.xlsmのシート1を開いて実行
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護無し | 保護無し | 保護無し |
| ブック2.xlsx | 保護無し | 保護無し | 保護無し |
保護用のパスワードを入力

実行後
| シート1 | シート2 | シート2 | |
| マクロ.xlsm | 保護無し | 保護無し | 保護無し |
| ブック1.xlsx | 保護有り | 保護有り | 保護有り |
| ブック2.xlsx | 保護有り | 保護有り | 保護有り |
Sub 同じフォルダにある全てのブックを保護する、PW有り()
パスワード = InputBox(prompt:="保護する為のパスワードを入力してください。")
Set マクロブック = ThisWorkbook
Set FSO = CreateObject("Scripting.FileSystemObject")
Application.DisplayAlerts = False
For Each ファイル In FSO.GetFolder(ThisWorkbook.Path).Files
If ファイル.Name = マクロブック.Name Then Exit For
If ファイル.Name Like "*.xl*" Then
Set ターゲットブック = Workbooks.Open(ファイル.Name)
For ターゲットシート = 1 To ターゲットブック.Worksheets.Count
ターゲットブック.Worksheets(ターゲットシート).Protect パスワード
Next
ターゲットブック.Save: ターゲットブック.Close
End If
Next
Application.DisplayAlerts = True
Set FSO = Nothing
End Sub
VBAはどうやって覚える?
プログラムのコードが読めないと、参考にしているコードの理解や自分でプログラムを書くときに時間がかかってしまいます。そんな時は基礎から学ぶと応用もできるようになり自分の作りたいプログラムがスムーズに作れるようになります。
無料でやるならネット上の学習サイトを参考にするといいです。
こちらはVBAの基礎から説明している無料のWEBサイトになります。
>>基礎から学べるWEBサイトを見てみる
過去にネットでの学習でつまずいた方には専門書をオススメします。
本なら基礎から学べる事はもちろん、読者視点で分かりやすい解説になっています。
一人で集中してコツコツ進めたい方は書籍を試してください。
本を読んでもわからない所が多すぎたり、誰かに質問したい場合はオンラインスクールを見てみましょう。
カウンセリングから目的に応じた学習プランと教材を提供してくれるので、プログラミングの敷居がとても低くなります。
誰かに相談できるのは心強いです。
>>オンラインスクールを無料体験で始める
まとめ
今回は一つのシートから複数のファイルまで条件別でシートの保護/保護の解除を行うコードを紹介しました。
全てコピペで実行できるので、ぜひ利用して作業を効率化してみてください。