2022年9月7日水曜日

シートを保護すると、シート上のテキストボックスも保護しますが、コマンドボタンは、そのまま使えたという周回遅れな発見 ー シート保護 (エクセルVBA)

     
この前は、シートをロックしながらコマンドボタンを押せたりする工夫でした。
次の投稿で、ネタ明かしをする”おまけ”コメントを書いたので、いざスタート。

実は、シートのロックで、シート上のコマンドボタンの挙動が気掛かりでした。
きっと、コマンドボタンも制御されて動かなくなってしまうのではと思い込み。

ところが、サンプルのコードを書いて実行させると、ボタンはロックしないの。
このコマンドボタンは、シートフォームとActiveXの二つのコントロールがある。

ひょっとして、シートフォームがダメで、ActiveXだけがフリーなんじゃないか。
なので、両方のコマンドボタンをシート上において実験したら、両方ともOKだ。

ここで分かったことは、ActiveXのボタンは、コードをシートモジュールに書く。
シートフォームのボタンは、標準モジュールにコードを書くので使いやすいな。

Private Sub Workbook_Open() 'ThisWorkBookモジュールに記述
  Call ProtectSheet1
End Sub

Sub ProtectSheet1() '標準モジュールに記述する
  Worksheets("Sheet2").Protect Password:="pass", _
  DrawingObjects:=True, _
  contents:=True, UserInterfaceOnly:=True
  MsgBox "シート2は、変更はマクロからしかできません"
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Application.Intersect(Target, Columns("A")) Is Nothing Then
    Range("A1").Select
  End If ’シートモジュールに記述しておく
End Sub

     
以上の三つのプロシージャを、一組にしてブックに書き込んで実験して下さい。
もちろん、対象シートは、テキストボックスもコマンドボタンも挿入し下さい。

保存してからブックを開くと、テキストボックスとセルがロックされています。
なのに、コマンドボタンはロックされずに押せば、プロシージャを実行します。

それで、二つ目のプロシージャでは、セルをクリックしても常に”A1”を選択だ。
加えて、セルの移動でシートをスクロールさせたいので。A列だけを移動OK。

一方、常にセルの”A1”を選択させるのなら、 Range("A1").Selectで済みます。
そして、メッセージボックスの記述の通り、変更はマクロだけからになります。

なお、シートの保護にはパスワードの設定もできますが不要にしても構わない。
記述を、Protect Password:=""のようにするだけですが、コードの記述は必要。

つまり、エクセルの作業に制約を加えるには、VBAコードを書かねばならない。
そういうことを頭に叩き込みつつ、プロシージャの挙動を解除する場合もある。

特に、シートの保護を解除するには、専用コードを実行させる必要があります。
このコードは、末尾に書いておきますので、上述のコードと共に使って下さい。

というわけで、シート上のセルの挙動をブロックする方法は、一通り完成です。
ただ、セルをダブルクリックすると、手動の操作に対してシートの保護がかかっている注意メッセージが出るので、これを表示させないようにしたいのですが、この方法が分からずに悶々としている自分なのでした。

おまけ: シート保護の解除・標準モジュールに記述
Sub UnprotectSheep()
ActiveSheet.Unprotect Password:="pass"  'パスワード指定で保護を解除
MsgBox "マクロ以外でも変更ができます"
End Sub



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