【问题标题】:How to clear cell when enter invalid data in Excel using VBA使用VBA在Excel中输入无效数据时如何清除单元格
【发布时间】:2015-05-29 14:26:06
【问题描述】:

我有一个 Excel 表,当用户输入一个值时,我在其中接受用户的值,VBA 将运行它检查数据是否有效,如果数据无效,它将提示一条消息说无效数据。这是我的代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = "$D$12" Or Target.Address = "$D$13" Or Target.Address = "$D$14" Or Target.Address = "$D$15" Then
Call Room
End If
End Sub 

房间方法是

Sub Room()
Dim lastRow As Long
If IsNumeric(Range("i17")) Then
If [I17] < 0 Then
 MsgBox "msg "
End If
End If
End Sub

在 I17 单元格中我有一个公式

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

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

如何做到这一点?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

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

    接下来,我们将已更改的范围传递给房间,以便我们可以在该子例程中对其进行修改。

    最后,我们在显示消息后修改受影响的范围。请注意,我使用了一个命令来逐字清除单元格。由于您是根据该数据执行计算,因此您可能更愿意将其设置为默认值,例如 0,而改用 a.value = 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,因为我不知道该范围代表什么。您应该选择能够向未来的维护者描述正在发生的事情的内容。

    【讨论】:

    • 投反对票的人愿意用这个答案解释他们的问题吗?
    【解决方案2】:

    使用这个

    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
    

    【讨论】:

    • 这给了我一个错误 type mismatch at intersect line
    • Intersect 返回一个范围,而不是布尔值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多