Excelは、不用意な様式の変更や、数式の破損を防ぐため、よくシートやブックに保護をかけて運用されます。
でも、改修のたびに保護を解除し、また保護をかけ直すというのは意外と面倒な作業ではないでしょうか?
このページでは、一括で保護をかけたり、解除したりするためのサンプルコードを紹介します。
VBAから一括で処理することで、手間が浮くだけでなく、シート数が多くても保護のかけ忘れなどがなくなります。
僅かな修正だけでほとんどそのままコピペ使用できるようにしていますので、ぜひご参考ください。
簡易版
Sub 全シート保護_簡易版()
'保護(VBAからの変更は許可)
Dim WS As Worksheet
For Each WS In Worksheets
WS.Protect Password:="1234", UserInterfaceOnly:=True
Next WS
End Sub
Sub 全シート保護解除_簡易版()
Dim WS As Worksheet
For Each WS In Worksheets
WS.Unprotect Password:="1234"
Next WS
End Sub
まずは最低限の処理だけの簡易版です。
上のコードが保護設定で、下のコードが保護解除です。
Password:=”1234″の「1234」の部分を変更すれば好きなパスワードに変更できます。
上の保護コードの中で、UserInterfaceOnly:=Trueの部分はVBAからの変更を許可する引数です。削除すればVBAからの変更ができなくなります。
通常版
Sub 全シート保護_通常版()
'パスワード指定
Dim PassWD As String
PassWD = "1234"
'画面更新/イベントを停止
Application.ScreenUpdating = False
Application.EnableEvents = False
'ブック保護解除
ThisWorkbook.Unprotect Password:=PassWD
'保護(VBAからの変更は許可)
Dim WS As Worksheet
For Each WS In Worksheets
WS.Protect Password:=PassWD, UserInterfaceOnly:=True
Next WS
'ブック再保護
ThisWorkbook.Protect Password:=PassWD
'画面更新/イベントを再開
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Sub 全シート保護解除_通常版()
'パスワード指定
Dim PassWD As String
PassWD = "1234"
'画面更新/イベントを停止
Application.ScreenUpdating = False
Application.EnableEvents = False
'ブック保護解除
ThisWorkbook.Unprotect Password:=PassWD
'保護解除
Dim WS As Worksheet
For Each WS In Worksheets
WS.Unprotect Password:=PassWD
Next WS
'(ブック再保護をする場合はコメントアウトを外す)
'ThisWorkbook.Protect Password:=PassWD
'画面更新/イベントを再開
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
ブック保護と、画面更新やイベントの停止を追加したコードです。
イベントの停止は意外と重要で、シートイベントによってコードが止まる可能性もあるので、普通は停止しておくほうが無難です。
ただし、イベントの内容によっては停止することでファイルを正常に開けなる場合もあります。このへんはイベントの内容によって判断するしかありません。
シンプルな利用に関してはこのコードで事足りるのではないかと思います。
パスワードはPassWD = “1234”の「1234」を変更すればOKです。(シート・ブックとも共通)
VBAからの変更をしない場合はUserInterfaceOnly:=Trueを削除してもOK
保護解除コードのブック再保護はコメント(無効)にしています。必要に応じて行の先頭についている「’」を消すことでブックの再保護ができます。
実用版
Sub 全シート保護_実用版()
'パスワード指定
Dim PassWD As String
PassWD = "1234"
'画面更新/イベントを停止
Application.ScreenUpdating = False
Application.EnableEvents = False
'ブック保護解除
ThisWorkbook.Unprotect Password:=PassWD
'非表示シート再表示(全シートに表示処理をするため一旦再表示)
On Error Resume Next '非表示シートがないときに出るエラー無視
Dim WS As Worksheet
For Each WS In Worksheets
WS.Visible = True
Next WS
'切替処理
For Each WS In Worksheets
'保護(VBAからの変更は許可)
WS.Protect Password:=PassWD, UserInterfaceOnly:=True
'セル選択設定(必要に応じてどちらかのコメントを外す)
'WS.EnableSelection = xlUnlockedCells 'ロックされていないセルのみ選択可
WS.EnableSelection = xlNoRestrictions 'ロックされたセルも選択可
'枠線表示・行列番号非表示のためのシート選択
WS.Activate
'枠線非表示(表示:True,非表示:False)
ActiveWindow.DisplayGridlines = False
'行列番号非表示(表示:True,非表示:False)
ActiveWindow.DisplayHeadings = False
Next WS
'一部シートを非表示にする場合に記載
Sheet2.Visible = False
Sheet4.Visible = False
'TOPシートに戻る
Sheet1.Activate
'ブック再保護
ThisWorkbook.Protect Password:=PassWD
'画面更新/イベントを再開
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Sub 全シート保護解除_実用版()
'パスワード指定
Dim PassWD As String
PassWD = "1234"
'画面更新/イベントを停止
Application.ScreenUpdating = False
Application.EnableEvents = False
'ブック保護解除
ThisWorkbook.Unprotect Password:=PassWD
'非表示シート再表示(全シートに表示処理をするため一旦再表示)
On Error Resume Next '非表示シートがないときに出るエラー無視
Dim WS As Worksheet
For Each WS In Worksheets
WS.Visible = True
Next WS
'切替処理
For Each WS In Worksheets
'保護解除
WS.Unprotect Password:=PassWD
'枠線表示・行列番号表示のためのシート選択
WS.Activate
'枠線表示(表示:True,非表示:False)
ActiveWindow.DisplayGridlines = True
'行列番号表示(表示:True,非表示:False)
ActiveWindow.DisplayHeadings = True
Next WS
'TOPシートに戻る
Sheet1.Activate
'(ブック再保護をする場合はコメントアウトを外す)
'ThisWorkbook.Protect Password:=PassWD
'画面更新/イベントを再開
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
一般的に保護と同時に設定することの多い処理も詰め合わせた実用版です。
詰め合わせている具体的な内容としては「ロックされたセルを選択できるようにするかどうか」、「枠線の表示・非表示」、「行列番号の表示・非表示」などです。
わかりやすく言えば、「運用モード」と「改修モード」の切り替えをするためのコードです。
少し長めのコードですが、部品単位で見ると簡単な処理ばかりです。
- 画面更新、イベントの停止
- ブックの保護解除
- 全シートの再表示(枠線や行列番号の表示切替のため)
- 保護または保護解除
- 保護後のセル選択設定(保護コードのみ使用可)
- 枠線や行列番号の表示切替
- 一部シートの非表示(保護解除コードには記載なし)
- ブックの再保護
- 画面更新、イベントの再開
修正のポイントについて、前段までの内容と一部重複しますがあげておきます。
パスワードはPassWD = “1234”の「1234」を変更すればOKです。(シート・ブックとも共通)
VBAからの変更をしない場合はUserInterfaceOnly:=Trueを削除してもかまいません。
保護設定後のセルの選択設定に関しては2種類のコードを記載しています。使いたいほうのコメントを外すことで保護をかけた後のセルの選択可能範囲を指定できます。(規定値:ロックされたセルも選択可)
'セル選択設定(必要に応じてどちらかのコメントを外す)
'WS.EnableSelection = xlUnlockedCells 'ロックされていないセルのみ選択可
WS.EnableSelection = xlNoRestrictions 'ロックされたセルも選択可
以下のコードのTrueとFalseを変えることで枠線の表示を切り替えることができます。また不要な処理についてはコメントか削除することで処理をスキップできます。
'枠線表示(表示:True,非表示:False)
ActiveWindow.DisplayGridlines = True
'行列番号表示(表示:True,非表示:False)
ActiveWindow.DisplayHeadings = True
設定用シートやリストシートなど、運用上、一部のシートを非表示にしたい場合は、次の例記のコメントを外し、シートの名前(オブジェクト名など)を変更してください。 'Sheet2.Visible = False 'Sheet4.Visible = False
コードの終盤にあるSheet1.Activateを修正することで、処理終了後に表示するシートを変更できます。
保護処理の引数パターン
上記コードについては、WS.Protect Password:=PassWD, UserInterfaceOnly:=Trueに引数を追加等していくことでより細かい保護条件の指定ができます。ちなみに、上のサンプルコードでは引数を2つ指定していて、ひとつはパスワード、もうひとつはVBAからの処理(変更)を許可する引数です。
細かい引数はいろんなページで紹介されていますので割愛しますが、ここではサンプルとしてよく使う引数の指定パターンを記載しておきます。
必要に応じてこの保護設定部分のコード(WS.Protect Password:=PassWD, UserInterfaceOnly:=True)を下のパターンの内容に入れ替えることで、保護対象を選択的に緩和することができます。
‘許可:VBAからの変更、描画オブジェクト(図形等)の編集、セルの書式設定の変更
WS.Protect Password:=PassWD, UserInterfaceOnly:=True, _
DrawingObjects:=False, AllowFormattingCells:=True
特徴として、描画オブジェクト(図形等)の移動や変更ができることと、セルの書式設定(網掛けや文字色等)の変更ができます。
‘許可:VBAからの変更、描画オブジェクト(図形等)の編集、フィルターの使用、並び替えの使用、セルの書式設定の変更
WS.Protect Password:=PassWD, UserInterfaceOnly:=True, DrawingObjects:=False, _
AllowFiltering:=True, AllowSorting:=True, AllowFormattingCells:=True
特徴はパターン1に加えて、フィルターや並び替えなどもできることです。
ただし、フィルターを使用したい場合は、保護をかける前にフィルターを有効化しておく必要があります。保護設定後の有効・無効の切り替えはできません。
‘許可:VBAからの変更、フィルターの使用、並び替えの使用、行の挿入、セルの書式設定の変更
WS.Protect Password:=PassWD, UserInterfaceOnly:=True, AllowFiltering:=True, _
AllowSorting:=True, AllowInsertingRows:=True, AllowFormattingCells:=True
こちらはフィルター、並び替え、行の挿入、セルの書式設定、という基本的な表入力に必要な機能を許可しているパターンになります。
上記同様、フィルターを使用する場合は、保護をかける前に有効化しておく必要があります。
引数指定時の注意点
例示したパターンのように、引数は必要なものを追加(または削除)することで、保護設定を柔軟に変更できます。
引数指定時のポイントとしては、引数を記載しなかった場合どうなるのかを知っておくことです。
Protectメソッドにはたくさんの引数がありますが、じつはすべて省略することもできます。そして、省略した引数はすべて「既定値」で動作します。
例えば、事実上保護をするかどうかを決める重要な引数「Contents」は、省略しても保護されます。
省略した場合は既定値であるContents:=Trueが記載されているものとして処理されるからです。
つまり既定値で動作をさせるための引数は記載する必要がありません。
そのためにもどの引数がどういう既定値を持っているか、指定前にはチェックすることをオススメします。
また、これらの引数はTureやFalseの指定にも少し注意が必要です。
例えば、DrawingObjects:=Falseは「描画オブジェクト(画像やオートシェイプ)の変更可(変更できる)」という意味であることに対し、AllowFormattingCells:=Trueも「セルの書式設定の変更可(変更できる)」というように、同じような意味の指定でもTrueとFalseは引数ごとの特性を理解して使い分ける必要があります。
少し混乱しやすい部分だと思うので、わからない場合は個別にチェックするようにしてください。
コメント
コメント一覧 (2件)
ht9mjm
i2vwfl