プロが教える店舗&オフィスのセキュリティ対策術

閲覧頂きありがとうございます。
現在複数の表に対してチェックボックスをクリックするとセルがロックするマクロを組んでおります。
しかし、複数のチェックボックスをクリックすると”RangeクラスのLockedプロパティを設定できません。”と出てきます。
プロシージャもわけて書いております。

下記にコードを記します。
よろしければ解決策を教えて頂けないでしょうか?
よろしくお願いします。


Private Sub CheckBox1_Change()
If CheckBox1.Value = True Then
Range("C13").MergeArea.Locked = True
Range("C17").MergeArea.Locked = True
Range("I14").MergeArea.Locked = True
Range("I15:I18").Locked = True
Range("I19").MergeArea.Locked = True
Range("K19").Locked = True
Range("I20").Locked = True
Range("N16").MergeArea.Locked = True
Range("S16").MergeArea.Locked = True
Range("V16").MergeArea.Locked = True
Range("X16").MergeArea.Locked = True
Range("Z16").MergeArea.Locked = True
Range("AE14").Locked = True
Range("AG14").Locked = True
Range("AD15").Locked = True
Range("AF15").Locked = True
Range("AH15").Locked = True
Range("AE17").Locked = True
Range("AG17").Locked = True
Range("AF19").Locked = True
Range("AH19").Locked = True
Range("AJ16").MergeArea.Locked = True
Range("AL16").MergeArea.Locked = True

ActiveSheet.Protect
Else
ActiveSheet.Unprotect
Range("C13").MergeArea.Locked = False
Range("C17").MergeArea.Locked = False
Range("I14").MergeArea.Locked = False
Range("I15:I18").Locked = False
Range("I19").MergeArea.Locked = False
Range("K19").Locked = False
Range("I20").Locked = False
Range("N16").MergeArea.Locked = False
Range("S16").MergeArea.Locked = False
Range("V16").MergeArea.Locked = False
Range("X16").MergeArea.Locked = False
Range("Z16").MergeArea.Locked = False
Range("AE14").Locked = False
Range("AG14").Locked = False
Range("AD15").Locked = False
Range("AF15").Locked = False
Range("AH15").Locked = False
Range("AE17").Locked = False
Range("AG17").Locked = False
Range("AF19").Locked = False
Range("AH19").Locked = False
Range("AJ16").MergeArea.Locked = False
Range("AL16").MergeArea.Locked = False

End If

End Sub

A 回答 (4件)

皆さんの指摘を総合すると、こんな感じになるかな。


For Eachについては、おいおい勉強してください。

Private Sub CheckBox1_Click()
Dim r As Range
ActiveSheet.Protect UserInterfaceOnly:=True
For Each r In Range("LockArea1")
r.MergeArea.Locked = CheckBox1.Value
Next r
End Sub
    • good
    • 0

>複数のチェックボックスをクリックすると”RangeクラスのLockedプロパティを設定できません。


このエラー自体は、ひとつは、保護状態でセルのプロパティを変更しようとした場合であり、なおかつ、マクロの書く場所が、Active Xコントロールをお使いのハズなのに、シートモジュールを使っていないからです。(別途、サブルーチンを標準モジュールに備えている場合はこの限りではありませんが、ご質問に書かれたコードを対象にした場合)

しかし、コードを読んだ感じとして、ロジックが変な気がしますね。
ActiveSheet.Protectで、セルのロック、ActiveSheet.Unprotect で、セルのロックを解除では矛盾しているように思うのですが……。そこらはどういう考えなのかなと疑問に思います。

プロテクトをしてセルをロックするというのは、しなくてもよいはずなのです。
プロテクトした状態では、書き込めないのですから。
それに、セルのロックを外すだけなら、1回だけで十分だと思います。

>よろしければ解決策を教えて頂けないでしょうか?
解決というよりも、本来の目的は、そのブックのユーザーの入力を拒否するということではないでしょうか。だとしたら、それは、セルのロックとは違い、入力規則にするか、セルの入力にパスワードを設けるのか、いくつか方法はあるはずです。

むろん、チェックボックスで、書き込み可能にしたり、書き込み不能にするなら、シートのプロテクトを外して、セルのロック、セルのロック外しをして、最後は必ず、シートはプロテクト状態にしなければなりませんね。そのときに、No.2様、ご指摘のようにシートのモードが、UserInterFaceOnly モードでマクロの利用可になるから、1回、そのモードでプロテクトしておけば、保存するまでは、Protect, Unprotect の命令が不要になるということです。
    • good
    • 0

こんにちは



>複数のチェックボックスをクリックすると~~
ご提示のものは一つだけですが、同様で対象セル範囲の異なるものが複数存在するということですよね?

No1様がご指摘の状態の他にも、シートに保護がかかった状態で、セルのLockedプロパティを変更しようとしても同様のエラーが出ます。
一方で、ご提示のコードはそれぞれ単独で保護の状態を変えていますので、複数のプロシージャが実行されるような場合、その実行される時の状態がどちらになっているのかは不定ということになります。

ですので、処理の最初に必ず、
 ActiveSheet.Unprotect
をいれるとエラーがでなくなったりはしませんか?

とは言っても、それぞれ異なるセル(群)のロック状態を制御しているのだと想像しますので、シートの保護が外れた状態は基本的にないものとして考えた方が良いのではないでしょうか。
つまり、マクロから操作する時にだけ、最初に保護を解除、最後に必ず保護を設定という手順になるかと思います。
このような手順が面倒なら、保護をかける際に
ActiveSheet.Protect UserInterfaceOnly:=True
としておけば、マクロからの変更に関しては保護が無い時と同様になりますので、保護の状態を気にしなくても良くなります。


以降は、ご質問とは関係のない、いらぬおせっかいになりますが…

ご提示のコードのセル範囲の列挙はなんとかしたいですね、
(チェックボックスが複数あるならなおさらです)

セル範囲のセットは固定だと想像しますので、例えば、名前の定義を利用して、あらかじめセル群に名前を付けておけば汎用のルーチンをひとつ作成しておくことで、

それぞれのイベント処理は
 Private Sub CheckBox1_Change()
  Call LockProcedure( "LockArea1", CheckBox1.Value )
 End Sub
のような要領で済ませられるので、簡単にできると思います。

一方、汎用ルーチン側で名前の定義からその対象レンジを取得するには
 ThisWorkbook.Names.Item(areaName).RefersToRange
で可能です。
この範囲に対して同じ処理を行う記述にしておけば良いので、対象範囲に含まれるセルが多い程、コードの記述は大幅に短縮できるものと思います。
    • good
    • 0

>”RangeクラスのLockedプロパティを設定できません。

”と出てきます。

コード(記述)は見ていませんが、このエラーは、結合セルを保護対象から外す場合にmergeareaがなければ出ることが多いとか。
http://www.navio.ne.jp/navio/29012.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A