- ベストアンサー
セルの値によって、入力可能なセルを動的に変更したい
こんにちは。 Excelで、以下のような動作をしたいと考えています。 B列に入った値が'1'のときは、同じ行のC列・E列・H列にしか入力できないようにする。 B列に入った値が'2'のときは、同じ行のD列・F列・G列・H列にしか入力できないようにする。 (遷移できない列は、選択不可能とする) ある列に入力した値によって、動的にセルのロックを変更する・・・?というイメージなのですが、 具体的な実現方法がわかりません。 実現方法を教えていただけないでしょうか。 よろしくお願いします!!
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
セルのロックも良いが、下記のようにスキップでもできるのではないか。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo err1 r = Target.Row c = Target.Column Application.EnableEvents = False With Worksheets("Sheet1") If c >= 8 Then .Cells(r + 1, "B").Select GoTo err1 Else Select Case .Cells(r, "B") Case 1 If c = 2 Then n = 3 'B->C If c = 3 Then n = 5 'C->E If c = 4 Then n = 5 'D->E If c = 5 Then n = 8 'E->H If c = 6 Then n = 8 'F->H If c = 7 Then n = 8 'H->H .Cells(r, n).Select Case 2 If c = 2 Then n = 4 'B->D If c = 3 Then n = 4 'C->D If c = 4 Then n = 6 'D->F If c = 5 Then n = 6 'E->F If c = 6 Then n = 7 'F->G If c = 7 Then n = 8 'G->H .Cells(r, n).Select End Select End If End With err1: Application.EnableEvents = True End Sub =================== 既出のご回答コードを次のようにも表現できると思います。 Private Sub Worksheet_Change(ByVal Target As Range) 列などがはきり見えてよいのではと思いました。 If Target.Column <> 2 Then Exit Sub ActiveSheet.Unprotect 'シートの保護の解除 With Worksheets("Sheet1") r = Target.Row Select Case .Cells(r, "B") Case 1 'B列が1の場合 .Cells(r, "B").Locked = False .Cells(r, "C").Locked = False .Cells(r, "E").Locked = False .Cells(r, "H").Locked = False .Cells(r, "D").Locked = True .Cells(r, "F").Locked = True .Cells(r, "G").Locked = True '-- Case 2 'B列が2の場合 .Cells(r, "B").Locked = False .Cells(r, "D").Locked = False .Cells(r, "F").Locked = False .Cells(r, "G").Locked = False .Cells(r, "H").Locked = False .Cells(r, "C").Locked = True .Cells(r, "E").Locked = True End Select ActiveSheet.Protect 'シートの保護 End With End Sub
その他の回答 (1)
- mshr1962
- ベストアンサー率39% (7417/18945)
Excelの機能を使うのなら C列・E列・H列を選択して「データ」「入力規則」で「ユーザー設定」 「=$B2="1"」 として入力規則を設定、D列・F列・G列・H列も同様にする。 「ツール」「シートの保護」で書式の変更を出来ないように保護を掛ける。 VBAを使うなら、B列に1,2が入ったらその内容で同じ行に ロックを掛けるか、解除するかを変更するように設定ですね。 VBAのはじめで「シートの保護の解除」を行い、最後で「シートの保護」を行えば出来ます。 ※B列のロックは解除しておいてください。 設定するシートの見出しを右クリックして、コードの表示で起動した欄に下記のコードをコピーしてご確認ください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 2 Then Exit Sub 'B列以外は実行しない ActiveSheet.Unprotect 'シートの保護の解除 Select Case Target.Value Case 1 'B列が1の場合 Target.Offset(0, 1).Locked = False Target.Offset(0, 2).Locked = True Target.Offset(0, 3).Locked = False Target.Offset(0, 4).Locked = True Target.Offset(0, 5).Locked = False Target.Offset(0, 6).Locked = True Target.Offset(0, 7).Locked = False Case 2 'B列が2の場合 Target.Offset(0, 1).Locked = True Target.Offset(0, 2).Locked = False Target.Offset(0, 3).Locked = True Target.Offset(0, 4).Locked = False Target.Offset(0, 5).Locked = True Target.Offset(0, 6).Locked = False Target.Offset(0, 7).Locked = True End Select ActiveSheet.Protect 'シートの保護 End Sub
お礼
回答ありがとうございました! VBAで作成しようと思います。 とても助かりました。
お礼
回答ありがとうございます。 VBAでやろうと思います。 列の位置がはっきりわかるやり方は大変参考になりました。