2015-01-11 4 views
6

Когда я использую формулу DATEVALUE («01.01.1900») Я получаю 1 и отформатированную в качестве даты он показывает, как 01.01.1900Ошибка в VBA DateValue() в VBA Excel?

При использовании VBA

.Range("A1").Value = DateValue("01/01/1900") 

это показывает как «01/01/1900» в камере

Как это возможно?

Если я использую, например

.Range("A1").Value = DateValue("01/01/1901") 

он отлично работает!

Голова расплавлена ​​!!!

Microsoft утверждают, что - «Использование системы по умолчанию дату в Microsoft Excel для Windows, дата_как_текст аргумент должен представлять дату в период с 1 января 1900 года и 31 декабря 9999»

+0

[Дни недели до 1 марта 1900 неверны в Excel] (http://support.microsoft.com/kb/214058/en-us) – GSerg

+3

возможно дубликат [Почему дни недели Excel неправильно за 1900?] (http://superuser.com/questions/481496/why-are-excel-weekdays-wrong-for-1900) – GSerg

+1

ссылка говорит WeekDay, Не знаете, почему это повлияет на DateValue? также ячейка говорит 02/01/1900, но редактор VBA говорит 01/01/1900 о всплывающей подсказке, но на самом деле это 02/01/1900 используется для сравнения - .Range («A1»). Значение <> «01.02.1900» приравнивается к истине, но ячейка говорит, что 02/01/1900 - багги, как ад. –

ответ

4

Короче, DateTime эпоха Excel не является так же, как эпоха DateTime VBA. Несмотря на то, что они являются такой же, как только вы пройти 28 февраля, 1900.

От Joel Spolksy's blog:

В большинстве современных сред программирования, даты хранятся в виде реальных чисел. Целочисленная часть числа - это число дней с определенной даты согласования в прошлом, называемой эпохой. В Excel, сегодняшний даты, 16 июня 2006 года, хранятся в 38884, считая дни, когда январь первых, 1900 1.

Я начал работать через различные функции даты и времени в Basic и дата и время функции в Excel, пытаясь разобраться, когда я заметил что-то странное в документации Visual Basic: Basic использует 31 декабря 1899 года как эпоху вместо 1 января 1900 года, но по какой-то причине сегодняшняя дата была такой же в Excel как это было в Основные.

Да?

Я пошел искать разработчика Excel, который был достаточно взрослым, чтобы помнить, почему. Эд Фрис, казалось, знал ответ.

«О, - сказал он мне. «Отъезд 28 февраля 1900 года».

«Это 59», - сказал я.

«Теперь попробуйте 1 марта».

"Это 61!"

«Что случилось с 60?» - спросил Эд.

«29 февраля 1900 года был високосным годом, он делится на 4!»

«Хорошая догадка, но без сигары», - сказал Эд, и оставил меня в недоумении от .

К сожалению. Я провел некоторое исследование.Годы, которые делятся на 100, не являются високосными годами, если они также не делятся на 400.

1900 год не был високосным.

«Это ошибка в Excel!» - воскликнул я.

«Ну, не совсем, - сказал Эд. «Мы должны были сделать это, потому что нам нужно , чтобы иметь возможность импортировать рабочие листы Lotus 123».

«Значит, это ошибка в Lotus 123?»

«Да, но, вероятно, преднамеренным один. Лотос был вписываться в 640K. Это не очень много памяти. Если вы игнорируете 1900, вы можете выяснить, если данный год является високосным, просто посмотрев на посмотрите, есть ли в самом начале два бита. Это очень быстро и просто. Лотосы-ребята , вероятно, полагали, что в прошлом было не так, как ошибаться в течение двухмесячного пути . Похоже, что базовые парни хотели быть анальными около этих двух месяцев, поэтому они вернули эпоху в один прекрасный день ».

"Aargh!" Я сказал, и ушел, чтобы изучить, почему в диалоговом окне был установлен флажок, который называется 1904 Date System.


Приведенная ниже информация была взята из this Super User answer.


Как описано в Microsoft KB 214058:

Days of the week before March 1, 1900 are incorrect in Excel

Дополнительная информация

Когда система даты в Microsoft Excel изначально был создан, он был разработан, чтобы быть полностью совместимым с датой системы, используемые другими программами для работы с электронными таблицами.

Однако в этой системе даты, 1900 год неправильно интерпретируется как високосный год. Поскольку в 1900 году нет 29 февраля («високосный день»), день недели для любой даты до 1 марта 1900 года (на следующий день после «високосного дня») не рассчитывается правильно.

«Другие программы электронных таблиц» относятся к Lotus 1-2-3, который был довольно популярен тогда, и ошибочно предположил, что год 1900 был високосным. Это объясняется еще более подробно в KB 214326:

Excel 2000 incorrectly assumes that the year 1900 is a leap year

Дополнительная информация

Когда Lotus 1-2-3 был выпущен первый, программа предполагается, что 1900 год был високосным, хотя на самом деле это был не високосный год. Это помогло программе справиться с летальными годами и не повредило почти всем вычислениям дат в Lotus 1-2-3.

Когда Microsoft Multiplan и Microsoft Excel были выпущены, они также предположили, что 1900 год был високосным.Это допущение позволило Microsoft Multiplan и Microsoft Excel использовать одну и ту же систему серийных дат, используемую Lotus 1-2-3, и обеспечить большую совместимость с Lotus 1-2-3. Обработка 1900 года как високосного года также облегчила пользователям перемещение листов из одной программы в другую.

Хотя технически возможно исправить это поведение, так что текущие версии Microsoft Excel не предполагают, что 1900 год является високосным годом, недостатки в этом превышают преимущества.

Если такое поведение должны были быть исправлены, возникнет много проблем, в том числе следующие:

  • Почти все даты текущих рабочих листов Microsoft Excel и других документов, будет сокращен на один день. Исправление этого сдвига потребует значительных усилий и времени, особенно в формулах, которые используют даты.
  • Некоторые функции, такие как функция WEEKDAY, возвращают разные значения; это может привести к неправильной работе формул в рабочих листах.
  • Исправление этого поведения приведет к нарушению совместимости даты и времени между Microsoft Excel и другими программами, использующими даты.

Если поведение остается откорректировано, только одна проблема возникает:

  • Функция WEEKDAY возвращает неверные значения дат до 1 марта 1900 г. Поскольку большинство пользователей не используют дат до 1 марта 1900 года, эта проблема редка.