コード生成グループ「シート保護コード」の解説
- yuji fukami
- 10月21日
- 読了時間: 4分
概要
書籍「Excel VBA開発を超効率化するプログラミングテクニック」の特典であるIkiKaiso2.xlamのリボン登録マクロの解説のための特設ページです。
出版社の書籍のページ⇒https://gihyo.jp/book/2024/978-4-297-14023-6
リボン登録マクロ全体解説ページ⇒https://www.softex-celware.com/post/ikikaiso2
本ページではIkiKaiso2.xlamの「コード生成」グループの「シート保護コード」ボタンの使い方を解説します。

解説
用途
表示シートの保護状態を認識して、そのシート保護状態を再現するVBAコードを自動生成する
使い方
実際に使っている様子の動画を下記でご確認ください。
手順は次の通りです
①:対象のシートに任意の設定のシート保護を設定する
②:「シート保護コード」ボタンをクリック
③:設定したシート保護の状態を認識して、そのシート保護状態を再現するコードを自動生成+クリップボードに格納(一緒にシート保護解除のコードも生成しておく)
④:コードウィンドウに適当な所にコードを貼り付け
動画では良く行うシート保護の設定を行っています。
値の入力は出来ないようにしておく
列幅、行高さの変更は出来るようにしておく
シート保護、保護解除のVBAでの扱い
事前知識として、VBAでシート保護、保護解除をどのような場面で扱うか?について説明しておきます。
そもそもシート保護を行う大きな理由として
ユーザーに想定外の使い方でExcelシートを壊されないようにする
シートの内容はユーザーが変更不可能にする
というのがあります。
上記のような理由を前提に、保護を設定したシートにVBAで何かしらの書き込みなど内容の変更を行おうとしたときに、その前後でシート保護解除、保護設定を行う必要があります。
実際のVBAコードの例だと次のようになります。
下記コードは簡単な例でA1セルだけ値を入力するようにしていますが、実務では対象シートに様々な変更処理を加えたりします。

「①シート保護解除⇒②内容変更⇒③シート保護設定」の手順で行っていますが、上記コードの③の処理は結果的に下記のデフォルトのシート保護状態となってしまいます。
もっとわかりやすく、先ほどのコードの各段階でシートの状態を示すと、次のようになります。
実行前は人が設定した理想のシート保護状態でしたが、コードを実行後はデフォルトのシート保護状態に戻ってしまいます。さらに、最初に設定したシート保護状態の情報は完全に失われてしまいます。

「では、どうしたら最初に設定した「列幅、行高さが変更可能なシート保護状態」を設定できるのか?」となりますが、下記画像の様に、Worksheetオブジェクト.Protectメソッドの引数を正しく与える必要があります。
しかし、このProtectメソッドの引数はあまりにも多くて、これを正確に記述するのはもはや人間技ではありません。

この時の「Worksheetオブジェクト.Protectメソッド」の引数を正しく与えるVBAコードを「シート保護コード」によって自動生成できるようになります。
実際に「シート保護コード」で自動生成されたコードを利用して先ほどのコードを置き換えたものは次のようになります。

「シート保護コード」に頼らない方法
上記のようなシート保護のVBAコードはVBA開発では避けては通れないような処理ですが、一般的にこれらのシート保護のコードの作成方法も説明しておきます。
具体的な方法は「マクロの記録」を利用する方法で、実際に上記例のような「列幅、行高さ変更可能」なシート保護の設定を行う仮定をマクロの記録でも記録すると、次のようなコードが生成されます。

これで生成されたコードの一部を変更したりして実際にマクロとして利用したりします。

上記が一般的な「任意のシート保護状態を設定するVBAコードの作成方法」ですが、この方法だと「マクロの記録」「記録されたコードの編集」の作業の手間が発生しますが、今回紹介している「シート保護コード」機能はこの手間なくボタン1つでコードを生成するので、少し効率化に繋がります。

コメント