[[20161222120048]] 『セルの値によって同行の違うセルのロックとロック』(かなめ) ページの最後に飛ぶ

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

 

『セルの値によって同行の違うセルのロックとロック解除』(かなめ)

こんにちは

エクセルのVBAで以下の動作をさせたいのでご教授くださいませ。

・エクセルのバージョンは2010になります
・タイトル行が1行〜18行まである入力シート(Sheet1)
・シートには他のセルに関数があるためシートの保護あり
・1ページにつき入力できるのは10行ずつで、デフォルトの設定ページは1ページのみだが、入力行の追加ボタンがあり10行ごとに増やすことが可能
・データ量は増減するため、毎回総ページ数は違う

シートの今の状態
 タイトル行を除き、F列・G列・I列・J列・S列(関数入力列)にはロックされておりシートの保護設定済み

《以下にしたいこと》
D列(D19に入力した場合)に"A"を入力した場合
 →F列・G列・I列・J列(F19・G19・I19・J19)をロックし、そのセルは選択できなくする

D列(D19に入力した場合)に"B"を入力した場合
 →F列・G列・I列・J列(F19・G19・I19・J19)をロックを解除し、そのセルに入力できるようにする

普段はマクロの記録程度の動作でなんとかしているのですが、不慣れな方にこのシートは入力してもらうためにどうしても必要なためよろしくお願いします。

< 使用 アプリ: 、使用 OS:unknown >


Rangeオブジェクトに対し、LockedプロパティのTrue/False を設定するマクロを書けば、実現できるのではないかと思いますよ。
(???) 2016/12/22(木) 13:46

こんにちは。

久しぶりに書いてみました。
相変わらずダサダサですが、初心者の方には分かり易いのでは、と思います。

ただ、質問者さんのしたい事を満たしているかどうかは不安です。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Row < 19 Then Exit Sub
If Target.Column <> 4 Then Exit Sub

Dim 最終行 As Integer

 最終行 = Cells(Rows.Count, 4).End(xlUp).Row

 Dim I As Long
 Dim OD As String

  For I = 19 To 最終行

         OD = Range("D" & I)

         If OD = "A" Then

                 Range("F" & I).Locked = True
                 Range("G" & I).Locked = True
                 Range("I" & I).Locked = True
                 Range("J" & I).Locked = True

            ElseIf OD = "B" Then

                 Range("F" & I).Locked = False
                 Range("G" & I).Locked = False
                 Range("I" & I).Locked = False
                 Range("J" & I).Locked = False

          End If

   Next

End Sub
(素人) 2016/12/22(木) 15:28


 セルの保護を設定して入力可、入力不可 を制御するということは、当然 シートに保護がかかっているわけです。

 シート保護の際に、たとえ 書式設定を操作者に許可したとしても、セルの保護タブは表示されず
 当然、マクロからの設定も 1004エラーになります。

 ですから、どこかで一度、UserInterfaceOnly付のシート保護をかけておくか
 シート保護解除 --> セルのLockedプロパティの変更 --> シート再保護

 いずれかが必要です。

 かつ、保護は、いずれの場合にも、現在設定している許可条件を明示的に指定しないと
 許されていた操作ができなくなりますので、注意が必要です。

(β) 2016/12/22(木) 15:30


βさん、ありがとう御座います。

最初に保護解除、最後に再保護、のコードを書いていたのですが、
パスワード有りなのか、無しなのか、とかがわからなくて、
質問者さんがマクロの記録を使ってコードを書かれている様なので、
ここはやってもらえるかな、と思って消してしまいました。

(素人) 2016/12/22(木) 15:40


βさんに御指摘頂きましたので、保護はパスワード有りを前提にもう一度アップします。

Private Sub Worksheet_Change(ByVal Target As Range)

Sheets("Sheet1").Unprotect Password:="abcde" 'abcdeを今使っているパスワードに書きかえて下さい。

If Target.Row < 19 Then Exit Sub
If Target.Column <> 4 Then Exit Sub

