这个自定义validation不起作用,但我不知道发生了什么

我知道excel“程序devise”在同行程序员中并不是很受欢迎,但是我一直在努力做到这一点,并且pipe理在我的脖子上。

我有在Excel中的自定义validation:

=AND(LEN(AV15)=10,((VALUE(LEFT(AV15,2)))<=31),NOT(ISERROR(VALUE(LEFT(AV15,2)))),MID(AV15,3,1)="/",((VALUE(MID(AV15,4,2)))<=12),NOT(ISERROR(VALUE(MID(AV15,4,2)))),MID(AV15,6,1)="/",((VALUE(RIGHT(AV15,4)))<=2100),NOT(ISERROR(VALUE(RIGHT(AV15,4))))) 

上面的validation应该接受以下格式的任何有效date:

 dd/mm/yyyy 

这似乎是部分工作,但不知何故,它不会接受比“12”低的一天,例如:

  14/12/2010 -->accepted 13/10/2010 -->accepted 25/10/2010 -->accepted 12/10/2010 -->gives error 

乍一看, ((VALUE(MID(AV15,4,2)))<=12)导致这种行为,但我改变它为31,我仍然得到错误,我需要validation来承认input:

  nn/nn/nnnn 

其中“n”是一个数字,我不在乎,如果他们input99/99/9999我可以检查,稍后vba代码,但input必须具体有10个字符。

任何帮助将不胜感激

我把你的公式,当你把一个'date之前工作就好了。 发生什么事情是,当你把任何一个值低于13值作为评估date的date ,就像在Excel中存储一个number 。 当你超过13它会评估为一个string 。 所以你需要做的是将单元格格式化为Text格式。 那么它应该工作得很好。

要查看下面的工作,将date值放在A1中

A1 – > '14 / 12/2010

把下面的公式放在下面

B1 – > =MID(A1,3,1) = "/"
C1 – > =MID(A1,6,1) = "/"
D1 – > =IFERROR(AND(VALUE(MID(A1,4,2)) >= 1, VALUE(MID(A1,4,2)) <= 12), FALSE)
=AND(VALUE(RIGHT(A1,4))>=2000,AND(VALUE(RIGHT(A1,4))<=2100))
F1 – > =AND(B1,C1,D1, E1)

上面的公式是分开的,你将不得不把它们组合起来(就像在单元格F1中完成的那样)。
希望有所帮助。

编辑 :validation的组合公式( 注意 ,我用A1作为单元格)

 =AND(MID(A1,3,1) = "/", MID(A1,6,1) = "/", IFERROR(AND(VALUE(MID(A1,4,2)) >= 1, VALUE(MID(A1,4,2)) <= 12), FALSE), AND(VALUE(RIGHT(A1,4))>=2000,AND(VALUE(RIGHT(A1,4))<=2100))) 

你不能简单地在单元格中select正确的格式吗?

  1. 右键单击单元格,然后select“格式单元格”
  2. 从左侧导航select“自定义”
  3. 在“types”框中input:dd / mm / yyyy

Excel似乎将诸如10/12/2010值识别为date,并以不同的格式(例如自1900年1月1日以来的天数等)存储在内部。 发生这种情况时,在这些date值上使用LEFTMIDRIGHT时,Excel不会从内部格式转换回来。 特别是,我把2010年10月12日放在单元格A1中,将=LEFT(A1,10)放在单元格B1中。 细胞B1然后显示我的价值40522 。 (我在英国并使用Excel 2010 Starter,在其他地区或其他版本的Excel中可能会得到不同的值。)

尝试用TEXT(AV15, "DD/MM/YYYY")replace公式中所有出现的AV15 。 或者,在另一个单元格中放入=TEXT(AV15, "DD/MM/YYYY") ,并在公式中使用这个其他单元来代替AV15

如果你不关心VBA,那么简单的UDF呢?

 Public Function DateFormat(rng As Range) Dim regEx As Object Set regEx = CreateObject("VBScript.RegExp") regEx.Pattern = "\d\d/\d\d/\d\d\d\d" test = regEx.Execute(rng.Value).Count > 0 End Function 

如果单元格的值匹配nn / nn / nnnn(其中n是任意数字),则返回true。 那么你可以简单地说=DateFormat(AV15)