Проверка данных Excel 2010 позволяет задавать макет c - PullRequest
0 голосов
/ 22 марта 2020

Я хочу применить проверку данных к ссылочным номерам, чтобы заставить следующий макет (в идеале только в верхнем регистре):

XX_NNX-XX_NNN_NN-XXX

X = числа

N = буквы

Например: 12_AB1-23_ABC_AB-123

Следующая пользовательская формула позволяет все это, кроме чисел - есть ли обходной путь для этого?

Я не хочу использовать *, поскольку он допускает больше символов, чем я хочу.

=COUNTIF(A1,"??_???-??_???_??-???")

1 Ответ

1 голос
/ 22 марта 2020

Вы можете выбрать AND, чтобы добавить условие к функции, которую вы уже написали. например, следующие должны проверить позиции, которые должны быть нумерацией c.

=AND(COUNTIF(A1,"??_???-??_???_??-???"),ISNUMBER((LEFT(A1,2)&MID(A1,6,1)&MID(A1,8,2)&RIGHT(A1,3))+0))

Примечания: Это довольно базовый подход c и может потребоваться некоторые настройки если у вас есть случаи использования десятичных чисел и т. д. c.

Редактировать: Вы можете попробовать подход ниже для проверки текста в верхнем регистре в указанных позициях.

=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$1:$A$7),1)),{-91,-65,0}),2)=7)

Edit2: Это оказалось сложнее, чем я себе представлял. Следующая формула работает в DV для ячейки 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$1:$A$7),1)),65))=65,MAX(CEILING(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A$1:$A$7),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$1:$A$7),1)),65))=65,MAX(CEILING(CODE(MID(MID(A1,4,2)&MID(A1,11,3)&MID(A1,15,2),ROW($A$1:$A$7),1)),90))=90)"
End With

Оказавшись там, вы можете получить его в любой другой ячейке, просто выполнив copy >> Paste Special >> Validation.

For Я использую Excel 2016.

...