Excel 使用IF()和Len()进行自定义验证

Excel 使用IF()和Len()进行自定义验证,excel,validation,excel-formula,Excel,Validation,Excel Formula,我制作了一个自定义电话格式#############,这样电话只能以5555555555=>555-555-5555或555-55555的形式输入 我需要一个非vba解决方案,即我可以在“数据验证”窗口中输入该解决方案,以检查单元格长度,并在长度为10或12时对其进行验证 我已经尝试了很长时间,但无法通过尝试和错误或谷歌搜索得到它 我最好的猜测是(这不起作用) 谢谢这并不容易,因为Excel没有内置的模式匹配功能-您只能在验证检查中使用内置功能 但是有一个解决办法 幸运的是,您可以根据依赖单元格

我制作了一个自定义电话格式#############,这样电话只能以5555555555=>555-555-5555或555-55555的形式输入

我需要一个非vba解决方案,即我可以在“数据验证”窗口中输入该解决方案,以检查单元格长度,并在长度为10或12时对其进行验证

我已经尝试了很长时间,但无法通过尝试和错误或谷歌搜索得到它

我最好的猜测是(这不起作用)


谢谢

这并不容易,因为Excel没有内置的模式匹配功能-您只能在验证检查中使用内置功能

但是有一个解决办法

幸运的是,您可以根据依赖单元格的状态检查验证。这就是我们在这里要采取的方法

1) 您的第一项工作是将电话号码格式化为文本(我的函数假定您已经这样做了),以便Excel不会修剪前导零。实际上,你会用这种方式格式化整个专栏。假设A1单元包含电话号码

2) 如果您试图将验证公式放在一个单元格中,那么验证公式将非常大,并且很难维护。我们要做的是将验证内容“从电子表格中删除”;i、 e.在用户通常不可见的列中。也就是说,为了清晰起见,我们将使用B、C和D列。(完成后,只需将其剪切并粘贴到其他位置)

3) 在B1中放入
=或(C1,D1)

4) 在C1中,put
=IFERROR(如果(LEN(A1)=10,值(A1)*0+1,FALSE),FALSE)
。这将验证不带破折号的格式

5) 在D1中,put
=IFERROR(IF(OR)(LEN(A1)=12,LEN(A1)=13),IF(AND(MID(A1,4,1)=“-”,MID(A1,8,1)=“-”),VALUE(LEFT(A1,3)和MID(A1,5,3)和MID(A1,932767))*0+1,FALSE,FALSE),FALSE)
。这将使用破折号验证格式

我使用的三个技巧是:(I)如果结果不是#VALUE,则IFERROR用于写False。这让我在编程时更加混乱,(ii)如果n是数字,则值(n)*0+1模式返回1,如果n不是数字,则方便地计算#值并将其委托给周围的函数。最后(iii)MID函数中的32767允许我们比较字符串中的其余字符,而无需使用更笨拙的右表达式。32767是单元格中字符数的限制。也许我在这里1点就出局了;请不要因此而投反对票;-)

6) 最后,对于单元格A1,选择自定义验证并将=B1设置为验证公式

就这样!它将通过所有三种格式:


55555555、555-555-5555或555-555-55555,其中您使用了5作为通配符数字。

这并不容易,因为Excel没有内置模式匹配函数-您只能在验证检查中使用内置函数

但是有一个解决办法

幸运的是,您可以根据依赖单元格的状态检查验证。这就是我们在这里要采取的方法

1) 您的第一项工作是将电话号码格式化为文本(我的函数假定您已经这样做了),以便Excel不会修剪前导零。实际上,你会用这种方式格式化整个专栏。假设A1单元包含电话号码

2) 如果您试图将验证公式放在一个单元格中,那么验证公式将非常大,并且很难维护。我们要做的是将验证内容“从电子表格中删除”;i、 e.在用户通常不可见的列中。也就是说,为了清晰起见,我们将使用B、C和D列。(完成后,只需将其剪切并粘贴到其他位置)

3) 在B1中放入
=或(C1,D1)

4) 在C1中,put
=IFERROR(如果(LEN(A1)=10,值(A1)*0+1,FALSE),FALSE)
。这将验证不带破折号的格式

5) 在D1中,put
=IFERROR(IF(OR)(LEN(A1)=12,LEN(A1)=13),IF(AND(MID(A1,4,1)=“-”,MID(A1,8,1)=“-”),VALUE(LEFT(A1,3)和MID(A1,5,3)和MID(A1,932767))*0+1,FALSE,FALSE),FALSE)
。这将使用破折号验证格式

我使用的三个技巧是:(I)如果结果不是#VALUE,则IFERROR用于写False。这让我在编程时更加混乱,(ii)如果n是数字,则值(n)*0+1模式返回1,如果n不是数字,则方便地计算#值并将其委托给周围的函数。最后(iii)MID函数中的32767允许我们比较字符串中的其余字符,而无需使用更笨拙的右表达式。32767是单元格中字符数的限制。也许我在这里1点就出局了;请不要因此而投反对票;-)

6) 最后,对于单元格A1,选择自定义验证并将=B1设置为验证公式

就这样!它将通过所有三种格式:


55555555、555-555-5555或555-555-55555,其中您使用了5作为通配符。

选择范围E2:32>单击数据验证>在设置选项卡中>选择允许作为自定义>公式
=(或(LEN(E2)=12,(LEN(E2)=10))
。我希望这能奏效。我不小心否决了这个!任何人都可以回复,或者,如果你编辑了这个问题,我可以清除它。谢谢桑托什,但它不起作用,我会尝试一下芭丝谢芭的答案。选择范围E2:32>点击数据验证>在设置选项卡中>选择允许为自定义>公式
=(或者(LEN(E2)=12,(LEN(E2)=10))
。我希望这能奏效。我不小心否决了这个!任何人都可以回复这个问题,或者,如果你编辑了这个问题,我可以澄清它。谢谢Santosh,但它不起作用,我会尝试一下Bathsheba的答案。你好,Bathsheba,这非常有效!谢谢你,也谢谢你的解释,这同样有帮助。你好,芭丝谢芭,这很好用!谢谢你,也谢谢你的解释,同样有帮助。
=IF((LEN(E2:E32)=12,0),( LEN(E2:E32)=10,0))