0

我制作了自定义电话格式###-###-####,这样电话号码只能输入为 5555555555 => 555-555-5555 或 555-555-55555。

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

我已经尝试了很长时间,但无法通过反复试验或谷歌搜索来获得它。

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

=IF((LEN(E2:E32)=12,0),( LEN(E2:E32)=10,0))

谢谢

4

1 回答 1

3

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

不过有解决办法!

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

1)您的第一项工作是将电话号码格式化为文本(我的函数假设您已完成此操作),因此 Excel 不会修剪前导零。在实践中,您会以这种方式格式化整个列。假设单元格 A1 将包含电话号码。

2)如果你试图把它放在一个单元格中,验证公式会大得离谱,而且很难维护。我们要做的是将验证内容放在“电子表格之外”;即在用户通常看不到的列中。也就是说,为了清楚起见,我们将使用 B、C 和 D 列。(完成后只需将它们剪切并粘贴到其他地方)。

3)在B1放=OR(C1,D1)

4)在C1放=IFERROR(IF(LEN(A1)=10,VALUE(A1)*0 + 1,FALSE),FALSE)。这验证了没有破折号的格式。

5)在D1放=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,9,32767)) * 0 + 1,FALSE),FALSE),FALSE)。这使用破折号验证格式。

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

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

这样做!它将通过您的所有三种格式:

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

于 2013-05-21T07:27:41.193 回答