Dim 最終行 As Integer

 最終行 = Cells(Rows.Count, 4).End(xlUp).Row

 Dim I As Long
 Dim OD As String

  For I = 19 To 最終行

         OD = Range("D" & I)

         If OD = "A" Then

                 Range("F" & I).Locked = True
                 Range("G" & I).Locked = True
                 Range("I" & I).Locked = True
                 Range("J" & I).Locked = True

            ElseIf OD = "B" Then

                 Range("F" & I).Locked = False
                 Range("G" & I).Locked = False
                 Range("I" & I).Locked = False
                 Range("J" & I).Locked = False

          End If

   Next

Sheets("Sheet1").Protect Password:="abcde" 'abcdeを今使っているパスワードに書きかえて下さい。

End Sub

(素人) 2016/12/22(木) 16:01


素人さま、βさま ご教授ありがとうございます。

仕事中のためすぐにお返事できずに申し訳ありません。
私がしたいと思っていたことが実現できました。

シートの保護の解除につきましては、オープンマクロにマクロからの変更は可のVBを入れていましたので、シートの保護解除がない状態でも動きました。
シートの保護があってもマクロからの変更可のVBはネットで調べている時に見つけました。

入力確認をしている際に気付いたのですが、入力間違いをしてD列のデータを消した時は元の状態に戻す(セルにロックがかかった状態)ことは可能でしょうか?

何度もお手数をおかけして申し訳ございませんが、再度ご教授よろしくお願い致します。
(かなめ) 2016/12/22(木) 16:40


 >>D列のデータを消した時

 具体的には D列のどこをどうすることが【消した】ことになりますか?

(β) 2016/12/22(木) 16:47


シートに変更を加えた時にコードが走る様にしているので、
データを消して確定させればコードは走りますが、
D列に"A"か"B"を書いて変更した時だけ保護したり解除したりしますので、
データを消しても保護の状態は変更されず維持されています。

(素人) 2016/12/22(木) 16:55


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

当方の説明不足で申し訳ありません。

D列で"B"を入力した後にそこを削除(BackSpaceもしくはDeleteで入力データを消す)すると、F列・G列・I列・J列のロックが解除されたままになってしまいます。

このため、削除した後はセルのロックをした状態に可能であればしたいと思っております。

(かなめ) 2016/12/22(木) 17:04


"B"は解除ですから、確定させればコードが走って解除します。
"B"を入力して確定前に消し、確定させるとコードが走っても空白ですから、
保護の状態は"B"を入力する前の状態を維持しています。

今のコードでは解除してから、もう一度保護させるのであれば、もう一度"A"を書くしかありません。

御免なさい、帰宅しますので最後のコメントとなります。
(素人) 2016/12/22(木) 17:12


D列が削除などして空白の時に必ず保護したいのであれば、

 ElseIf OD = "" Then

                 Range("F" & I).Locked = True
                 Range("G" & I).Locked = True
                 Range("I" & I).Locked = True
                 Range("J" & I).Locked = True

を追加すればそうなると思います。

(素人) 2016/12/22(木) 17:19


 コードアップしましたが、あまりにも無様というか、おバカなコードだったので
 再掲します。(12/24 1:06)

 なお、シート上に18行のタイトル部分しか存在せず、D19 をDeteleキーでクリアする
 などという、いじわるな操作を行えば不具合がでます。

 ↑ やはり、エラーになるのはいかがなものかと思いますし、領域の指定に間違いがありましたので
 再再掲(12/24 8:49)

 【削除】するのは【D列の値】なんですね?

 なら、すでに回答が出ていますが、A とともに空白文字もロック対象にしたらいいだけです。

 (B を入れて、あっと思った。なら A を入れればいいと思いますが、空白でも、そうしたいということなんですね?)

 ちょっと気になっているのは、A,B,空白以外の文字が入った時。
 なにもしない ということでいいのですね?

 一例です。

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim r As Range

    Set r = Intersect(Target, Range("D19:D" & Rows.Count))

    If r Is Nothing Then Exit Sub

    For Each c In r
        With c.EntireRow.Range("F1:G1,I1:J1")
            Select Case c.Value
                Case "A", Empty
                    .Locked = True
                Case "B"
                    .Locked = False
            End Select
        End With
    Next

 End Sub

(β) 2016/12/22(木) 18:35


コメント返信:

[ 一覧(最新更新順) ]


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