分享

限制某列只能输入数字或日期

 gblhp 2015-02-16

除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www./cat4/231.html,VBA交流群273624828。

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

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
If Not Application.IsNumber(Target) Then
MsgBox "只能输入数字"
Application.EnableEvents = False
Target = ""
Application.EnableEvents = True
End If
End If
If Target.Column = 2 Then
If Not IsDate(Target) Or Not Application.IsNumber(Target) Then
MsgBox "只能输入日期"
Application.EnableEvents = False
Target = ""
Application.EnableEvents = True
End If
End If
End Sub

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

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

本节示例文件下载:http://pan.baidu.com/s/1bnEPToz

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多