Существует функция VBA Range.IsDate , которая пытается разрешить допустимую дату как истинную и недействительную дату как ложную.
В Windows диапазон действительных дат - от 1 января 100 г. до 31 декабря 9999 г.н .; диапазоны варьируются в зависимости от операционной системы.
Это не объясняет систему дат Excel 1900, но объясняет систему дат Excel 1904. Вину Lotus 1-2-3 за неравенство.
Какой бы алгоритм ни использовался в IsDate
, я могу сказать, что у меня был чуть больший успех при его использовании, чем у CDate
преобразования в широком диапазоне системных локалей как на исходном, так и на целевом конце.
В конечном итоге я нашел стандарт SQL YYYYMMDD эффективным методом хранения и доставки, а также необработанные длинные целые числа. Последний просто потребует форматирования ячеек в Excel, чтобы показать реальному человеку, что значение является датой.
Если ваш код принимает введенную строковую дату, как проверено CDate или IsDate, возможно, вы переносите строковую дату в свою ячейку. Даты являются числовыми и, возможно, должны быть отформатированы, чтобы человек мог видеть их как даты, а не как 43453.
Worksheets("PURCHASE").Range("B" & newrow) = cdate(TextBox2.Text)
Worksheets("PURCHASE").Range("B" & newrow).numberformat = "dd/mm/yyyy"