VBA不相信连锁反应
前面我们讲了Workbook和Worksheet的各种事件,让大家熟悉了各种用于折腾的事件。学完之后,你觉得自己功力大进,马上就要无敌手了。
正在这时,老板又出现了,给你布置了一个新任务。
有一个表格要输入数据,但产品经理的要求是,每输完一个数字,就要在这个数字下面的单元格显示“√”。
你故作为难:老板啊,这个很难实现呐,估计得半天才能做好啊!
但其实你是知道的,这个用我们刚学过的worksheet的事件,分分钟就搞定了呀!哈哈,又多出来半天的偷懒时间,完美!
捣鼓了一分钟,成品出炉了
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Offset(1, 0) = '√'
End Sub
注
:√有快捷输入方式:在用全键盘的情况下,先按住alt,然后依次按小键盘上的41420。我是不会告诉你我是花了多久才学到这个小窍门的:)
运行一下,就可以去喝着咖啡刷知乎了!
咦?为什么出来这么多√?什么鬼?
Google了这个问题之后,你终于恍然大悟了!
原来,第一个单元格输入内容之后,计算机检测到了变化,就在下面的单元格中输入了一个√。
但这还没完,系统检测到怎么有一个单元格的内容从空白变成了√,又要触发一次change事件。
相同的故事还在继续,change事件被连锁地触发了,然后你就傻了。。。
解决方法很简单,Application对象有一个EnableEvent属性,在Change事件中,需要把这个关掉,后面再打开。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Target.Offset(1, 0) = '√'
Application.EnableEvents = True
End Sub
再试一下,搞定!
联系客服