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サイトを見てみる
過去にネットでの学習でつまずいた方には専門書をオススメします。
本なら基礎から学べる事はもちろん、読者視点で分かりやすい解説になっています。
一人で集中してコツコツ進めたい方は書籍を試してください。
本を読んでもわからない所が多すぎたり、誰かに質問したい場合はオンラインスクールを見てみましょう。
カウンセリングから目的に応じた学習プランと教材を提供してくれるので、プログラミングの敷居がとても低くなります。
誰かに相談できるのは心強いです。
>>オンラインスクールを無料体験で始める
まとめ
今回は一つのシートから複数のファイルまで条件別でシートの保護/保護の解除を行うコードを紹介しました。
全てコピペで実行できるので、ぜひ利用して作業を効率化してみてください。