【ExcelVBA】マクロでシートの保護・解除

前回、ボタンの使い方について記事にしたのですが、
実際、ボタンを使ってどんな処理ができるか作ってみようと思います。

今回は、タイトルにも書いたシートの保護を作ってみたいと思います。

シートの保護って、使った事があるでしょうか?
関数を組んでる方なら使った事があるんじゃないでしょうか。

セルに入力を行うと以前の値が上書きされてしまいます。
この事は、Excelを触った方なら当然知っておられると思います。

関数は、セルに書き込む事でセル上の計算を自動に行ってくれる、
Excelの機能で便利なんですが、問題があります。

関数をセルに書き込むって事は、
上書きされると、関数が消えてしまう事になります。

関数を設定してるシートなんかは、消えてもらうとこまるので、
そのセルにロックを掛ける必要があります。

セルをロックする為には、シートの保護機能を使う事になるんですが…

シートの保護は設定が面倒なんですよね~ (T-T) グスッ
また、かけ忘れも良く起こります。

なので、ボタン一つで保護・解除ができると、すごく楽になるかと思うんですよね。

その辺を踏まえて、セルのロックからシートの保護までを説明していこうと思います。

使用するExcelは、Excel365になります。

シートの保護

シート保護②.jpg
ざっくりした表で申し訳ないんですが、
赤枠に売り上げ計算の関数が組み込まれています。

入力は売上個数入力に行うと自動的に売り上げ計算がされます。
当然、入力欄以外は触って欲しくないんですよね。

こんな時、入力欄以外を保護してセルに書き込めなくします。

まず確認作業をします。
シートの枠左上に全セル選択のボタンがあります。
シート保護③.jpg
このボタンをクリックして、全セルを選択状態にします。
シート全部が灰色にハイライトされたらOKです。

どこでもいいので、シート上で右クリックします。
シート保護⑤.jpg
開いたメニューからセルの書式設定をクリックします。

書式設定のメニューが開いたら保護タブに切り替えて
シート保護④.jpg
ロックにチェックが入ってるか確認します。
外れていればチェックを入れます。

このロックと言うのは、シート保護を掛けた時にセルが操作できなくなる物です。
通常、Bookを立ち上げると全セルがロックされてます。
何かの操作で外れてる時があるので、最初に確認しておくと間違いがないと思います。

つづてい、入力欄の記入セルを選択して右クリックします。
シート保護⑥.jpg
メニューからセルの書式設定を開きます。
シート保護⑦.jpg
選択したセルだけロックを解除します。

これでシート保護を掛けた時、選択したセルだけ入力する事ができます。

つづいてシート保護を設定します。
上部のリボンから”校閲”に切り替えます。
シート保護⑨.jpg
校閲のメニューにシートの保護があるのでクリックします。

シートの保護メニューが開いて設定する事ができます。
シート保護⑩.jpg
一番上にパスワードの設定があります。
これを設定すると解除するのにパスワードが必要になります。
パスワードについては、マクロの部分で説明します。

チェック項目一覧がたくさんありますが、
初期状態では、ロックされたセル範囲選択とロックされてない範囲選択
この二項目にチェックが入っています。

チェックの入ってる項目は、シート保護時にも適用される操作項目になります。

今回は、セルの書式設定だけ使えるようにチェックを入れます。
この項目にチェックがないと、フォントを変更したり色を変えたりができなくなるので、
書式が使えるようにだけしておきます。

設定ができたらOKをクリックします。
これで保護を掛ける事ができました。

保護をされてるか確認する場合、
シート保護⑪.jpg
シートの保護ボタンが、シート保護の解除に変わってれば掛かっています。

