эта пользовательская проверка не работает, но я не знаю, что происходит - PullRequest
2 голосов
/ 22 декабря 2011

Я знаю, что "программирование" в excel не очень популярно среди коллег-программистов, однако я изо всех сил пытался понять это правильно, и управление у меня на шее ..

У меня есть пользовательская проверка в Excel:

=AND(LEN(AV15)=10,((VALUE(LEFT(AV15,2)))<=31),NOT(ISERROR(VALUE(LEFT(AV15,2)))),MID(AV15,3,1)="/",((VALUE(MID(AV15,4,2)))<=12),NOT(ISERROR(VALUE(MID(AV15,4,2)))),MID(AV15,6,1)="/",((VALUE(RIGHT(AV15,4)))<=2100),NOT(ISERROR(VALUE(RIGHT(AV15,4)))))

Приведенная выше проверка должна принимать любую действительную дату в формате:

dd/mm/yyyy

Кажется, что он работает частично, но каким-то образом он не примет день меньше 12, например:

 14/12/2010 -->accepted
 13/10/2010 -->accepted
 25/10/2010 -->accepted
 12/10/2010 -->gives error

На первый взгляд можно заметить, что ((VALUE(MID(AV15,4,2)))<=12) вызывает такое поведение, но я изменил его на 31, и я все еще получаю сообщение об ошибке, мне нужна проверка для допуска входных данных в:

 nn/nn/nnnn

, где "n" - это число, мне все равно, если они введут 99/99/9999. Позже я могу проверить это на коде vba, но для ввода необходимо указать 10 символов.

любая помощь будет высоко ценится

Ответы [ 5 ]

3 голосов
/ 22 декабря 2011

Я подставляю вашу формулу, а когда вы ставите ' до даты, она работает просто отлично.То, что происходит, заключается в том, что когда вы устанавливаете любое значение ниже 13 как день, оно оценивает дату как date, которая хранится как number в Excel.Если у вас значение выше 13, оно оценивается как string.Итак, вам нужно отформатировать ячейку в формате Text.Тогда это должно работать просто отлично.

1 голос
/ 22 декабря 2011

Чтобы проверить, работает ли следующее, введите значение даты в A1

A1 -> '14/12/2010

. Поместите следующие формулы, как указано ниже

B1 -> =MID(A1,3,1) = "/"
C1 -> =MID(A1,6,1) = "/"
D1 -> =IFERROR(AND(VALUE(MID(A1,4,2)) >= 1, VALUE(MID(A1,4,2)) <= 12), FALSE)
E1 -> =AND(VALUE(RIGHT(A1,4))>=2000,AND(VALUE(RIGHT(A1,4))<=2100))
F1 -> =AND(B1,C1,D1, E1)

ФормулыВыше разделены, и вам придется объединить их (как это делается в ячейке F1).
Надеюсь, что помогает.

EDIT : объединенная формула для проверки будет ( примечание , что я использовал A1 в качестве ячейки)

=AND(MID(A1,3,1) = "/", MID(A1,6,1) = "/", IFERROR(AND(VALUE(MID(A1,4,2)) >= 1, VALUE(MID(A1,4,2)) <= 12), FALSE), AND(VALUE(RIGHT(A1,4))>=2000,AND(VALUE(RIGHT(A1,4))<=2100)))
0 голосов
/ 22 декабря 2011

Если вы не опасаетесь VBA, то как насчет простого UDF?

Public Function DateFormat(rng As Range)
  Dim regEx As Object

  Set regEx = CreateObject("VBScript.RegExp")

  regEx.Pattern = "\d\d/\d\d/\d\d\d\d"
  test = regEx.Execute(rng.Value).Count > 0
End Function

Это должно возвращать true, если значение ячейки соответствует nn / nn / nnnn, где n - любое число. Тогда вы могли бы просто сказать =DateFormat(AV15)

0 голосов
/ 22 декабря 2011

Похоже, что Excel распознает значения, такие как 10/12/2010, как даты и хранит их внутри в другом формате, таком как количество дней с 1 января 1900 года или тому подобное. Бывает, что когда вы используете LEFT, MID и RIGHT в этих значениях даты, Excel не выполняет преобразование обратно из своего внутреннего формата. В частности, я поместил 10/12/2010 в ячейку A1 и =LEFT(A1,10) в ячейку B1. Ячейка B1 тогда показала мне значение 40522. (Я нахожусь в Великобритании и использую Excel 2010 Starter. Вы можете получить другие значения в других локалях или в других версиях Excel.)

Попробуйте заменить все вхождения AV15 в вашей формуле на TEXT(AV15, "DD/MM/YYYY"). Также можно поместить =TEXT(AV15, "DD/MM/YYYY") в другую ячейку и использовать эту другую ячейку в своей формуле вместо AV15.

0 голосов
/ 22 декабря 2011

Разве вы не можете просто выбрать правильный формат в ячейке?

  1. Щелкните правой кнопкой мыши в ячейке и выберите «Формат ячейки»
  2. Выберите «Пользовательский» в левой части навигации
  3. В поле «Тип:» введите это: дд / мм / гггг
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...