VBA|パスワード付きワークシートの保護と解除を単一プロシージャで実行する

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

VBAワークシートの保護と解除

「VBAでワークシートの保護と解除を行いたいです。方法を教えてください。」という問い合わせをいただきました。

まずは結論です。ExcelVBAでもワークシートの保護と解除を用意する事ができます

質問者様にさらに話を聞いてみると以下のような作業をマクロで用意したいとの事でした。

まずは保護状態のワークシートを解除して一定の作業をします。その後再びワークシートを保護するという内容です。

  1. 解除:プロシージャの先頭でワークシートの保護を解除
  2. 作業:ワークシートに必要な情報を書き込む
  3. 保護:プロシージャの最後で再びワークシートを保護

「保護」だけ、「解除」だけというマクロも用意できますが実際には「保護」と「解除」はセットで使う事が多いです。

EnjoyExcel
EnjoyExcel

1つのプロシージャの中でワークシートの保護と解除は何度でも使用する事ができます。

よって質問者様の課題は難なく解決することができますよ。

まずはワークシートの保護と解除について構文とパラメータを紹介します。

その後基本編としてコードの書き方を紹介します。最後に応用編として事例を1つ紹介する事にしています。

事例の中で質問者様の課題を解決させています。(すぐに事例をご覧になりたい方はこちら

関連記事

ワークブックを保存するする際にパスワードを設定することができるSaveAsメソッドを紹介しています。

SaveAsメソッドについてVBAはフォルダ内の複数ブック×全部のシート名をセットで取得できる

「ワークシートの保護」は「ワークシートのコピー」と関連性があります。

一緒に作業(操作)を行うことがありますので参考になる様に記事を用意しておきます。

シートをコピーする方法VBA|複数のシートをコピーしてから新規ブックとして保存する

関連書籍

ワークシートの保護と解除を含めやりたい事からコードを選ぶことが出来る本です。

おすすめ書籍です

電子書籍はこちらです。コンテンツが多く内容のしっかりした書籍は重たいです。

あくまで私見ですがこの本は電子書籍向きだと感じています。電子書籍での購入も是非ご検討ください。

おすすめの電子書籍です
ワークシートの保護と解除のアイキャッチ画像

ワークシートの「保護」と「解除」とは

まずはワークシートの保護と解除について情報を整理しておきます。

ワークシートの保護

まずはワークシートの保護について「定義」、「構文」、「パラメータ」の順に説明していきます。

定義

定義はこちらです。Microsoftのドキュメントを引用します。

他のユーザーが誤って、または意図的にデータを変更、移動、または削除することを防ぐために、Excel ワークシートのセルをロックし、さらにシートをパスワードで保護することができます。

たとえば、自分が所有者であるチームの進捗レポートのワークシートがあり、このワークシートを、チームのメンバーが特定のセルだけにデータを追加でき、それ以外の変更ができないようにする必要があるとします。

ワークシートを保護すると、シートの特定の部分だけを編集可能にすることができ、ユーザーはシートの他の領域のデータを変更できなくなります。 

Microsoftサポート_ワークシートを保護するより抜粋

構文

第1印象としては非常に多くのパラメータを所持している事が分かります。

しかし単純にワークシートを保護するだけならパラメータ不要です。非常にシンプルなコードになりますよ。

Worksheet.Protect (PasswordDrawingObjectsContentsScenariosUserInterfaceOnlyAllowFormattingCellsAllowFormattingColumnsAllowFormattingRowsAllowInsertingColumnsAllowInsertingRowsAllowInsertingHyperlinksAllowDeletingColumnsAllowDeletingRowsAllowSorting、AllowFilteringAllowUsingPivotTabless)

Microsoft:Worksheet.Protect メソッド (Excel)より抜粋した後に一部を加工

パラメータ

沢山ありますが基本的には1番のPasswordを使う事が多いです。あとは必要に応じて読んでください。

各種パラメータの説明はMicrosoft のドキュメントを参照したうえで大幅に省略しました。(読みやすさを考慮した為)

詳細が知りたい方は引用ブロック右下の引用元ドキュメントへの参照部をクリックしてください。

番号名前説明既定値
1Password引数として任意のパスワードを設定なし
2DrawingObjectsTrueで描画オブジェクトを保護True
3ContentsTrueでコンテンツを保護 True
4ScenariosTrueでシナリオを保護True
5UserInterfaceOnlyTrueで画面上からの変更は保護、マクロからの変更は保護されないFalse
6AllowFormattingCellsTrue:ワークシートの保護中にセルの書式を変更可False
7AllowFormattingColumnsTrue:ワークシートの保護中に列幅、表示/非表示の変更可False
8AllowFormattingRowsTrue:ワークシートの保護中に行高さ、表示/非表示の変更可False
9AllowInsertingColumnsTrue:ワークシートの保護中に列の挿入可False
10AllowInsertingRowsTTrue:ワークシートの保護中に行の挿入可False
11AllowInsertingHyperlinksTrue:ワークシートの保護中にハイパーリンクの挿入可False
12AllowDeletingColumnsTrue:ワークシートの保護中に列の削除可False
13AllowDeletingRowsTrue:ワークシートの保護中に行の削除可False
14AllowSortingTrue:ワークシートの保護中に並べ替え可False
15AllowFilteringTrue:ワークシートの保護中にフィルター設定可False
16AllowUsingPivotTablesTrue:ワークシートの保護中にピボットテーブル使用可False
パラメータの設定は全て任意です。データ型は全てバリアント(Variant)型です。
Microsoft:Worksheet.Protect メソッド (Excel)より抜粋した後に一部を加工

ワークシートの解除

続いてワークシートの解除について説明します。

定義

解除は保護の反対の行為です。

指定した要素(シートやセル)の保護を解除することで変更を可能にします。

シートまたはブックの保護を解除します。 保護されていないシートやブックに対しては、このメソッドは無効です。

Microsoft:Worksheet.Unprotect メソッド (Excel)より抜粋

構文

解除の構文は非常にシンプルです。

Worksheet.Protect (Password)

Microsoft:Worksheet.Unprotect メソッド (Excel)より抜粋

パラメータ

番号名前説明規定値
Passwordワークシートを保護する時に設定したパスワードがあれば記入なし
パ1メータの設定は任意です。データ型はバリアント(Variant)型です。
Microsoft:Worksheet.Unprotect メソッド (Excel)より抜粋

基本編:使い方

「保護」も「解除」も1行です。あまりにもシンプルなのでパラメータのPasswordを使用しました。

Sub ワークシートの保護と解除_基本編()

'ワークシートの保護
Worksheets("Sheet1").Protect Password:="aaa"

'ワークシートの解除
Worksheets("Sheet1").Unprotect Password:="aaa"

End Sub

保護する際に設定したパスワードと同じ文字列を解除の時に使用してください。

保護する際に設定したパスワードと異なる文字を設定すると以下画像のようなエラーメッセージが表示される事になります。

パスワードを間違えると出てくるエラーメッセージ

応用編:1つのプロシージャ内でワークシートの保護と解除を使う

ワークシートの保護と解除について一定の理解を持ったうえで実際に事例に落とし込んでみます。

今回の事例は1つのプロシージャ(プログラム)の中でワークシートの「保護」と「解除」を使うという事例です。

ワークシート

作業前のワークシートは保護されています。裏付けとしてワークシート上部の複数のアイコンがグレーアウトしています。

画面中央やや下あたりに表示されたセルを指定してから右クリックすると出てくる項目も一部グレーアウトしていますね。

作業前のワークシート
ワークシートのセルC5にCという文字が入力されています。この文字を書き換えます。

ワークシートの保護を解除してセルC5の文字を書き換えた後再びワークシートを保護するという作業をします。

セルC5の文字は変更されていますがワークシートの保護の状態は作業前と同じ設定に戻されている事がわかります。

作業後のワークシート
ワークシートのセル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ステートメントを組み合わせてシートに罫線を引く

さらに応用編:複数のワークシートの保護と解除

複数のワークシートに対して作業を試みるにはまずワークシートを周回できるようにしましょう。

こちらの記事を読んでいただくとワークシートを周回する事ができる様になります。

本記事で紹介したコードを組み込む事ができれば複数のワークシートに対して保護と解除を仕掛けることができます。

まとめ

ワークシートの保護と解除について情報を整理してみました。

単純に保護と解除だけを考えれば非常に簡単なコードをで作業を構築する事ができます。

簡単に書けるコードであるにもかかわらず効果は絶大です。非常に強力な権限を得る事ができる機能です。

ワークシートの保護と解除はまさに「エクセルをコントロールする」という作業です。是非お試しください。

EnjoyExcel

タイトルとURLをコピーしました