Excel 2010 数据验证允许特定布局
Excel 2010 Data Validation allow specific layout
我想对参考编号应用数据验证,以强制采用以下布局(最好只使用大写字母):
XX_NNX-XX_NNN_NN-XXX
X = 数字
N = 字母
例如:12_AB1-23_ABC_AB-123
以下自定义公式允许除数字之外的所有公式 - 是否有任何解决方法?
我不想使用 *,因为它允许的字符比我想要的多。
=COUNTIF(A1,"??_???-??_???_??-???")
您可以选择AND
为您已经编写的函数添加条件。例如以下应测试应为数字的位置。
=AND(COUNTIF(A1,"??_???-??_???_??-???"),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0))
注意:这是相当基本的方法,如果您遇到涉及使用小数等的情况,可能需要进行一些调整。
编辑:您可以尝试以下方法检查指定位置的大写文本。
=AND(COUNTIF(A1,"??_???-??_???_??-???"),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0),INDEX(FREQUENCY(-CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),{-91,-65,0}),2)=7)
Edit2: 这比我想象的要难。以下公式适用于单元格 A1
.
的 DV
=AND(COUNTIF(A1,"??_???-??_???_??-???"),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0),MIN(FLOOR(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),65))=65,MAX(CEILING(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),90))=90)
但是由于一些怪癖,Excel不会让我简单地粘贴它。因此,我为此编写了一个小代码,将 DV 应用于单元格 A1
,令人惊讶的是,它通过代码接受了相同的长公式。请确保在 运行 此代码之前删除单元格中的 DV。
With Range("A1")
.Value = "12_AB1-23_ADC_AZ-123"
.Validation.Add xlValidateCustom, , , "=AND(COUNTIF(A1,""??_???-??_???_??-???""),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0),MIN(FLOOR(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),65))=65,MAX(CEILING(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),90))=90)"
End With
进入后,您只需执行 copy >> Paste Special >> Validation
.
即可在任何其他单元格中获取它
为清楚起见,我使用 Excel 2016.
我想对参考编号应用数据验证,以强制采用以下布局(最好只使用大写字母):
XX_NNX-XX_NNN_NN-XXX
X = 数字
N = 字母
例如:12_AB1-23_ABC_AB-123
以下自定义公式允许除数字之外的所有公式 - 是否有任何解决方法?
我不想使用 *,因为它允许的字符比我想要的多。
=COUNTIF(A1,"??_???-??_???_??-???")
您可以选择AND
为您已经编写的函数添加条件。例如以下应测试应为数字的位置。
=AND(COUNTIF(A1,"??_???-??_???_??-???"),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0))
注意:这是相当基本的方法,如果您遇到涉及使用小数等的情况,可能需要进行一些调整。
编辑:您可以尝试以下方法检查指定位置的大写文本。
=AND(COUNTIF(A1,"??_???-??_???_??-???"),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0),INDEX(FREQUENCY(-CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),{-91,-65,0}),2)=7)
Edit2: 这比我想象的要难。以下公式适用于单元格 A1
.
=AND(COUNTIF(A1,"??_???-??_???_??-???"),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0),MIN(FLOOR(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),65))=65,MAX(CEILING(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),90))=90)
但是由于一些怪癖,Excel不会让我简单地粘贴它。因此,我为此编写了一个小代码,将 DV 应用于单元格 A1
,令人惊讶的是,它通过代码接受了相同的长公式。请确保在 运行 此代码之前删除单元格中的 DV。
With Range("A1")
.Value = "12_AB1-23_ADC_AZ-123"
.Validation.Add xlValidateCustom, , , "=AND(COUNTIF(A1,""??_???-??_???_??-???""),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0),MIN(FLOOR(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),65))=65,MAX(CEILING(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A:$A),1)),90))=90)"
End With
进入后,您只需执行 copy >> Paste Special >> Validation
.
为清楚起见,我使用 Excel 2016.