2016-07-05 8 views
1

現在、このコードがあります。 Column Aには、現在の「はい」または「いいえ」の選択肢があります。ユーザーがColumn T(19)のセルをクリックしたときに保護されたセルがクリックされたときの警告メッセージの表示

Private Sub worksheet_change(ByVal Target As Range) 

     If Not Intersect(Target, Range("A:A")) Is Nothing Then 

      ActiveSheet.Unprotect 
      If Target = "YES" Then 

       'Column B to S 
       For i = 1 To 18 
        With Target.Offset(0, i) 
         .Locked = False 
         .FormatConditions.Add Type:=xlExpression, Formula1:="=ISBLANK(" & Target.Offset(0, i).Address & ")" 
         With .FormatConditions(.FormatConditions.Count) 
          .SetFirstPriority 
          .Interior.ColorIndex = 4 
         End With 
        End With 
       Next i 

ElseIf Target = "NO" Then 

      For i = 1 To 73 
       With Target.Offset(0, i) 
        .Value = "" 
        .Locked = True 
        .FormatConditions.Delete 

       End With 
      Next i 
      End If 
      ActiveSheet.Protect 

     End If 

    End Sub 

は今、私は、これは「はい」を選択するには適用されません、ユーザーに警告メッセージを表示したいです。

+1

[Worksheet_Change](https://msdn.microsoft.com/en-us/library/office/ff839775.aspx)イベントマクロを使用しています。セルの選択をキャッチするには、[Worksheet_SelectionChange](https://msdn.microsoft.com/en-us/library/office/ff194470.aspx)イベントマクロを使用する必要があります。保護を設定すると、**ロックされたセルを選択する**機能を削除することもできます。 MsgBoxはありませんが、ロックされたものを選択することはできません。 – Jeeped

+0

@Jeepedこれに関するサンプルコードを教えてもらえますか?私はVBAで非常に新しいです。既存のイベントと連携しますか? – PeterS

+0

元のWorksheet_Changeの一部を書き直す必要があります。複数の変更は処理されません(ターゲットは1つのセル以上になる可能性があります)、イベントをオフにしないでください。私に数分を与えてください。 – Jeeped

答えて

1

これはあなたが求めているタスクを実行する必要があるようです。

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A:A")) Is Nothing Then 
     On Error GoTo bm_SafeExit 
     Application.EnableEvents = False 
     Me.Unprotect 
     Dim trgt As Range 
     For Each trgt In Intersect(Target, Range("A:A")) 
      If LCase(trgt.Value2) = "yes" Then 
       With trgt.Offset(0, 1).Resize(1, 18) 
        .Locked = False 
        With .FormatConditions.Add(Type:=xlExpression, Formula1:="=ISBLANK(B" & trgt.Row & ")") 
         .Interior.ColorIndex = 4 
        End With 
       End With 
      Else 
       With trgt.Offset(0, 1).Resize(1, 73) 
        .Value = vbNullString 
        .Locked = True 
        .FormatConditions.Delete 
       End With 
      End If 
     Next trgt 
    End If 

bm_SafeExit: 
    Application.EnableEvents = True 
    Me.Protect Userinterfaceonly:=True 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Not Intersect(Target, Range("T:XFD")) Is Nothing Then 
     On Error GoTo bm_SafeExit 
     Application.EnableEvents = False 
     Dim trgt As Range 
     For Each trgt In Intersect(Target, Range("T:XFD")) 
      If LCase(Me.Cells(trgt.Row, "A").Value2) = "yes" Then 
       MsgBox "Don't try to put Yes here", vbCritical + vbOKOnly, "Bad Choice" 
       Me.Cells(trgt.Row, "A").Select 
      End If 
     Next trgt 
    End If 

bm_SafeExit: 
    Application.EnableEvents = True 

End Sub 

[F8]と[Ctrl] + [F8]を使用してコードをウォッチして、ウォッチとブレークポイントを設定します。

+0

OPの要件を満たす優れたソリューション。 – skkakkar

関連する問題