VBAワークシートの保護と解除
「VBAでワークシートの保護と解除を行いたいです。方法を教えてください。」という問い合わせをいただきました。
まずは結論です。ExcelVBAでもワークシートの保護と解除を用意する事ができます。
質問者様にさらに話を聞いてみると以下のような作業をマクロで用意したいとの事でした。
まずは保護状態のワークシートを解除して一定の作業をします。その後再びワークシートを保護するという内容です。
- 解除:プロシージャの先頭でワークシートの保護を解除
- 作業:ワークシートに必要な情報を書き込む
- 保護:プロシージャの最後で再びワークシートを保護
「保護」だけ、「解除」だけというマクロも用意できますが実際には「保護」と「解除」はセットで使う事が多いです。
1つのプロシージャの中でワークシートの保護と解除は何度でも使用する事ができます。
よって質問者様の課題は難なく解決することができますよ。
まずはワークシートの保護と解除について構文とパラメータを紹介します。
その後基本編としてコードの書き方を紹介します。最後に応用編として事例を1つ紹介する事にしています。
事例の中で質問者様の課題を解決させています。(すぐに事例をご覧になりたい方はこちら)
関連記事
ワークブックを保存するする際にパスワードを設定することができるSaveAsメソッドを紹介しています。
SaveAsメソッドについてVBAはフォルダ内の複数ブック×全部のシート名をセットで取得できる
「ワークシートの保護」は「ワークシートのコピー」と関連性があります。
一緒に作業(操作)を行うことがありますので参考になる様に記事を用意しておきます。
シートをコピーする方法VBA|複数のシートをコピーしてから新規ブックとして保存する
関連書籍
ワークシートの保護と解除を含めやりたい事からコードを選ぶことが出来る本です。
電子書籍はこちらです。コンテンツが多く内容のしっかりした書籍は重たいです。
あくまで私見ですがこの本は電子書籍向きだと感じています。電子書籍での購入も是非ご検討ください。
ワークシートの「保護」と「解除」とは
まずはワークシートの保護と解除について情報を整理しておきます。
ワークシートの保護
まずはワークシートの保護について「定義」、「構文」、「パラメータ」の順に説明していきます。
定義
定義はこちらです。Microsoftのドキュメントを引用します。
他のユーザーが誤って、または意図的にデータを変更、移動、または削除することを防ぐために、Excel ワークシートのセルをロックし、さらにシートをパスワードで保護することができます。
たとえば、自分が所有者であるチームの進捗レポートのワークシートがあり、このワークシートを、チームのメンバーが特定のセルだけにデータを追加でき、それ以外の変更ができないようにする必要があるとします。
ワークシートを保護すると、シートの特定の部分だけを編集可能にすることができ、ユーザーはシートの他の領域のデータを変更できなくなります。
Microsoftサポート_ワークシートを保護するより抜粋
構文
第1印象としては非常に多くのパラメータを所持している事が分かります。
しかし単純にワークシートを保護するだけならパラメータ不要です。非常にシンプルなコードになりますよ。
Worksheet.Protect (Password、DrawingObjects、Contents、Scenarios、UserInterfaceOnly、AllowFormattingCells、AllowFormattingColumns、AllowFormattingRows、AllowInsertingColumns、AllowInsertingRows、AllowInsertingHyperlinks、AllowDeletingColumns、AllowDeletingRows、AllowSorting、AllowFiltering、AllowUsingPivotTabless)
Microsoft:Worksheet.Protect メソッド (Excel)より抜粋した後に一部を加工
パラメータ
沢山ありますが基本的には1番のPasswordを使う事が多いです。あとは必要に応じて読んでください。
各種パラメータの説明はMicrosoft のドキュメントを参照したうえで大幅に省略しました。(読みやすさを考慮した為)
詳細が知りたい方は引用ブロック右下の引用元ドキュメントへの参照部をクリックしてください。
Microsoft:Worksheet.Protect メソッド (Excel)より抜粋した後に一部を加工
番号 名前 説明 既定値 1 Password 引数として任意のパスワードを設定 なし 2 DrawingObjects Trueで描画オブジェクトを保護 True 3 Contents Trueでコンテンツを保護 True 4 Scenarios Trueでシナリオを保護 True 5 UserInterfaceOnly Trueで画面上からの変更は保護、マクロからの変更は保護されない False 6 AllowFormattingCells True:ワークシートの保護中にセルの書式を変更可 False 7 AllowFormattingColumns True:ワークシートの保護中に列幅、表示/非表示の変更可 False 8 AllowFormattingRows True:ワークシートの保護中に行高さ、表示/非表示の変更可 False 9 AllowInsertingColumns True:ワークシートの保護中に列の挿入可 False 10 AllowInsertingRows TTrue:ワークシートの保護中に行の挿入可 False 11 AllowInsertingHyperlinks True:ワークシートの保護中にハイパーリンクの挿入可 False 12 AllowDeletingColumns True:ワークシートの保護中に列の削除可 False 13 AllowDeletingRows True:ワークシートの保護中に行の削除可 False 14 AllowSorting True:ワークシートの保護中に並べ替え可 False 15 AllowFiltering True:ワークシートの保護中にフィルター設定可 False 16 AllowUsingPivotTables True:ワークシートの保護中にピボットテーブル使用可 False パラメータの設定は全て任意です。データ型は全てバリアント(Variant)型です。
ワークシートの解除
続いてワークシートの解除について説明します。
定義
解除は保護の反対の行為です。
指定した要素(シートやセル)の保護を解除することで変更を可能にします。
シートまたはブックの保護を解除します。 保護されていないシートやブックに対しては、このメソッドは無効です。
Microsoft:Worksheet.Unprotect メソッド (Excel)より抜粋
構文
解除の構文は非常にシンプルです。
Worksheet.Protect (Password)
Microsoft:Worksheet.Unprotect メソッド (Excel)より抜粋
パラメータ
Microsoft:Worksheet.Unprotect メソッド (Excel)より抜粋
番号 名前 説明 規定値 1 Password ワークシートを保護する時に設定したパスワードがあれば記入 なし パ1メータの設定は任意です。データ型はバリアント(Variant)型です。
基本編:使い方
「保護」も「解除」も1行です。あまりにもシンプルなのでパラメータのPasswordを使用しました。
Sub ワークシートの保護と解除_基本編()
'ワークシートの保護
Worksheets("Sheet1").Protect Password:="aaa"
'ワークシートの解除
Worksheets("Sheet1").Unprotect Password:="aaa"
End Sub
保護する際に設定したパスワードと同じ文字列を解除の時に使用してください。
保護する際に設定したパスワードと異なる文字を設定すると以下画像のようなエラーメッセージが表示される事になります。
応用編:1つのプロシージャ内でワークシートの保護と解除を使う
ワークシートの保護と解除について一定の理解を持ったうえで実際に事例に落とし込んでみます。
今回の事例は1つのプロシージャ(プログラム)の中でワークシートの「保護」と「解除」を使うという事例です。
ワークシート
作業前のワークシートは保護されています。裏付けとしてワークシート上部の複数のアイコンがグレーアウトしています。
画面中央やや下あたりに表示されたセルを指定してから右クリックすると出てくる項目も一部グレーアウトしていますね。
ワークシートの保護を解除してセルC5の文字を書き換えた後再びワークシートを保護するという作業をします。
セルC5の文字は変更されていますがワークシートの保護の状態は作業前と同じ設定に戻されている事がわかります。
コード
続いてコードを紹介します。コードはボタンでコピーする事ができます。
Sub ワークシートの保護と解除_応用編()
'オブジェクト変数wsにワークシートSheet1をセット
Dim ws As Worksheet
Set ws = ActiveSheet
With ws
'ワークシートの保護
.Unprotect Password:="aaa"
.Range("C5") = "C5"
'ワークシートの解除
.Protect Password:="aaa"
End With
End Sub
解説
先に作業の流れを紹介しておきます。
- 1オブジェクト変数にワークシートをセットする
- 2ワークシートの保護を解除する
- 3セルC5の文字を変更する
- 4ワークシートを保護する
1_オブジェクト変数にワークシートをセットする
作業対象となっている「Sheet1」を選択しオブジェクト変数にセットします。(コード内ではActiveSheetを使っています)
オブジェクト変数が良く分からない方はこちらの記事をご覧ください。
オブジェクト変数の考え方VBAで転記|ブック間で文字列をコピペするマクロの作り方を教えます
2_ワークシートの保護を解除する
ワークシートは保護されています。パスワードは「aaa」です。
設定されたパスワードを引数に設定してワークシートの保護を解除します。
一旦パスワードを解除する理由は1つです。パスワードを解除しないとこの後の作業ができないからです。
ワンポイントアドバイス:UserInterfaceOnly
ワークシートの保護時にパラメータ「UserInterfaceOnly」をTrueで設定しましょう。
これでワークシートはロックされつつマクロからの処理は実行可能となります。つまり手入力をブロックできます。
「ワークシートに手入力はさせたくないけどマクロなら指示が出来る」という環境を用意したい方におすすめです。
3_セルC5の文字を変更する
ワークシートの保護を解除したのでセルに文字を書きこむ事ができます。
ここでワークシートの文字を書き換えます。今回は数値ではないので文字列をダブルクォーテーションで囲んでいます。
4_ワークシートを保護する
ワークシートを保護された状態に戻したいので再びワークシートを保護します。
パスワード使ってワークシートを保護します。
その他_Withステートメント
コード内で一定のまとまりを設けた方が後でコードを読む時やチェック、修正時に役立ちます。
オブジェクト変数wsを使ってWithステートメントを配置する事で作業(操作)のまとまりを作る事ができます。
Withステートメントについて知りたい方はこちらの記事をご覧ください。
WithステートメントについてVBA-9Withステートメントを組み合わせてシートに罫線を引く
さらに応用編:複数のワークシートの保護と解除
複数のワークシートに対して作業を試みるにはまずワークシートを周回できるようにしましょう。
こちらの記事を読んでいただくとワークシートを周回する事ができる様になります。
本記事で紹介したコードを組み込む事ができれば複数のワークシートに対して保護と解除を仕掛けることができます。
ワークシートを周回するVBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する
まとめ
ワークシートの保護と解除について情報を整理してみました。
単純に保護と解除だけを考えれば非常に簡単なコードをで作業を構築する事ができます。
簡単に書けるコードであるにもかかわらず効果は絶大です。非常に強力な権限を得る事ができる機能です。
ワークシートの保護と解除はまさに「エクセルをコントロールする」という作業です。是非お試しください。