Application.EnableEvents =false(true)的理解

Private Sub Worksheet_Change(ByVal Target As Range)

Dim iRow As Integer

iRow = Target.Row

Application.EnableEvents = False

Cells(iRow, 3) = Cells(iRow, 3) + Cells(iRow, 2)

Application.EnableEvents = True

End Sub

这个程序的目的是要在 B2 输入新的数时,C2 会将 B2 输入的新数加上 C2 原有的数呈现在 C2 上。

照上面有加上 Application.EnableEvents = False 程序执行当然没问题。

现在你在 Application.EnableEvents = False 与 Application.EnableEvents = True 前加上「 '」看看(下面代码)。

程序前加上「 '」的目的是要使「 '」之后的文字变成说明文字,程序执行时是会跳过说明文字,不执行说明文字的内容。

程序前加上「 '」符号后,文字会变成绿色。

执行第二个程序时,你将发现 C2 不会按你所要求的,呈现结果。

这就是所谓的事件连锁反应。


Private Sub Worksheet_Change(ByVal Target As Range)

Dim iRow As Integer

iRow = Target.Row

'Application.EnableEvents = False

Cells(iRow, 3) = Cells(iRow, 3) + Cells(iRow, 2)

'Application.EnableEvents = True

End Sub

再如:

本示例在保存文件之前禁用事件,以使 BeforeSave 事件不能触发。


Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True

 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是优化后的代码,能够解决上面提到的问题: ``` Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Set KeyCells = Range("A:A") '要监视的列范围 If Not Application.Intersect(KeyCells, Target) Is Nothing Then '如果目标单元格位于指定列中,请执行以下操作 If WorksheetFunction.CountIf(Range("A:A"), Target.Value) > 1 Then '如果该值已出现在程序运行之前 Dim cel As Range For Each cel In Range("A1:A" & Target.Row - 1) '找到本次输入的位置 If cel.Address = Target.Address Then Exit For '如果发现重复的值,则删除本次输入,弹出消息框,将光标定位到已有值所在的单元格 If cel.Value = Target.Value Then Application.EnableEvents = False '禁用事件处理 Target.ClearContents '删除重复的输入值 Application.EnableEvents = True '启用事件处理 MsgBox "该值已存在于单元格 " & cel.Address & " 中。" cel.Select Exit Sub End If Next cel '如果没有重复的值,弹出消息框,将光标定位到已有值所在的单元格 MsgBox "该值已存在于单元格 " & Range("A:A").Find(Target.Value).Address & " 中。" Range("A:A").Find(Target.Value).Select End If End If End Sub ``` 主要修改如下: 1. 在 `For Each cel In Range("A1:A" & Target.Row - 1)` 中,限制循环范围只到本次输入的上方单元格,这样可以避免删除已有值的问题。 2. 在 `If cel.Value = Target.Value Then` 中,添加弹出消息框和光标定位的代码,以便提示用户和方便用户操作。 3. 在 `If WorksheetFunction.CountIf(Range("A:A"), Target.Value) > 1 Then` 的条件判断中,如果没有重复的值,也需要弹出消息框和将光标定位到已有值所在的单元格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值