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

时间:2011-12-22 15:11:04

标签: excel validation ms-office

我知道excel“编程”在其他程序员中并不是很受欢迎,但是我一直在努力做到这一点并且管理层在我的脖子上......

我在excel上进行了自定义验证:

=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)))))

上述验证应该接受以下格式的任何有效日期:

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并且仍然出现错误,我需要验证以接受输入:

 nn/nn/nnnn

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

任何帮助都将受到高度赞赏

5 个答案:

答案 0 :(得分:3)

我把你的公式放进去,当你把'放在它工作的日期之前就好了。发生了什么事情,当您将任何值13置于评估日期的日期时,就像date一样,它在Excel中存储为number。如果您有13以上,则评估为string。因此,您需要做的是将单元格格式化为Text格式。然后它应该工作得很好。

答案 1 :(得分:1)

要查看以下内容是否有效,请将日期值放在A1

A1 - &gt; '14 /二千零十分之十二

如下所述,列出以下公式

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

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

编辑:验证的组合公式将是(注意,我已将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)))

答案 2 :(得分:0)

你能不能简单地在单元格中选择正确的格式?

  1. 右键单击单元格并选择“格式化单元格”
  2. 从左侧导航栏中选择“自定义”
  3. 在“类型:”框中输入:dd / mm / yyyy

答案 3 :(得分:0)

Excel似乎将诸如10/12/2010之类的值识别为日期,并以不同的格式在内部存储它们,例如自1900年1月1日以来的天数等等。当您在这些日期值上使用LEFTMIDRIGHT时,Excel不会从其内部格式转换回来。特别是,我将10/12/2010放在单元格A1中,将=LEFT(A1,10)放在单元格B1中。然后,单元格B1显示值40522。 (我在英国并使用Excel 2010 Starter。您可能会在其他语言环境或其他版本的Excel中获得不同的值。)

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

答案 4 :(得分:0)

如果你不关心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匹配,则返回true,其中n是任意数字。 然后你可以简单地说=DateFormat(AV15)