この前は、シートをロックしながらコマンドボタンを押せたりする工夫でした。
次の投稿で、ネタ明かしをする”おまけ”コメントを書いたので、いざスタート。
実は、シートのロックで、シート上のコマンドボタンの挙動が気掛かりでした。
きっと、コマンドボタンも制御されて動かなくなってしまうのではと思い込み。
ところが、サンプルのコードを書いて実行させると、ボタンはロックしないの。
このコマンドボタンは、シートフォームと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 件のコメント:
コメントを投稿