[[20180219144713]] 『セルのロックを複数作りたい』(gyomu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルのロックを複数作りたい』(gyomu)

エクセルで複数のセルに文字を入力後、そこが編集できないように
ロックをかけたいです。
シート全体で保護するのではなく、
行ごとにロックをかけたいです。
イメージとしては、複数のセルに情報を入れ、
それらをロックさせる確定チェックボックスにチェックをいれたら、
それらのセルはロックされて変更できないようになる。
再度変更する場合には、チェックを外してから編集するようなイメージです。

情報を入力するセルが3つ、その横にチェックボックスがあるという行を
ずらーっと複数作りたいです。
一行だけに対してロックするならネットで見つけることが
出来たのですが、
1つのシートにそれを複数作るやり方が見当たりませんでした。

説明べたで、申し訳ございませんが、
お分かりになる方いらっしゃいましたら、
お教えいただければと思います。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


質問がよくわかりません。

セルのロックは、セル1つずつ個別に設定できますよ。
上手く行かない場合は、どのように操作してうまくいかなかったのか、教えて下さい。
(もこな2) 2018/02/19(月) 15:05


質問をよく見ずに書き込んでしまったので訂正。

「シートの保護」とセルの「ロック」は別物です。
シートの保護を実行(有効)にすると、「ロック」されたセルは編集できなくなります。
逆に言うと、「ロック」されてないセルは編集可能です。

また、シート保護が有効な状態で、「ロック」されたセル、「ロック」されてないセルのそれぞれが、「選択」できるのかは、シート保護を実行(有効)にするときのメニューで選択します。
ここで、「ロックされていないセル範囲の選択」にチェックを入れておかないと、論理的に編集は可能ですけど、「選択」できないから、実質的にはユーザーは編集不能になります。(マクロから書き込むのであればできる・・・かも。もっとも、マクロからの書込は、シートの保護を無視して書き込むという設定で保護することが可能です)

なので、マクロを使えば、チェックボックスが入ったときに、任意セルのロック状態を操作するといった記述をすればできるかもしれません。

(もこな2) 2018/02/19(月) 15:22


返信ありがとうございます。

保護とロックは異なることは、わかるのですが。
すみません、エクセル用語でいう保護とかロックではありませんでした。

一部のセルを編集不可にしたり、
戻すようにするチェックボックスを作りたいという感じです。
(gyomu) 2018/02/19(月) 15:46


前提条件がよく判らないので、以下と仮定します。
・ロックしたいセルの内側に、フォームコントロールのチェックボックスを貼っておく。
・チェックボックスは全て「マクロの登録」を行い、マクロ名は「チェック1_Click」で統一する。

そして、以下のコードを標準モジュールに貼っておいてください。

 Sub チェック1_Click()
    Dim C As Object

    ActiveSheet.Unprotect
    For Each C In ActiveSheet.Shapes
        If C.Name Like "Check Box*" Then
            C.TopLeftCell.Locked = (ActiveSheet.CheckBoxes(C.Name).Value = 1)
        End If
    Next C
    ActiveSheet.Protect
 End Sub
(???) 2018/02/19(月) 16:24

編集がかぶってしまったけどとりあえずそのまま投稿します。

VBAがおわかりになるのであればですけど・・・

(1)ActiveXコントロールのチェックボックスをシートに配置
(2)作ったチェックボックスを右クリック
(3)コードの表示でシートモジュールが開くので↓みたいな感じで記述
Private Sub CheckBox1_Click()

    'シートを保護せよ(ただし、マクロからの操作は自由にせよ)
    Protect UserInterfaceOnly:=True

    'A1セルのロックを、チェックボックスのチェックと同じにせよ
    '(つまり、チェックボックスにチェックが入ったら、A1はロックされる。外れればその逆。)
    Range("A1").Locked = CheckBox1.Value
End Sub
こんな感じでいけるかとおもいますが・・・
(もこな2) 2018/02/19(月) 16:27

もこな2さん案だと、チェックボックスの数だけプロシジャを書かないといけないので、設置が面倒かと思いました。 なので、フォームのチェックボックス案にしてみた訳です。 私の案だと、設定済のチェックボックスをセル丸ごとコピペするだけ。
(???) 2018/02/19(月) 16:35

投稿後に、コードを拝見しておんなじことおもいました。(なんども書かなきゃいけない)
ということで、アイデアをパク・・・インスパイアして、こんな感じに修正してみました。

(1)標準モジュールに以下を記述する。
Sub Sample2()
'==変数の宣言とか

    Dim obj As Object

'==主処理

    With ActiveSheet
        'シートを保護せよ(ただし、マクロからの操作は自由にせよ)
        .Protect UserInterfaceOnly:=True

        '変数「obj」にクリックしたチェックボックスをセットせよ
        Set obj = .CheckBoxes(Application.Caller)

        'クリックしたチェックボックスの左上が属するセルのロック状態を
        'クリックしたチェックボックスのチェック状態に合わせよ
        If obj.Value = 1 Then
            obj.TopLeftCell.Locked = True
        Else
            obj.TopLeftCell.Locked = False
        End If
    End With

'==後処理

    Set obj = Nothing
End Sub

(2)フォームコントロールのチェックボックスを必要なだけシートに配置して、すべてに上記のマクロを登録する。(???さんのアイデアのようにセルごとコピペでもok)

obj.Valueが論理値を返してくれないっぽくて悩みましたけど(というか使ってる定数がちがうのですかね?)、強引にIFで処理してみました(^^;)

(もこな2) 2018/02/19(月) 17:21


書き忘れました。
私の修正案のとおりだと、クリックしたチェックボックス以外は処理しませんので、いずれかのチェックをいじったら、即、すべてのチェックボックスの状態を反映というようにしたければ、???さんのようにFor Each 〜 Next で処理した方がいいとおもいます。
(もこな2) 2018/02/19(月) 17:26

もなこ2さん、???さん
ありがとうございます。

簡単に考えてました。
VBAがわからなく、ご教授いただいたやり方が
再現できませんでした。
せっかくご返答いただいたところ、
大変申し訳ございません。

こんな不躾な質問にご返答いただける
お気持ちに大変感謝と感動しました。
ありがとうございます。

少し勉強してみようかという気持ちになりました。

また何かあればご相談させていただきます。
(gyomu) 2018/02/20(火) 11:14


チェックボックスが貼れたということは、「開発」−「挿入」は使えているのかと思います。
挿入するオブジェクトで、「フォームコントロール」にある方のチェックボックスを1つ貼り、右クリックし、「マクロの登録」を選んでみてください。すると、初回ならば勝手に私が書いたものと同じマクロ名が表示されるので、「新規作成」ボタンを押せば、マクロの外側だけできあがります。 これを私が書いたコードに置き換えれば良いのですよ。

一度やってしまえば、簡単だということが判ると思いますので、試してみてください。
(???) 2018/02/20(火) 11:31


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.