この状態で、ロックされてるセルを選択してデリートしてみます。
シート保護⑫.jpg
関数の組まれてるセルを選択してDeleteキーを押しましたが
保護されてるメッセージが表示されて操作できなくなりました。ヽ(´▽`)/~♪


と、ここまでシート保護について書きましたが、
これって、保護されてるか解除されてるか分かりにくくないですか?

いちいち、シートの保護ボタンを確認する必要があるのと
保護する度に校閲に切り替えて、更に保護メニューを設定する必要があるんですよ。
( ̄~ ̄;) ホゴスルノワスレタ

これをボタン一つで出来るようにするのが、今回の目的でっす。
更に保護か解除か表示も作って、分かり易くしようと思います。

セルのロックについては、初期段階で設定しておけばOKなんで、
その部分は考えないとして、マクロを組んでみます。


まず、ボタンと表示を作ります。
シート保護⑬.jpg
ボタンを押すとシート保護・解除ができるようにします。
状態は、今回はJ1セルに表示するようにします。

開発に切り替えて、マクロボタンを押します。

マクロのウィンドウが開いたら、
名前を”シート保護機能”にして、作成ボタンをクリックします。
シート保護⑭.jpg
標準モジュールに、Sub シート保護機能()が作成されたと思います。

初めての方に少し説明すると、
Sub プロシージャ名()~ End Sub 

プロシージャ名を呼び出すと、Sub~End Subの中身を実行してくれます。

今回は、シート保護機能と言う名前を付けました。
標準モジュールについては、前回記事で少し触れているので、そちらを参照下さい。

本題に戻って、コーディングをします。
シート保護機能

Sub シート保護機能()

Const cellName As String = "J1"
Const protection As String = "保 護 中"
Const notProtect As String = "解 除 中"
Const yellow As Integer = 27
Const green As Integer = 43

With ActiveSheet

If .ProtectContents = True Then
.unprotect

Range(cellName) = notProtect
Range(cellName).Interior.ColorIndex = yellow

Else
Range(cellName) = protection
Range(cellName).Interior.ColorIndex = green

.protect AllowFormattingCells:=True

End If

End With

End Sub

ざっくり説明していきます。
使用する変数の設定からなんですが、
通常は、Dimを使って変数宣言を行うのですが、
全て決まった数値や文字を使うので、定数で宣言しておきます。

まず、シートの保護状態を確認しないと、
保護するのか解除するのか分からないので、

If .ProtectContents = True Then で確認します。
保護中ならTrueとなるので、ActiveSheet.unprotectで解除を命令します。
解除後にJ1セルに文字と背景色を設定します。

Falseなら解除中となるので、ActiveSheet.protectで保護を掛けます。
ただ、書式設定が使えないと不便です。
シート保護⑩.jpg
手動で設定した際、セルの書式設定にチェックをいれました。

これをコマンド入力したものが、AllowFormattingCells:=True です。
ActiveSheet.protectの後ろにチェックを入れる項目を指定する事ができます。

パスワードについては、注意点があるので後ほど説明します。

コーディングができたのでシートに戻って、作っておたいボタンを右クリック、
メニューからマクロの登録でシート保護機能を選択すればOKです。

実際にボタンを押してみると、
シート保護⑮.jpg
切り替わるようになったと思います。
シートの保護が効いてるか確かめたい場合は、校閲に切り替えて、
シートの保護ボタンの表示が変わるか見ると分かり易いと思います。

これでシートを保護できるようになったのですが、
いろいろと疑問に思われる部分が多いと思います。

正直、実用的ではないです。(;^_^A

問題点は、ボタンがむき出しで誰でも操作できる。
正直、シート保護の意味がないですよね。(;^o^) \(ToT )あんたほんとにそれでいいの

そんな時は、パスワード設定です。
ActiveSheet.protect Password:=”○○○○”で設定する事ができます。

早速導入してみます。
シート保護機能

Sub シート保護機能()

Const cellName As String = "J1"
Const protection As String = "保 護 中"
Const notProtect As String = "解 除 中"
Const yellow As Integer = 27
Const green As Integer = 43
Const pass As String = "1234"

With ActiveSheet

If .ProtectContents = True Then
.unprotect

Range(cellName) = notProtect
Range(cellName).Interior.ColorIndex = yellow

Else
Range(cellName) = protection
Range(cellName).Interior.ColorIndex = green

.protect Password:=pass, _
AllowFormattingCells:=True

End If

End With

End Sub

パスワードを”1234”に設定して様子を見ます。

解除を掛けると、パスワード画面が登場しました。
シート保護⑯.jpg
パスワードを1234を入力してOKっと…
解除できました~ヽ(´▽`)/~♪

パスワードを間違えると、さてどうなるか検証でっす。
シート保護⑰.jpg
なんじゃこりゃ~ ( ゜.゜) ポカーン

