Страницы: 1
RSS
Работа с датами 1900 года в Excel через VBA, Как VBA работает с датами 1900 года. Хочу понять.
 
Чтобы не вдаваться в подробности, я вычленила непонятный мне момент в арифметике над датами VBA и сфокусировала его в виде макроса.
Он маленький.
Код
Sub Макрос1()
Cells(1, 1) = CDate("02.02.1901") + CDate("01.01.1900")  ' присвоит ячейке 04.02.1901
Cells(2, 1) = CDate(1) ' Watches покажет значение 31.12.1899 (так как базовая дата у Excel и VBA разные), но ячейке будет присвоено 01.01.1900

Cells(3, 1) = CDate("02.02.1901") + Cells(2, 1) ' присвоит ячейке 03.02.1901
End Sub

Теперь короткий вопрос: почему  Cells(1, 1) и Cells(3, 1) различны?
 
Не вижу вопроса и что-то непонятного.
Cells(1, 1) = CDate("02.02.1901") + CDate("01.01.1900")
это вы сложили в редакторе, то-бишь непосредственно в VBA.
А это вы сложили уже две другие даты
Cells(3, 1) = CDate("02.02.1901") + Cells(2, 1)
Если присвоить в VBA обратно
Код
Cells(1)=CDate(1)
?Cdate(1)
31.12.1899 
?Cells(1)
31.12.1899 
То в редакторе отобразится не 1900, а 1899.
И никто не говорил, что CDate(1) - это базовая дата.
Базовая дата это Cdate(0), который равен 30.12.1899, хоть редактор и пишет 0:00:00.
Если написать так, то можно увидеть
Код
?Cdate(-1)
29.12.1899 
?Cdate(0)
0:00:00 
?Cdate(1)
31.12.1899
Так что всё логично вроде.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 

Прочитайте например:
http://www.exceluser.com/formulas/earlydates.htm

Это вопрос/тема река. Используйте другие функции, а не "CDate":

DateDiff
DateAdd
DateValue
и обычное сложение и вычитание в алгоритмах, вычисляющих дату около 1900 года и ранее.

Для просмотра также:

високосные годы
http://spreadsheetpage.com/index.php/file/extended_date_functions_xdate/
https://support.microsoft.com/en-us/help/245104/how-to-calculate-ages-before-1-1-1900-in-excel

и другие.

 
2 Alemox:
На мой взгляд то, что Cdate(0) выводит 0:00:00 уже не особо логично(не то чтобы интуитивно ожидаемо).
Кстати, у меня он в ячейку с "Кратким форматом даты" вывел CDate(0) как 00.01.1900, что вообще мозг взрывает :).
2 ocet p:
Спасибо за ссылки, буду изучать )
 
Цитата
Aspirantis написал:
На мой взгляд то, что Cdate(0) выводит 0:00:00 уже не особо логично(не то чтобы интуитивно ожидаемо).
Объект даты хранит данные в виде числа с плавающей точкой/запятой, где целая часть отсчитывает дни, а дробная - время. При нулевой целой части отображаемая "дата" становится отображаемым "временем", только и всего.
При этом к упомянутой десятичной дроби из дней,времени плюсуется стартовая дата 00.01.1900 00:00:00 (она же - число 0,0).

Самое забавное, это сравнить работу IsDate и CDate на подобных датах:
Код
If IsDate("28.07.988") Then '= True
   CDate("28.07.988") '- вылет по ошибке :).
End If
Изменено: Irregular Expression - 30.05.2018 16:34:12
Страницы: 1
Наверх