皆様こんにちは、ノグチです。
VBAでエクセルツールを作ったはいいけれど、「シートを追加されたり、削除されてしまうとマクロが動かなくなってしまう」「シートの名前を変えられるのも困る」
そんなお悩みはありませんか?
前回までにご紹介した、WorksheetオブジェクトのProtectメソッドを使ったシートの保護設定では、シート内容は編集できないようにできても、ブック内のシートの名前を変更したり、シートを追加・削除したりといったシートに対する操作に対しては管轄外なんですよね。
でもご安心を。ちゃんとブックの保護ができるメソッドも用意されていますよ。
それがWorkbookオブジェクトのProtectメソッドとUnprotectメソッド。
今回はこのメソッドを使って、エクセルVBAでブックの保護設定と、ブックの保護を解除する方法をご紹介します!
ブックの保護とはなんぞや?や、何ができるのか?は下記記事でご紹介していますので、こちらをご覧くださいませ。
ブックの保護を設定する
Protectメソッドの記述方法
VBAでブックの保護を設定するには、WorkbookオブジェクトのProtectメソッドを使います。
このメソッドは、Workbookオブジェクトに対してブックの保護を設定してくれるメソッドです。
記述方法はこちら。
Protectメソッドでブックの保護を設定する
では早速Protectメソッドを使ってブックを保護してみましょう。
下の表のB列「数量」とC列「単価」を乗算して、D列「合計」にその計算結果を出力、最後にブックの保護を設定する、というコードを使います。
コードはこちら。
Sub 計算処理後にブックを保護()
Dim rowc As Long '処理行数カウンター
'******************************
'計算処理
'******************************
rowc = 2
Do While Cells(rowc, 1).Value <> ""
'B列とC列を乗算して、D列に結果を表示する
Cells(rowc, 4).Value = Cells(rowc, 2).Value * Cells(rowc, 3).Value
'次の行へ
rowc = rowc + 1
Loop
'ブックの保護
ThisWorkbook.Protect
End Sub
このコードを実行して、シートの名前を変更しようとすると…
この通り、ブックの保護が設定されて、シートの名称変更ができないようになっています。
さらに、シートにマウスカーソルを当てて右クリックをしてみると、
この通り、シートの挿入や削除、名前の変更やコピーまで選択できないようになっています。
これで、ブックの保護が設定できました!
ブックの保護を解除する
Unprotectメソッドの記述方法
ブックの保護が設定できたところで、お次はその解除方法をご紹介します。
ブックの保護を解除するために使うのは、ブックの保護を解除するためのメソッド、WorkbookオブジェクトのUnprotectメソッドです。
記述方法はこちら。
このメソッドを使えば、Protectメソッドで設定したブックの保護だけでなく、手動で設定したブックの保護も解除することができます。
Unprotectメソッドでブックの保護を解除する
では実際に、Unprotectメソッドを使ってブックの保護を解除してみます。
Protectメソッドの項でお見せした、ブックの保護を設定したブックで下記のコードを実行してみます。
Sub ブックの保護を解除()
ThisWorkbook.Unprotect
End Sub
では、ちゃんとブックの保護が解除されたか確認するために、シートの名前を「表1」から「計算結果」に変更してみましょう。
この通り、ブックの保護が解除されてシートの名前が「計算結果」に変更できるようになっています。
念のためシートのタブにマウスカーソルを合わせて右クリックメニューを表示してみると…
こちらも図の通り、シートの挿入、削除、コピーも選択できるようになっていますね。
これでブックの保護が解除できました!
最後に
いかがでしたでしょうか。
今回は、VBAでブックの保護設定と解除の方法をご紹介しました。
ツールによっては、VBAで計算やデータ加工した結果をユーザに見せるだけにしたい、というものあるでしょう。そんなときは、VBAのデータの加工処理のコードの後にシートとブックの保護を設定するコードを加えておけば、人間の手動によるシート内容の変更や、シートの追加や削除を防ぐことができます。
作成したツールや、変更させたくないものの内容によって、シートの保護とブックの保護を組み合わせたり、或いは使い分けてみてくださいね。
それでは、最後までお読みいただきありがとうございました!