仅当用户修改现有值时,才会弹出禁用消息框

时间:2015-07-24 22:54:00

标签: vba excel-vba excel

如果输入的值为零,我有一个弹出msg框的vba代码。如果用户以后想要将零更改为其他某个数字,它仍然会弹出msg框,然后才允许将零编辑为其他数字。

如果用户正在更改现有值,我不希望弹出msgbox

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    If Intersect(Target, Range("b4:af18")) Is Nothing Then

        If Target.Value = 0 Then
            Application.EnableEvents = True
            MsgBox "This is it", vbApplicationModal, "Scikess/Holiday"
        End If 

    End If

    Application.EnableEvents = True

End Sub

1 个答案:

答案 0 :(得分:2)

我相信您正在描述用户在输入新答案之前点按删除键的情况。在这种情况下,空白单元格的数值为零,您在检查中得到误报,以查看用户是否输入了零。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("b4:af18")) Is Nothing Then
        On Error GoTo bm_Safe_Exit
        Dim trgt As Range
        Application.EnableEvents = False
        For Each trgt In Intersect(Target, Range("b4:af18"))
            If trgt.Value = 0 And trgt.Text = "0" Then
                MsgBox "This is it" & Chr(10) & trgt.Address(0, 0) & " cannot be zero.", _
                    vbApplicationModal, "Scikess/Holiday"
                Application.Undo
                trgt.Activate
                Exit For
            End If
        Next trgt

    End If

bm_Safe_Exit:
    Application.EnableEvents = True

End Sub

我尝试在涉及多个Target时运行代码(例如粘贴或填充操作),但这会使Application.Undo难以保留其他有效条目。如果不合适,请对此行为发表评论。

它还没有明确你想要对此作出反应的范围。您似乎错过了Intersect method中的Not,使其对任何不在范围内的细胞做出反应。我已在上面调整以包括您指定的范围,而不是将其排除。