我有一张Excel工作表,当用户输入VBA将运行的值时,我接受用户的值,检查数据是否有效,如果数据无效,则会提示消息说无效数据。这是我的代码:
=C6-(D12+(2*D13) + (2*D14) + (3*D15))
房间方法
{{1}}
在I17细胞中,我有一个公式
{{1}}
我的问题是当任何单元格(D12,D13,D14,D15)输入错误数据时,显示提示信息后单元格应自动清除。
如何做到这一点?
答案 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