使用VBA在Excel中输入无效数据时如何清除单元格

时间:2015-05-29 14:26:07

标签: excel vba excel-vba

我有一张Excel工作表,当用户输入VBA将运行的值时,我接受用户的值,检查数据是否有效,如果数据无效,则会提示消息说无效数据。这是我的代码:

=C6-(D12+(2*D13) + (2*D14) + (3*D15))

房间方法

{{1}}

在I17细胞中,我有一个公式

{{1}}

我的问题是当任何单元格(D12,D13,D14,D15)输入错误数据时,显示提示信息后单元格应自动清除。

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

您应该做的第一件事是清理如何检查Target是什么。它可以是多个单元格(填充,粘贴范围,......)。这是通过将Target与您感兴趣的范围相交来实现的,并且我们将存储到范围变量中,以供日后使用。如果没有重叠,那么intersect将返回一个空对象,我们可以使用is Nothing进行测试。

接下来要注意的是,如果我们允许Worksheet_Change事件通过更改单元格来触发,则会发生奇怪的事情(无限递归)。为防止这种情况发生,我们会在致电Room之前关闭事件,并在完成后重新启用。

接下来,我们将已更改的范围传递到房间,因此我们可以在该子例程中修改它。

最后,我们在显示消息后修改受影响的范围。请注意,我已使用命令逐字清除单元格。由于您是根据该数据执行计算,因此您可能希望使用a.value = 0将其设置为默认值,例如0。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a As Range

    Set a = Intersect(Target, Range("D12:D15"))

    If Not a Is Nothing Then
        Application.EnableEvents = False
        Room a
        Application.EnableEvents = True
    End If
End Sub

Sub Room(a As Range)
    Dim lastRow As Long
    If IsNumeric(Range("I17")) Then
        If Range("I17").Value < 0 Then
            MsgBox "msg "
            a.ClearContents
        End If
    End If
End Sub

作为旁注,我使用了一个错误的变量名a,因为我不知道该范围代表什么。你应该选择一些描述未来维护者的东西。

答案 1 :(得分:-1)

使用此

Private Sub Worksheet_Change(ByVal Target As Range)
Dim t As Range
Set t = Intersect(Target, [D12:D15])
Application.EnableEvents = 0
If Not t Is Nothing Then
     Call Room
     If [I17] < 0 Then Target.Value = ""
End If
Application.EnableEvents = 1
End Sub