Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2710|回复: 9

[已解决]如何限制指定列只可输入1-n的正整数

[复制链接]
发表于 2015-9-14 21:48 | 显示全部楼层 |阅读模式
要求如题,听说用正则表达式实现起来更方便。
细节补充:
0、n为正整数,取值为当前日期为判断依据的上月的最大天数,如现在是9月份,那n取值为31(即8月的最大天数值)
1、要能支持用CTRL+ENTER一次输入多个单元格的情况
2、一次清空多个单元格
3、如果输入的内容不是1至n内的数字,则自动清空输入的内容,如果符合要求,则将数字补充为“2015-8-n”(上月的日期形式)的形式。
4、要可支持复制操作,如一次性复制一列1至n内的数值;或是复制的“2015-8-n”(本身就是符合要求的日期形式,无需要作任何处理)形式的内容。
最佳答案
2015-9-16 17:23
那就用这个吧,加上
        If Int(rg.Value) = rg.Value And rg.Value >= 1 And rg.Value <= n Then
            rg.Value = DateSerial(Year(Date), Month(Date) - 1, rg.Value)
            rg.NumberFormatLocal = "yyyy-m-d"
        ElseIf rg.Value > Date - Day(Date) - n And rg.Value < Date - Day(Date) Then
            rg.NumberFormatLocal = "yyyy-m-d"

        Else
            rg.ClearContents
        End If

详见附件
 楼主| 发表于 2015-9-15 21:48 | 显示全部楼层
没人关注啊,高手们给个用正则表达式的示例吧,用其它也可以做到,只是判断起来比较麻烦,且基本只能限一个单元格被改动的情况。
回复

使用道具 举报

发表于 2015-9-16 10:38 | 显示全部楼层
摸索了半天,才试出来,看行不行。

工作簿1 (自动保存的) - 副本.zip

15.21 KB, 下载次数: 7

回复

使用道具 举报

发表于 2015-9-16 11:21 | 显示全部楼层
请下载附件

工作簿1.rar

12.72 KB, 下载次数: 7

回复

使用道具 举报

 楼主| 发表于 2015-9-16 15:54 | 显示全部楼层
本帖最后由 jjincn 于 2015-9-16 15:57 编辑
yorkchenshunan 发表于 2015-9-16 11:21
请下载附件

非常感谢,基本满足要求,特别是Day(Date - Day(Date))来得出上月最大天数值,比较不错,很简短实用,不过有个小问题,就是在补全为合  法日期格式的单元格上如果删除内容后,代码赋予的日期格式不能被去掉,这样当在输入时就会被清除内容。

同样的,如果复制一个合  法的日期也是复制不了的。

看来还要在之前加上对日期的判断,在中间加上对删除操作的处理。
回复

使用道具 举报

 楼主| 发表于 2015-9-16 16:05 | 显示全部楼层
高 发表于 2015-9-16 10:38
摸索了半天,才试出来,看行不行。

感谢关注并回复,可能你没有完全理解我的意思,我不是让只能输入上月的最后一天的日期,而可以输入上月任何一天的日期值然后再用代码实现自动补全所需要的日期格式。
4楼的理解是对的,但有点小问题,呵呵。
不过你的思路中st = target.Address这个不错。
回复

使用道具 举报

发表于 2015-9-16 16:20 | 显示全部楼层
jjincn 发表于 2015-9-16 15:54
非常感谢,基本满足要求,特别是Day(Date - Day(Date))来得出上月最大天数值,比较不错,很简短实用,不过 ...

见附件,已经完善,在中间加上即可

Application.EnableEvents = False
Target.NumberFormat = "General"
Dim rg As Range, n%

工作簿2.rar

12.92 KB, 下载次数: 2

回复

使用道具 举报

 楼主| 发表于 2015-9-16 16:53 | 显示全部楼层
yorkchenshunan 发表于 2015-9-16 16:20
见附件,已经完善,在中间加上即可

Application.EnableEvents = False

感谢,可以了。但是复制问题没有解决。我之前是用的数值判断法,就是将日期转成数值,再与上月第一天的值的最后一天的值比较,如里在这个区间内就不处理这样的内容。
不知贵兄有无更好的解决方法,期待你的思路?
回复

使用道具 举报

发表于 2015-9-16 17:23 | 显示全部楼层    本楼为最佳答案   
那就用这个吧,加上
        If Int(rg.Value) = rg.Value And rg.Value >= 1 And rg.Value <= n Then
            rg.Value = DateSerial(Year(Date), Month(Date) - 1, rg.Value)
            rg.NumberFormatLocal = "yyyy-m-d"
        ElseIf rg.Value > Date - Day(Date) - n And rg.Value < Date - Day(Date) Then
            rg.NumberFormatLocal = "yyyy-m-d"

        Else
            rg.ClearContents
        End If

详见附件

工作簿3.rar

12.73 KB, 下载次数: 7

回复

使用道具 举报

 楼主| 发表于 2015-9-16 17:30 | 显示全部楼层
yorkchenshunan 发表于 2015-9-16 17:23
那就用这个吧,加上
        If Int(rg.Value) = rg.Value And rg.Value >= 1 And rg.Value  Date - Day(D ...

谢谢。这样子算是圆满了。
小弟有些愚了,可以直接用日期区间比对的。
思维要灵活才好啊!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 15:35 , Processed in 0.374378 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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