皆様こんにちは、ノグチです。
前回は、 WorksheetオブジェクトのProtectメソッドとUnprotectメソッドを使ったシートの保護と保護の解除をご紹介しました。
今回は、ProtectメソッドのオプションUserInterfaceOnlyを使って、手動のシートへの変更は不可にしつつ、VBAでのシート変更は可能にする方法をご紹介します!
保護されているシートはマクロからも操作できない
まず、シートの保護を設定すると、ユーザの手動によるシート操作のほか、マクロからのシート内の処理も制限されてしまいます。
シートの保護を設定したシート上でマクロを実行すると、以下のような実行時エラーになり、シート上での操作ができないようになっています。
「シートの保護でユーザの操作を制限するのはいいけど、マクロからは操作できるようにしたい…」
そんな時に有効なのが、ProtectメソッドのUserinterfaceOnlyオプションです。これはシートの保護をユーザの手動シート操作に対してのみ有効にするかどうか、という設定を行うものです。
言い換えると、対象のシート上でVBAだけがシート内の操作ができようにするかどうか?という設定をします。
このオプションを使って、ユーザによる手動のシート操作は制限しつつ、マクロでのシート操作は許可する方法をご紹介していきます。
UserInterfaceOnlyオプション
まず、UserInterfaceOnlyオプションの記述方法はこちら。
このオプションで指定するのは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
このコードの実行結果がこちら。
見た目は特に変わったところはありませんが、セルの値を変更しようとすると…
この通り、シートの保護が設定されていて、手動でのシート変更ができないようになっていますね。
マクロでセルの値を変更してみる
ではこの状態で、VBAで先ほどの実行結果にある表のA2セルの値を、「あいうえお」から「みかん」に変更してみましょう。
コードはこちら。
Sub セルの値変更() ThisWorkbook.Worksheets("Sheet1").Cells(2, 1).Value = "みかん" End Sub
このコードを実行してみると…
この通り、実行時エラーになることもなく表のA2セルが「みかん」に変更できました。
では、シートの保護はちゃんと設定されたままになっているか確認してみます。
手動でシート上のセルを選択しようとすると…
この通りメッセージが表示されて、手動の操作に対してシートの保護がかかっていることがわかりますね。
このように、ProtectメソッドのUserInterfaceOnlyのオプションを使えば、VBAのシート内の操作を許可しつつ、ユーザの手動操作に対してのみシートの保護を有効にすることができるのです。
最後に
今回は、ProtectメソッドのUserInterfaceOnlyオプションをご紹介しました。
このメソッドとオプションを使えば、ユーザの手動によるシートへの操作は制限しつつ、VBAからはシートへの操作を可能にすることができるようになりますよ!
手動操作もVBAでの操作も両方制限するのか、VBAのみなのかは、そのエクセルツールの種類や使う人によって変わるかと思いますので、場合によって使い分けてくださいね。
次回は、ProtectメソッドのPasswordオプションと、UnprotectメソッドのPasswordオプションを使った、パスワード付のシートの保護設定と解除の方法をご紹介していきます。
それでは、最後までお読みいただきありがとうございました!
次回記事で、パスワード付のシートの保護と解除の方法をご紹介しています。