- ベストアンサー
エクセルのマクロでフォームのチェックボックスのリンクするセルのロックを設定する方法
- エクセルのフォームのチェックボックスで【On】にした際に「コントロールの書式設定」にある「リンクするセル」のロックをする方法をマクロで実現することができます。
- また、フォームのチェックボックスで【Off】にした際に「リンクするセル」のロックを解除する方法もマクロで行うことができます。
- 初心者の場合、すべてのチェックボックスに対して個別に設定するのは時間がかかるため、効率的な方法を教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> Cells.Locked = False > ActiveSheet.Protect userinterfaceonly:=True '←これは要らない 前回の、#6440838 の#3さん(ベストアンサー)は、わざわざ調べて書いてくれたわけですが、それが、ご質問者さんに目に止まったのかな?もう少し、ご本人に、コメントを書いて、了解点を書いてあげたら、次の話にも通じるものがあったと思います。 まあ、あれこれ、私が書いたのがイケナイなかったのか、話が通じていなかったようですが、つまり、それは、前回の#3さんの話そ通りだけど、それは、逆も意味しているわけですね。 それは、Unprotect を使うまでは、UserinterfaceOnly:=Trueずっと設定されているということです。こんなことは、常識なのですが。 前回と、同じことを書くけれども、ThisWorkbook モジュール、こうして登録すればよいということです。そうすれば、その都度、ActiveSheet.Protect UserinterfaceOnly:=True が必要がなくなるわけです。 Private Sub Workbook_Open() 'これひとつで良い ThisWorkbook.Worksheets("Sheet1").Protect UserinterfaceOnly:=True End Sub '標準モジュール 'OnActition のマクロ Sub OPMacro() Dim nm As String Cells.Locked = False With ActiveSheet.CheckBoxes(Application.Caller) nm = .LinkedCell If .Value = xlOn Then Range(nm).Locked = True Else Range(nm).Locked = False End If '他のセルは、Locked = False にする For Each cnt In ActiveSheet.CheckBoxes On Error Resume Next If .Name <> cnt.Name Then cnt.Value = xlOff End If On Error GoTo 0 Next End With End Sub フォームツールの、OnAction の設定の仕方 Sub SettingObject() Dim cn As Object For Each cn In Me.OptionButtons cn.OnAction = "OPMacro" Next End Sub >「コントロールの書式設定」にある「リンクするセル」のロックをしたいのですが 注意点としては、ロックすることは、問題ではありませんが、今の状態ですと、同じチェックボックスを、そのまま解除することは出来ませんね。当たり前ですよね。 なお、 Cells.Locked = False ということは、ひとつのセルのみを、.Locked = True ということだから、「他のセルは、Cells.Locked = False にする」という解釈をして、コードを書きました。分かっていただけるのかな?
その他の回答 (3)
- keithin
- ベストアンサー率66% (5278/7941)
一つ前かな?のご質問に問題箇所を修正したマクロを回答しておいたのですが,気が付かなかったようですね。もしわざとスルーしていたのでしたら余計なことをしました,その時はこのご質問の回答もごめんなさい。 それはそれとして,コントロールツールボックスではなくフォームのチェックボックスを使っているのであれば, 1.ひとつのチェックボックスに標準モジュールのマクロを登録し 2.そのチェックボックスが載ったセルごとコピーしてチェックボックスを複製する 3.マクロには,自分がどのチェックボックスから呼ばれたのか調べさせ,「適切なセル範囲」(今回ご質問では肝心のこの部分が不明なので参考マクロも書けません)を操作させる のような段取りで,一つ一つのチェックボックスに違うマクロを書くような羽目をしないで出来ます。 作成例: 次のマクロを標準モジュールに書いてチェックボックスに登録し,セル(例えばAY28)に置いておくと,一つ下のセル(AY29)をロックする AY28セルごとチェックボックスをコピーしてAZ28に置けばAZ29をロックする マクロを複製して増やす必要は全くない sub Sample2() activesheet.protect userinterfaceonly:=true ←ここは前々回通りでよい cells.locked = false ←ここは前回変えた箇所 with activesheet.shapes(application.caller) if .oleformat.object.value = 1 then .topleftcell.offset(1).locked = true ←ここは前々回通り end if end with end sub
お礼
返信ありがとうございます。苦戦しましたが、なんとかできました。
- merlionXX
- ベストアンサー率48% (1930/4007)
> 【On】にした際に「コントロールの書式設定」にある「リンクするセル」のロックをしたい ひょっとして一度Onにしたらそのまま固定して変更できなくしたいということでしょうか? もしそうなら、シート保護やリンク先セルのロックにかかわらず Sub Onで無効化() With ActiveSheet.CheckBoxes(Application.Caller) If .Value = xlOn Then .Enabled = False End If End With End Sub で、実現できます。 シー上のすべてのチェックボックスにこのマクロ、Sub Onで無効化() を登録するなら Sub 設置() Dim cb As CheckBox For Each cb In ActiveSheet.CheckBoxes cb.OnAction = "Onで無効化" Next End Sub で、瞬時に登録できます。 登録する際はシート保護をはずしてからにしてくださいね。
お礼
ありがとうございます。
- kybo
- ベストアンサー率53% (349/647)
クリックしたチェックボックスのオン、オフでセルの保護ロックをオンオフしたいという事であっているなら以下をチェックボックスにマクロ登録します。 このコードには、シートの保護、解除をする部分は記述していませんので、その辺はそちらで実装して下さい。 Sub macro() With ActiveSheet.CheckBoxes(Application.Caller) If .Value = xlOn Then Range(.LinkedCell).Locked = True Else Range(.LinkedCell).Locked = False End If End With End Sub
お礼
ありがとうございます。 助かりました。
お礼
返信ありがとうございます。苦戦しましたが、なんとかできました。