单击受保护的单元格时显示警告消息

时间:2016-07-05 08:25:02

标签: excel vba excel-vba events

目前我有这段代码。在Column A中,我有一个“是”或“否”选择。

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

现在,当用户点击Column T(19)中的单元格时,我想向用户显示一条警告消息,指出这不适用于“是”选择。

1 个答案:

答案 0 :(得分: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}浏览代码。