[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セルの値によって同行の違うセルのロックとロック解除』(かなめ)
こんにちは
エクセルの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 >
久しぶりに書いてみました。
相変わらずダサダサですが、初心者の方には分かり易いのでは、と思います。
ただ、質問者さんのしたい事を満たしているかどうかは不安です。
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
(素人) 2016/12/22(木) 16:55
当方の説明不足で申し訳ありません。
D列で"B"を入力した後にそこを削除(BackSpaceもしくはDeleteで入力データを消す)すると、F列・G列・I列・J列のロックが解除されたままになってしまいます。
このため、削除した後はセルのロックをした状態に可能であればしたいと思っております。
(かなめ) 2016/12/22(木) 17:04
今のコードでは解除してから、もう一度保護させるのであれば、もう一度"A"を書くしかありません。
御免なさい、帰宅しますので最後のコメントとなります。
(素人) 2016/12/22(木) 17:12
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.