Функція IsDate VBA нібито повідомляє вам, чи можна інтерпретувати текстовий рядок як дату. Наприклад, усі наведені нижче вирази мають значення True:
IsDate("25.05.2015")
IsDate ("16 січня")
IsDate("12-1")
IsDate(“12/1/15”)
IsDate(“2/30”)
IsDate("30/2")
У двох останніх прикладах зверніть увагу, що IsDate не вибагливий щодо порядку дня та місяця. Обидва ці рядки можна інтерпретувати як дату, тому IsDate повертає True (незалежно від налаштувань формату дати в системі).
Ось деяка інформація зі статті служби підтримки Microsoft :
Функції дати VBA IsDate, Format, CDate і CVDate використовують функцію, знайдену в OLE Automation (OleAut32.dll). Ця функція шукає всі можливі формати дати, токенізуючи кожне з відокремлених значень у рядку, що представляє дату, і повертає логічне значення, яке вказує, чи можна ввести дані як дату.
Це важливо пам’ятати під час використання функції для інтерпретації дати, яка містить 2-значний рік. Різні локалі використовують різні формати дати (тобто мм/дд/рр, рр/мм/дд, “ ДД МММ РР ” , “ РР МММ ДД ” і так далі), тому функція намагається ввести цифри в усіх позиціях, доки не функція знайшла дійсну дату або вичерпала всі можливості.
Те, що IsDate розпізнає рядок як дату, не означає, що рядок можна надійно перетворити на дату. У деяких випадках результат неоднозначний. Наприклад, як щодо цього виразу?
IsDate(“29-Feb-01”)
29 лютого 2001 р. недійсна дата. Однак цей вираз повертає True, оскільки 1 лютого 1929 року (і 2 січня 1929 року) є дійсними датами. І ті самі дати 2029 року.
Пошук документації IsDate був порожнім. На основі тестування IsDate приймає будь-який із наступних символів роздільника: косу риску (/), дефіс (-), кому (,), крапку (.) і пробіл.
Тому всі наступні вирази повертають True:
IsDate("5.1")
IsDate("30 6")
IsDate("30,6")
IsDate("1/2")
Але є така аномалія: такі вирази повертають True:
IsDate("5.1.5")
IsDate("5.1.05")
Однак неявно цей вираз повертає False:
IsDate("5.1.2005")
Припустимо, що ви створили UserForm з InputBox, де користувач вводить дату. Повинно бути зрозуміло, що використання IsDate для перевірки запису не дуже надійно.
Ситуація стає ще більш заплутаною, коли ви розумієте, що IsDate також охоплює значення часу. (Відповідної функції IsTime немає.) Отже, усі наступні вирази повертають True:
IsDate("4:45")
IsDate("4.45")
IsDate("4 45")
IsDate("4/45")
IsDate("23:59")
Ці вирази повертають False:
IsDate("4:60")
IsDate("24.45")
Важливо зазначити, що IsDate не демонструє всі ці примхи, коли ви передаєте аргумент Range. Наприклад:
IsDate(діапазон(“A1”))
Здається, що IsDate абсолютно надійний для визначення осередків, які містять дату або час. Він, наприклад, не визначає клітинку, яка містить 5.1 як дату. Якщо вашому коду потрібно визначити, чи можна інтерпретувати рядок як дату, найкраще рішення — помістити цей рядок у комірку, а потім написати код, щоб перевірити вміст комірки.