なぜデバッグメッセージがでるの…

実は、パスワードを間違えると、その後の処理を書いておかないと
コードエラーと認識されます。

なので、エラー対応の処理を作っておかないとデバッグしやがれ!
と怒られます。(T^T) ヒック

修正します。
シート保護機能

Sub シート保護機能()

Const cellName As String = "J1"
Const protection As String = "保 護 中"
Const notProtect As String = "解 除 中"
Const yellow As Integer = 27
Const green As Integer = 43
Const pass As String = "1234"

With ActiveSheet

If .ProtectContents = True Then
On Error GoTo ErrHandl
.unprotect

Range(cellName) = notProtect
Range(cellName).Interior.ColorIndex = yellow

Else
Range(cellName) = protection
Range(cellName).Interior.ColorIndex = green

.protect Password:=pass, _
AllowFormattingCells:=True

End If

End With

Exit Sub

ErrHandl:
MsgBox "パスワードが違います。"

End Sub

これでパスワードが間違っているとメッセージと共に
プロシージャを終了してくれます。

試しに動かしてみます。
適当にパスワードを入れてOKをクリック
シート保護⑱.jpg
無事にメッセージボックスが開いて、エラーデバッグも掛からなくなりました。
(V)O¥O(V) フォフォフォ

パスワード設定をする時は、この処理を忘れるとデバッグがでるので、
注意が必要ですね。

これで終わりと言いたのですが、まだ残っています。
実は、一番厄介なのがキャンセルボタンです。

試しに押してみます。
シート保護⑲.jpg
おいおい(-"-;) ??

何かおかしな事になってます。
キャンセルしたので、解除されないはずなのに表示が解除になりました。
シートの保護はどうなってるかと言うと、保護されたままの状態です。

コードを見ると

With ActiveSheet

If .ProtectContents = True Then
On Error GoTo ErrHandl
.unprotect

Range(cellName) = notProtect
Range(cellName).Interior.ColorIndex = yellow

パスワードの間違いは、エラーとして読み取るようですが、
キャンセルについては、.unprotectだけを回避する仕様のようです。(T^T) ヒック

なので、後ろに書いてる表示設定だけ実行されてIf文を出る動きをしています。
はた迷惑な機能です。

正直、使いにくい…

とは言え、キャンセルの設定をしておかないと
表示がおかしくなるので、面倒ですが設定します。

With ActiveSheet

If .ProtectContents = True Then
On Error GoTo ErrHandl
.unprotect

'キャンセルボタンを押した時'
If .ProtectContents = True Then
Exit Sub

End If

Range(cellName) = notProtect
Range(cellName).Interior.ColorIndex = yellow

一度判定した処理を、再度、中で判定すると言うおかしな処理に…
なんなんでしょう(-_-;)

しかし、これでキャンセルボタンの設定ができました。
正直、パスワードは使いにく設定ですね。
これなら自力でパスワード入力を作った方が楽なような…

その辺りは、後日記事にしようと思っています。


ま、いちいち面倒ですが必要なシートの保護。
これで少しは楽に設定が出来るのではないかと思います。

しかし!問題点は他にもあります。

実は、セルの書式設定を選択してもセル結合・解除は使えません。
なので次回は、セル結合・解除のボタンを作ってみようと思います。

それではこの辺で (^ _ ^)/~~サヨナラ

この記事へのコメント

  • Reiko.S

    マクロ初心者の労務人です。
    店舗での小口の出納帳をマクロで使用していますが、PC苦手な方が多く、ボタンで、それもパスワードで保護できるシートを作りたく、こちらを見て、あまりにもぴったりで、使わせて頂きました。本当に助かりました。ありがとうございます。
    2024年03月22日 19:58
  • kero

    コメントありがとうございます。
    返事が遅くなり申し訳ありません。m(_ _)m

    実務で使用されると言う事で、役に立ててうれしいく思います。

    私も昔、1週間掛けて作った在庫表を二日で上書きされて、
    使えなくなった苦い思い出が… (T-T) グスッ

    シート保護って大事ですね~

    それでは、よりよいVBAライフを。
    分からない事とかあれば、気軽にコメントして下さいね。
    2024年04月02日 01:47