実際、ボタンを使ってどんな処理ができるか作ってみようと思います。
今回は、タイトルにも書いたシートの保護を作ってみたいと思います。
シートの保護って、使った事があるでしょうか?
関数を組んでる方なら使った事があるんじゃないでしょうか。
セルに入力を行うと以前の値が上書きされてしまいます。
この事は、Excelを触った方なら当然知っておられると思います。
関数は、セルに書き込む事でセル上の計算を自動に行ってくれる、
Excelの機能で便利なんですが、問題があります。
関数をセルに書き込むって事は、
上書きされると、関数が消えてしまう事になります。
関数を設定してるシートなんかは、消えてもらうとこまるので、
そのセルにロックを掛ける必要があります。
セルをロックする為には、シートの保護機能を使う事になるんですが…
シートの保護は設定が面倒なんですよね~ (T-T) グスッ
また、かけ忘れも良く起こります。
なので、ボタン一つで保護・解除ができると、すごく楽になるかと思うんですよね。
その辺を踏まえて、セルのロックからシートの保護までを説明していこうと思います。
使用するExcelは、Excel365になります。
シートの保護

ざっくりした表で申し訳ないんですが、
赤枠に売り上げ計算の関数が組み込まれています。
入力は売上個数入力に行うと自動的に売り上げ計算がされます。
当然、入力欄以外は触って欲しくないんですよね。
こんな時、入力欄以外を保護してセルに書き込めなくします。
まず確認作業をします。
シートの枠左上に全セル選択のボタンがあります。

このボタンをクリックして、全セルを選択状態にします。
シート全部が灰色にハイライトされたらOKです。
どこでもいいので、シート上で右クリックします。

開いたメニューからセルの書式設定をクリックします。
書式設定のメニューが開いたら保護タブに切り替えて

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

メニューからセルの書式設定を開きます。

選択したセルだけロックを解除します。
これでシート保護を掛けた時、選択したセルだけ入力する事ができます。
つづいてシート保護を設定します。
上部のリボンから”校閲”に切り替えます。

校閲のメニューにシートの保護があるのでクリックします。
シートの保護メニューが開いて設定する事ができます。

一番上にパスワードの設定があります。
これを設定すると解除するのにパスワードが必要になります。
パスワードについては、マクロの部分で説明します。
チェック項目一覧がたくさんありますが、
初期状態では、ロックされたセル範囲選択とロックされてない範囲選択
この二項目にチェックが入っています。
チェックの入ってる項目は、シート保護時にも適用される操作項目になります。
今回は、セルの書式設定だけ使えるようにチェックを入れます。
この項目にチェックがないと、フォントを変更したり色を変えたりができなくなるので、
書式が使えるようにだけしておきます。
設定ができたらOKをクリックします。
これで保護を掛ける事ができました。
保護をされてるか確認する場合、

シートの保護ボタンが、シート保護の解除に変わってれば掛かっています。
この状態で、ロックされてるセルを選択してデリートしてみます。

関数の組まれてるセルを選択してDeleteキーを押しましたが
保護されてるメッセージが表示されて操作できなくなりました。ヽ(´▽`)/~♪
と、ここまでシート保護について書きましたが、
これって、保護されてるか解除されてるか分かりにくくないですか?
いちいち、シートの保護ボタンを確認する必要があるのと
保護する度に校閲に切り替えて、更に保護メニューを設定する必要があるんですよ。
( ̄~ ̄;) ホゴスルノワスレタ
これをボタン一つで出来るようにするのが、今回の目的でっす。
更に保護か解除か表示も作って、分かり易くしようと思います。
セルのロックについては、初期段階で設定しておけばOKなんで、
その部分は考えないとして、マクロを組んでみます。
まず、ボタンと表示を作ります。

ボタンを押すとシート保護・解除ができるようにします。
状態は、今回はJ1セルに表示するようにします。
開発に切り替えて、マクロボタンを押します。
マクロのウィンドウが開いたら、
名前を”シート保護機能”にして、作成ボタンをクリックします。

標準モジュールに、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で保護を掛けます。
ただ、書式設定が使えないと不便です。

手動で設定した際、セルの書式設定にチェックをいれました。
これをコマンド入力したものが、AllowFormattingCells:=True です。
ActiveSheet.protectの後ろにチェックを入れる項目を指定する事ができます。
パスワードについては、注意点があるので後ほど説明します。
コーディングができたのでシートに戻って、作っておたいボタンを右クリック、
メニューからマクロの登録でシート保護機能を選択すればOKです。
実際にボタンを押してみると、

切り替わるようになったと思います。
シートの保護が効いてるか確かめたい場合は、校閲に切り替えて、
シートの保護ボタンの表示が変わるか見ると分かり易いと思います。
これでシートを保護できるようになったのですが、
いろいろと疑問に思われる部分が多いと思います。
正直、実用的ではないです。(;^_^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”に設定して様子を見ます。
解除を掛けると、パスワード画面が登場しました。

パスワードを1234を入力してOKっと…
解除できました~ヽ(´▽`)/~♪
パスワードを間違えると、さてどうなるか検証でっす。

なんじゃこりゃ~ ( ゜.゜) ポカーン
なぜデバッグメッセージがでるの…
実は、パスワードを間違えると、その後の処理を書いておかないと
コードエラーと認識されます。
なので、エラー対応の処理を作っておかないとデバッグしやがれ!
と怒られます。(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をクリック

無事にメッセージボックスが開いて、エラーデバッグも掛からなくなりました。
(V)O¥O(V) フォフォフォ
パスワード設定をする時は、この処理を忘れるとデバッグがでるので、
注意が必要ですね。
これで終わりと言いたのですが、まだ残っています。
実は、一番厄介なのがキャンセルボタンです。
試しに押してみます。

おいおい(-"-;) ??
何かおかしな事になってます。
キャンセルしたので、解除されないはずなのに表示が解除になりました。
シートの保護はどうなってるかと言うと、保護されたままの状態です。
コードを見ると
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苦手な方が多く、ボタンで、それもパスワードで保護できるシートを作りたく、こちらを見て、あまりにもぴったりで、使わせて頂きました。本当に助かりました。ありがとうございます。
kero
返事が遅くなり申し訳ありません。m(_ _)m
実務で使用されると言う事で、役に立ててうれしいく思います。
私も昔、1週間掛けて作った在庫表を二日で上書きされて、
使えなくなった苦い思い出が… (T-T) グスッ
シート保護って大事ですね~
それでは、よりよいVBAライフを。
分からない事とかあれば、気軽にコメントして下さいね。