Excel 2010 VBA 入门 071 工作表事件之Worksheet_Change
目录
示例
实现代码
保护工作表
工作表对象的Change事件
判断数据是否符合有效性设置
Change事件的缺陷
利用VBA撤销操作
禁用事件
示例
如图所示,在该表中设置了数据有效性,并进行了工作表保护。希望通过该设置允许用户仅输入规定的内容。然而当用户从其他表格复制并粘贴至已经设置数据有效性的区域时,数据有效性并不起作用。如何利用VBA避免这种情况的发生,以完善数据有效性?
实现代码
当单元格的值改变之后,无论是粘贴还是将数值写入单元格,都会触发工作表对象的Change事件。在该Change事件中编写程序,执行数据有效性对象(Validation)的Value属性,判断单元格的值是否满足有效性验证。若验证失败,则执行Application的Undo方法取消赋值操作。
Private Sub Worksheet_Change(ByVal Target As Range)'禁用事件,防止不断触发事件Application.EnableEvents = False'判断改变的单元格的值是否通过有效性验证If Target.Validation.Value = False Then'若没有通过,则取消之前的赋值操作Application.UndoEnd If'启用事件Application.EnableEvents = True
End Sub
保护工作表
工作表对象的Change事件
当工作表中任意单元格的值发生变化时,Change事件即被触发,其语法为
Private Sub Worksheet Change (ByVal Target As Range)
End Sub
其中,Target为改变了值的单元格对象。
本例利用了Change事件,只要单元格的值改变,就会触发程序的执行,并检查数据有效性的设置是否被满足,从而采取进一步的措施。
判断数据是否符合有效性设置
当需要判断单元格内的数据是否符合有效性设置时,可以使用有效性对象(Validation)的Value属性。该属性将返回一个逻辑值,当为True时,表示单元格的值通过了数据有效性的验证,反之则表示数据不合法。
Change事件的缺陷
Change事件的触发条件是单元格的值改变(即Value属性)。但可以发现,只要进入了单元格的编辑状态(双击单元格、选中单元格后按【F2】键或直接单击公式栏即可进入编辑状态),再次退出后即可触发Change事件,而无论单元格的值是否发生变化。因而开发者在编写有关Change事件的代码时,应特别注意其可能会造成程序的一些错误。
利用VBA撤销操作
本例中,在数据有效性验证失败时,除了清空单元格内容外,还可以使用Application. Undo方法撤销之前的赋值操作。使用该方法相当于单击了“快速访问工具栏”的“撤销”按钮或者按下组合键【Ctrl+Z】进行撤销操作。
使用该方法与清空单元格的不同之处是:当使用清空单元格时,可以只把不符合数据有效性验证的单元格清除而保留符合的数据,但却不会保留那些单元格中的原始数据;而使用本方法只要出现不符合数据有效性验证的数据,则撤销所有的赋值操作和单元格的原始数据。
开发者也可以通过定义全局变量的方法来处理该问题。利用全局变量存储单元格的原始值。在执行数据有效性验证时,若验证失败,则从全局变量中读取原始值赋值给该单元格。
事件循环
在使用Change事件时,特别是在Change事件程序中再次给相同工作表的单元格赋值时,应注意以避免产生事件的多次循环,如以下程序:
Private Sub Worksheet_Change (ByVal Target As Range)Target.Value = Target.Value + I
End Sub
该程序预想的作用是当在单元格中写入一个数字后,其存储的数值自动累加1。而事实是:当在该事件程序所在的表中写入一个数字1时,可以发现该数字立即变成了一个较大的数字(可能是100或者更大的数字),而非预想的数字2。事实上,当在单元格中输入数字1后,触发了Change事件的执行,而Change事件程序中又对单元格的值进行了修改,从而又触发了Change事件的执行,如此反复,如图所示。
所幸的是,Excel并不会因此而进行无限循环,当超过一定次数(每台计算机不同)时,便不再继续触发事件程序的执行,继而可以退出该事件循环。所以用户可以看见一个比较大的数字出现在单元格中而不是无限的循环。
禁用事件
当确实需要在Change事件程序中修改单元格的值,而不希望由于此修改触发新的事件执行,此时可以通过修改Excel程序对象(Application)的EnableEvents属性来禁用事件。当该属性设置为False后,则不会再触发任何事件代码,而设置为True之后则可以启用事件。该属性的设置一般都是成对出现,即在设置为False之后,当执行完可能触发事件的代码后再将该属性恢复为True,以避免由于该语句的设置造成事件程序的失效。如上述示例,当确实需要将输入的数字仅仅增加1时,则可以使用以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)'禁用事件,防止不断触发事件Application.EnableEvents = False'修改单元格的值Target.Value = Target.Value + 1'启用事件Application.EnableEvents = True
End Sub
Excel 2010 VBA 入门 071 工作表事件之Worksheet_Change相关推荐
- Excel 2010 VBA 入门 072 工作表事件之activate
目录 示例 实现代码1 工作表(Worksheet)对象的Select方法 实现代码2 附件:显示所有工作表 目录工作表中加入事件 其它工作表中加入事件 实现代码3 工作簿事件 类模块和Me变量 示例 ...
- Excel 2010 VBA 入门 070 工作表事件之双击鼠标BeforeDoubleClick
目录 示例 实现代码 工作表双击事件(BeforeDoubleClick) 示例 如图所示,该表为某公司员工工资表.为方便对比,现希望能够通过双击标题行即可对该列数据进行降序排列.该如何用VBA完成? ...
- Excel 2010 VBA 入门 062 跨表数据查询
目录 示例 实现代码 跨表操作单元格 连续查找功能 示例 如图所示,该工作簿中建立"数据表"和"数据查询"表分别用于存储客户信息以及客户信息的查询.现希望在数据 ...
- Excel 2010 VBA 入门 063 跨表数据录入
目录 示例 实现代码 ListObject对象 ListObject对象的表示方法 1.序号表示法 2.名称表示法 ListColumn对象 向ListObject中添加新数据 使用VBA添加List ...
- Excel 2010 VBA 入门 034 创建图片批注
目录 批注(Comment)对象 批注的添加与删除 FiIIFormat对象 OnError语句 示例: 批注(Comment)对象 Comment对象是单元格的一个属性,表示单元格的批注.Comme ...
- Excel 2010 VBA 入门 087 数据处理之按单列汇总多个工作表
示例 如图所示,该工作簿中包含若干个工作表,工作表中为各个学校书籍销售明细.如 何使用VBA按其工作表中的图书名称汇总各种图书的数量? 示例数据表 序号 图书名称 版 别 年版 定价 适读范围 订 ...
- Excel 2010 VBA 入门 044 用VBA进行四舍五入
目录 示例 实现代码 VBA的Round函数 VBA的Round函数与工作表Round函数的区别 在Office软件中使用自定义函数替代VBA的Round函数 示例 在实际工作中,经常需要对数据进行四 ...
- Excel 2010 VBA 入门 077 数据处理之合计汇总
目录 示例 代码1 代码2 代码3 示例 如图所示,该表为某公司年度销售表.如何使用VBA求出每个销售员的年度销售额合计以及公司月度销售合计? 销售员 1月 2月 3月 4月 5月 6月 7月 8月 ...
- Excel 2010 VBA 入门 129 利用窗体向工作表中录入数据
目录 题 码 窗体控件与工作表的交互 窗体的事件 窗体中ControIs集合访问控件 控件的排列 使用控件数组进行赋值 题 如图所示,该表为某公司订单记录表,其中所有的列都是必填的,订单编号为自动生成 ...
- Excel 2010 VBA 入门 067 导入多个工作簿中的工作表
目录 示例 实现代码 导入多个工作簿中的工作表 Application. ScreenUpdating属性 示例 如图所示,在同一个目录下有多个工作表名称相同的工资汇总月报.现希望通过VBA建立该多个 ...
最新文章
- Google Test(GTest)使用方法和源码解析——自动调度机制分析
- 汇总python三种数据结构list,set,dict的常见操作
- 深入浅出搜索架构引擎、方案与细节(上)
- 一个合格的程序猿编程
- Linux 运维日常 40 个命令汇总
- 常熟理工学院计算机网络基础,常熟理工学院计算机网络复习题之简答题
- centos7修改服务器密码忘记,Centos7忘记root密码怎么修改
- 面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!...
- CSS对字体单位的总结
- Collection(单列集合)
- wegame登录cf显示服务器人数已满,电一再现万人排队进游戏的盛况?老玩家:感觉回到了三年前...
- 《Look at Boundary: A Boundary-Aware Face Alignment Algorithm》代码调试
- 我见过不少赚了钱,投资孵化一堆店铺的,一般而言后续发展都会出问题的
- mysql第二条减第一条_Mysql SQL优化
- 适用于5G网络的SAF Spectrum Compact 频谱仪
- 继续惨...555555555
- angular写的移动端模板《二》
- 如何创建一个微信公众号?
- 数据处理之衡量数据远近的多种距离公式
- 元宇宙顶层设计预研项目探讨