【エクセルVBA】保護しているシートでマクロの操作だけ有効にする方法


protect,unprotectオプション

皆様こんにちは、ノグチです。

前回は、 WorksheetオブジェクトのProtectメソッドとUnprotectメソッドを使ったシートの保護と保護の解除をご紹介しました。

【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法
ProtectメソッドとUnprotectメソッドを使って、VBAでシートの保護を設定したり、解除したりする方法をご紹介しています。VBAで作成したレポートを変更させたくない!という時にこのメソッドを加えておけば、シートの保護までVBAがやってくれますよ。シートの保護を忘れずに設定したい!という時におすすめです。

今回は、ProtectメソッドのオプションUserInterfaceOnlyを使って、手動のシートへの変更は不可にしつつ、VBAでのシート変更は可能にする方法をご紹介します!

スポンサーリンク

保護されているシートはマクロからも操作できない

まず、シートの保護を設定すると、ユーザの手動によるシート操作のほか、マクロからのシート内の処理も制限されてしまいます。

シートの保護を設定したシート上でマクロを実行すると、以下のような実行時エラーになり、シート上での操作ができないようになっています。

vba,UserInterfaceOnly,マクロ,マクロ操作無効

「シートの保護でユーザの操作を制限するのはいいけど、マクロからは操作できるようにしたい…」

そんな時に有効なのが、ProtectメソッドのUserinterfaceOnlyオプションです。これはシートの保護をユーザの手動シート操作に対してのみ有効にするかどうか、という設定を行うものです。

言い換えると、対象のシート上でVBAだけがシート内の操作ができようにするかどうか?という設定をします。

このオプションを使って、ユーザによる手動のシート操作は制限しつつ、マクロでのシート操作は許可する方法をご紹介していきます。

UserInterfaceOnlyオプション

まず、UserInterfaceOnlyオプションの記述方法はこちら。

Worksheetオブジェクト.Protect UserInterfaceOnly:=True

このオプションで指定するのはTrueかFalseのどちらかです。

  • True :ユーザによるシート内操作に対してシートの保護を有効にする(VBAのみシート内操作が可能)
  • False :ユーザによるシート内の操作とVBAでのシート内の操作両方に対してシートの保護を有効にする

このオプションを指定しなければ、Falseを指定したとき同様、 ユーザの手動入力、VBAでの処理両方に対してシートの保護が有効になります。

マクロだけシート内の操作ができるシートの保護を設定する

UserInterfaceOnlyオプションの使用例

では、実際にUserInterfaceOnlyオプションを使って、マクロだけが操作できるシートの保護を設定してみましょう。

前回の記事で例としてお見せした、B列とC列の値をかけて、D列に表示するというコードの最後にUserInterfaceOnlyオプションを追加しました。

掛け算の処理が終わったら、ユーザの操作を制限するシートの保護を設定する、というコードにしています。

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.Worksheets("Sheet1").Protect UserInterfaceOnly:=True
End Sub

このコードの実行結果がこちら。

UserInterfaceOnly,実行結果,vba

見た目は特に変わったところはありませんが、セルの値を変更しようとすると…

UserInterfaceOnly,実行結果

この通り、シートの保護が設定されていて、手動でのシート変更ができないようになっていますね。

マクロでセルの値を変更してみる

ではこの状態で、VBAで先ほどの実行結果にある表のA2セルの値を、「あいうえお」から「みかん」に変更してみましょう。

コードはこちら。

Sub セルの値変更()

ThisWorkbook.Worksheets("Sheet1").Cells(2, 1).Value = "みかん"

End Sub

このコードを実行してみると…

UserInterfaceOnly,vba実行結果,表の値変更

この通り、実行時エラーになることもなく表のA2セルが「みかん」に変更できました。

では、シートの保護はちゃんと設定されたままになっているか確認してみます。

手動でシート上のセルを選択しようとすると…

UserInterfaceOnly,vba,実行結果,表の値変更,メッセージ

この通りメッセージが表示されて、手動の操作に対してシートの保護がかかっていることがわかりますね。

このように、ProtectメソッドのUserInterfaceOnlyのオプションを使えば、VBAのシート内の操作を許可しつつ、ユーザの手動操作に対してのみシートの保護を有効にすることができるのです。

最後に

今回は、ProtectメソッドのUserInterfaceOnlyオプションをご紹介しました。

このメソッドとオプションを使えば、ユーザの手動によるシートへの操作は制限しつつ、VBAからはシートへの操作を可能にすることができるようになりますよ!

手動操作もVBAでの操作も両方制限するのか、VBAのみなのかは、そのエクセルツールの種類や使う人によって変わるかと思いますので、場合によって使い分けてくださいね。

次回は、ProtectメソッドのPasswordオプションと、UnprotectメソッドのPasswordオプションを使った、パスワード付のシートの保護設定と解除の方法をご紹介していきます。

それでは、最後までお読みいただきありがとうございました!

次回記事で、パスワード付のシートの保護と解除の方法をご紹介しています。

【エクセルVBA】VBAでパスワード付のシートの保護を設定・解除する方法
ProtectメソッドのPaswordオプションを使った、パスワード付のシートの保護を設定する方法と、UnprotectメソッドのPasswordオプションでパスワード付のシートの保護を解除する方法もご紹介しています。これを使えば、パスワード付シートの保護を、VBAから設定・解除することができますよ。

連載目次:エクセル&VBAでブックやシートの保護をするテクニック

エクセルやVBAで「このシートは消されると困る」とか、「シートの名前を変えられるとVBAが動かなくなる」といった悩み、ありますよね。そんな時は「保護」をして操作ができないようにすることができます。本シリーズではエクセルやエクセルVBAでブックやシートの保護をするテクニックについてお伝えします。
  1. 【Excel】勝手な編集は許しません!初心者向けのシート保護設定
  2. 【Excel】勝手なシート操作を防ぐ!初心者向けのブックの保護設定
  3. 【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法
  4. 【エクセルVBA】保護しているシートでマクロの操作だけ有効にする方法
  5. 【エクセルVBA】VBAでパスワード付のシートの保護を設定・解除する方法
  6. 【エクセルVBA】シートの追加も削除も、名前さえ変えさせない!VBAでブックの保護を設定する方法

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