设为首页收藏本站

嘻皮客娱乐学习网

 找回密码
 中文注册
搜索
打印 上一主题 下一主题
开启左侧

[OFFICE] excel工作表限制某列只能输入数字或日期-Change事件

[复制链接]
跳转到指定楼层
楼主
发表于 2016-4-26 11:24:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天来看一个Change事件应用的例子。在工作中我们有时候需要下面的业务人员填一些报表给我们,但由于每个人掌握Excel的水平参差不齐,所以经常会有人报上来的报表存在一些问题。比如我所在的公司是一个理财公司,每次业务人员报上来的报表里都会有金额和日期这两栏。大家都知道金额应该是数值格式才可以做求和等计算,日期必须是日期格式才可以进行按年按月筛选汇总等工作,有些业务员由于不明白这一点,往往会将本应该是数值的单元格弄成文本格式,如果我直接拿来对数据汇总会造成数据的丢失。而对于日期的填写一些业务员不会自定义格式来设置日期格式,就采取了加单撇号的方法来强制转换成日期格式,比如“ 'YYYY-MM-DD”这种格式,造成不能直接筛选。那现在我们来看看怎么通过Excel VBA来限制对应单元格的输入格式。假设我们限制只能在A列输入数值,只能在B列输入日期,看代码:

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Column = 1 Then
  3. If Not Application.IsNumber(Target) Then
  4. MsgBox "只能输入数字"
  5. Application.EnableEvents = False
  6. Target = ""
  7. Application.EnableEvents = True
  8. End If
  9. End If
  10. If Target.Column = 2 Then
  11. If Not IsDate(Target) Or Not Application.IsNumber(Target) Then
  12. MsgBox "只能输入日期"
  13. Application.EnableEvents = False
  14. Target = ""
  15. Application.EnableEvents = True
  16. End If
  17. End If
  18. End Sub
复制代码



在上面的代码中Application.IsNumber是判断相应单元格的值是不是数值,是返回TRUE,不是返回FALSE。IsDate是VBA函数,用来判断相应值是不是日期,但是存在一个情况就是这个函数会将文本格式的日期也判断为日期,比如我们上面说的用单撇号强制转换的日期,上面说过这种日期不符合要求,所以又加了个IsNumber来判断是不是数值,既是日期又是数值的输入模式才符合我们的要求。

在我们的代码中Target=""是将不符合条件的单元格变为空,但是问题来了,如果执行了这句代码相当于又给单元格变了值了,就又会引发Change事件,这样的话就进入一个死循环了。所以这里用到了Application.EnableEvents = False表示程序不再响应事件,所以Target=“”不会引发新的Change,当然执行完Target=“”后还要用Application.EnableEvents = True将响应事件功能恢复,否则以后的事件也不会被响应了。
回复

使用道具 举报

沙发
 楼主| 发表于 2016-4-26 13:55:48 | 只看该作者
以上方法,只能针对如果是手动一个一个的填数据,如果是选择多个单元格进行粘贴,无法限制,vba会报错。
回复 支持 反对

使用道具 举报

小黑屋|手机版|嘻皮客网 ( 京ICP备10218169号|京公网安备11010802013797  

GMT+8, 2024-4-29 13:13 , Processed in 0.172617 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表