第一次输入单元格时触发MsgBox,对单元格的后续更改或单击不执行任何操作

时间:2019-07-18 08:48:11

标签: excel vba

更新:

在解决后,我已经删除了原始问题文本,但是导致了一个新问题。

我的代码是

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A15")) Is Nothing Then
    MsgBox "something changed"
End If

End Sub

这是我第一次单击该单元格时触发的MsgBox,这很好,但是随后对该单元格的更改或单击也会触发,因此我尝试使其变为仅在第一次单击时触发。第一次输入数据,随后的更改或单击单元格应该什么都不做

2 个答案:

答案 0 :(得分:0)

您尚未说明这是您正在使用的唯一事件宏还是其他宏。如果这是唯一的,则:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Range("A15")) Is Nothing Then
        MsgBox "something changed"
        Application.EnableEvents = False
    End If
End Sub

EDIT#1:

上面的代码就像一个捕鼠器。捕捉到后,必须手动将其重置。因此,在完成对事件代码的编辑后,请手动运行此代码:

Sub ReEnableEvents()
    Application.EnableEvents = True
End Sub

答案 1 :(得分:0)

如果您想在第一次单击某个单元格时显示MsgBox,一种简单的方法是在调用MsgBox之前检查该单元格是否为空。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, Range("A1:A1000")) Is Nothing _
   And IsEmpty(Target) Then

    MsgBox "something changed"

End If

End Sub

但是,如果用户单击该单元格(显示MsgBox),但用户未在该单元格中输入任何值,会发生什么?您是否要在下次单击时再次显示MsgBox?

如果您不想再次显示它,则与其测试该单元格是否为空,不如使用到目前为止已单击的所有单元格填充一个全局范围。然后,您只需要检查该单元格是否已包含在范围内即可。

Public clickedCells As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

' if the selected cell is one of the relevant cells
If Not Intersect(Target, Range("A1:A1000")) Is Nothing Then

'   usual procedure if the range of clicked cells is still empty
    If clickedCells Is Nothing Then

        MsgBox "something changed"
        Set clickedCells = Target

    Else

'       if the range of clicked cells is not empty, then check if selected cell is contained in it
        If Intersect(Target, clickedCells) Is Nothing Then

            MsgBox "something changed"

            ' write selected cell into range
            Set clickedCells = Union(clickedCells, Target)

        End If

    End If

End If

End Sub

p.s .:您是要在第一次在单元格中键入值之后还是在第一次选择该单元格时显示MsgBox?因为如果是前者,则应使用“更改”事件而不是“ SelectionChange”。

Private Sub Worksheet_Change(ByVal Target As Range)