VBA中关于change事件和Application.EnableEvents的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA中关于change事件和Application.EnableEvents的问题相关的知识,希望对你有一定的参考价值。

本人菜鸟一名,初学VBA中的事件程序,也知道改变单元格中的内容时,触发change事件,但还是似懂非懂,请看下面代码,实现单元格中数值的累加:Private Sub Worksheet_Change(ByVal Target As Range)Application.EnableEvents = FalseTarget.Value = Target.Value + 1Application.EnableEvents = TrueEnd Sub上述代码的运行见 动图1,每双击并Ctrl+回车 [A1]后,[A1]中的数值便累加一次。问题来了,当将Application.EnableEvents=False和Application.EnableEvents=True注释掉以后,为什么再对[A1]进行双击并Ctrl+回车后,[A1]的值从1变成48,再次操作后变成95...(每次累加47)。而且也没有出现程序死循环啊!!!!这是为什么啊??
上面的代码提交时格式乱了,现重新发一次:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

Target.Value = Target.Value + 1

Application.EnableEvents = True

End Sub

试解释如下:

Application.EnableEvents 的作用是控制事件的触发。

当 Application.EnableEvents 设置为 False 时,禁止触发事件。

当 Application.EnableEvents 设置为 True 时,可以正常触发事件,excel默认状态。

两者状态下的区别,以 Target.Value = Target.Value + 1 为例:

Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False  \'禁止触发事件
  Target.Value = Target.Value + 1  \'在禁止触发事件状态下,对单元格的赋值不会导致 Worksheet_Change 事件的触发
  Application.EnableEvents = True
End Sub

因此,上面的代码中,其实际效果是每次操作后,单元格单次加1。

Private Sub Worksheet_Change(ByVal Target As Range)
  \'Application.EnableEvents = False  \'默认情况下,会自动触发事件
  Target.Value = Target.Value + 1  \'在触发事件状态下,对单元格的赋值都会导致 Worksheet_Change 事件的触发
  \'Application.EnableEvents = True
End Sub

因此,上面的代码会持续的触发 Worksheet_Change 事件,直到不再触发为止,其效果是每次操作后,单元格单次跳变(其实是经过多次加1后的结果)。

至于为什么没有限入死循环,可能是系统的限制(电脑的性能、软件的防止机制等)。经本地电脑实际测试, excel2010 版本,每次累加87,与你问题描述中的47并不相同,可见是随机的。

参考技术A Application.EnableEvents = True
Application.EnableEvents = False
都去掉再试下,
Application.EnableEvents = False
。。。。。
之间的内容消息是不弹出的。
Application.EnableEvents = True
。。。。。
之后的内容消息是弹出的。
参考技术B 釉不智之举构桨民办乜

vba日历控件只能在一个单元格用怎么办

参考技术A 1、在工作表中添加DTPicker控件,并隐藏。在工作表中添加工作表SelectionChange事件,在事件中判断Target参数所指的单元格,当为特定单元格时显示DTPicker控件,并调整位置至当前单元格处,否则隐藏控件。
2、添加DTPicker控件的Change事件,将DTPicker的值赋值给活动单元格。

以上是关于VBA中关于change事件和Application.EnableEvents的问题的主要内容,如果未能解决你的问题,请参考以下文章

键盘的按下事件和change事件有啥区别?

C# winform中关于两个ListBox清除selectIndex的问题。

js中关于事件处理函数名后面是否带括号的问题

EXCEL VBA 事件的问题。

浅谈Js中关于事件处理函数执行顺序的问题

Excel vba以编程方式将代码添加到工作表模块