【问题标题】:data validation with numbers + text使用数字+文本进行数据验证
【发布时间】:2017-05-12 15:36:00
【问题描述】:

尝试编写仅允许以下格式的值的自定义数据验证公式:2 位数年份(这可以只是 2 个数字)、破折号(“-”),然后是 1 或 2 个字母字符)(更喜欢大写,但会选择小写),另一个破折号(“-”),然后是 5 位数字。所以最终值看起来像:17-FL-12345 ...或16-G-00008...

我实际上还有更多,但如果我能完成上述工作,那就太棒了。我不知道是否有办法,但如果另外我可以使用自定义格式来让破折号在未输入时出现,那就太好了,即用户输入“17FL12345”并自动格式化为“17- FL-12345"。最后,同样,这也不是一个交易破坏者,但如果最后 5 位数字添加任何前导零也会很好,即用户输入 17-G-8(或仅 17G8)并格式化为17-G-00008。

很遗憾,无法使用 VBA。我看过的类似问题的一些潜在解决方案包括:

https://www.mrexcel.com/forum/excel-questions/615799-data-validation-mixed-numeric-text-formula-only.html

Data VAlidation - Text Length & Character Type

Excel : Data Validation, how to force the user to enter a string that is 2 char long?

【问题讨论】:

  • 要进行格式化,您需要 vba。还允许用户在没有破折号的情况下输入它会使数据验证无效。如果 vba 不在桌面上,您将只能做第一个,也就是说,如果公式可以用少于 255 个字符完成,这可能会推动它。所以条目需要破折号和完整的数字。
  • 你试过什么?正如@ScottCraner 所写,没有VBA 就无法进行格式化。因此,请向我们展示您尝试过的公式以及遇到问题的地方。您需要IF 来决定检查一两个字母;其余的应该相当简单(写出来很乏味)。
  • @ScottCraner 感谢您提供的信息...仅获取第一部分是可以接受的...要求用户使用破折号并且完整的数字并不是什么大不了的事
  • 作为@RonRosenfeld,这相当乏味,因为需要解析字符串并检查每个部分。你试过什么?我们可以指出您的公式为何失​​败。但通常我们不会为您写信。

标签: excel validation


【解决方案1】:

试试这个:

=AND(ISNUMBER(VALUE(LEFT(A1,2))),MID(A1,3,1)="-",OR(ISNUMBER(FIND(MID(A1,4,1),$C$1)),AND(ISNUMBER(FIND(MID(A1,4,1),$C$1)),ISNUMBER(FIND(MID(A1,5,1),$C$1)))),MID(A1,LEN(A1)-5,1)="-",ISNUMBER(VALUE(RIGHT(A1,5))),OR(LEN(A1)=11,LEN(A1)=10),LEN(A1)-LEN(SUBSTITUTE(A1,"-",""))=2,LEN(A1)-LEN(SUBSTITUTE(A1,"+",""))=0,LEN(A1)-LEN(SUBSTITUTE(A1," ",""))=0)

假设,您想要验证 A1。我在 C1 中插入了字母。

编辑:

为了更安全,我编辑了原始函数,并省略了Isnumber 部分,而是逐位进行。 如果你想超过 255 的限制,你必须对函数进行切片。 我创建了 5 个函数。

=AND(ISNUMBER(FIND(LEFT(A1),$C$2)),ISNUMBER(FIND(MID(A1,2,1),$C$2)))

=MID(A1,3,1)="-"

=IF(LEN(A1)=10,AND(ISNUMBER(FIND(MID(A1,4,1),$C$1)),MID(A1,5,1)="-"),IF(LEN(A1)=11,AND(ISNUMBER(FIND(MID(A1,4,1),$C$1)),ISNUMBER(FIND(MID(A1,5,1),$C$1)))))

=IF(LEN(A1)=10,MID(A1,5,1)="-",IF(LEN(A1)=11,MID(A1,6,1)="-"))

=IF(LEN(A1)=10,AND(ISNUMBER(FIND(MID(A1,6,1),$C$2)),ISNUMBER(FIND(MID(A1,7,1),$C$2)),ISNUMBER(FIND(MID(A1,8,1),$C$2)),ISNUMBER(FIND(MID(A1,9,1),$C$2)),ISNUMBER(FIND(MID(A1,10,1),$C$2))),IF(LEN(A1)=11,AND(ISNUMBER(FIND(MID(A1,7,1),$C$2)),ISNUMBER(FIND(MID(A1,8,1),$C$2)),ISNUMBER(FIND(MID(A1,9,1),$C$2)),ISNUMBER(FIND(MID(A1,10,1),$C$2)),ISNUMBER(FIND(MID(A1,11,1),$C$2)))))

如图所示设置数据验证:

【讨论】:

  • 我想我现在是正确的:您的公式似乎返回 TRUE12-FG--1234。您可能需要逐位作为前导空格,-+ 将在 isumeric 上测试为阳性。另外,建议你把C1改成绝对地址。
  • @Vinnie 这太棒了!谢谢!我需要使用它来匹配我的工作表,但是当我作为独立公式输入时,它的评估结果为真。我正要回复 Ron Rosenfeld 我正在玩 =AND(ISNUMBER(LEFT...MID(ISTEXT(...)...ISNUMBER(RIGHT(...) - 但需要添加破折号和 OR声明。至少我是在正确的轨道上。
  • @RonRosenfeld 感谢您的检查。我添加了我们需要的标准 2 - 和 no+
  • 关于绕过 255 个验证公式限制的任何想法?这是在扩展表中使用的,因此“A1”必须引用当前单元格的行。
  • @Vinnie 谢谢...我刚刚用您的第一个公式在表格末尾创建了一个隐藏的帮助列,将 A1 替换为 [@[#Ref]];然后创建了一个命名范围 =Table1[@[Helper Column]],然后进行了验证 = 命名范围。这一切都有效!再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多