excel vba разница дат

Я пытаюсь выяснить разницу между системной датой и датой, хранящейся на листе. Если разница между ними составляет > 30 дней, результат будет истинным, иначе результат будет ложным

Как узнать разницу в днях между системной датой и датой, хранящейся на листе? Дата на листе также может быть прошлой датой.

Интересно, почему я редко вижу людей, использующих функции даты.

Вы также можете использовать это:

в этом случае date1 будет CDate (Worksheets ( «даты» ). Ячейки (1,1)) и date2 будет sdate (либо с CDate, либо dim’d в качестве даты, как сказал Джефф.

«d» означает, что мы получаем разницу в днях. Вот несколько лет, месяцев и т.д. В VBA:

sDate — это STRING, которая не является реальной датой!

Преобразуйте свою строку в дату, используя либо функцию CDate(), либо функцию DateValue().

Однако в этом преобразовании есть оговорка. Эти преобразования будут обрабатывать следующие структуры:

Они не будут правильно преобразованы

И избегайте использования двухзначного года.

Я бы посоветовал использовать функцию DateSerial() для преобразования даты.

Итак, в отношении вашего кода, считая, что значения на листе yor являются фактическими датами (чтобы быть уверенным, просто выберите столбец и измените формат номера на GENERAL. Если это настоящие даты, каждый из них отобразит ЧИСТЫЙ НОМЕР. нажмите UNDO, чтобы получить формат даты).

Я пишу подпрограмму vba в Excel для хранения всех значений дат между двумя датами в одном массиве измерений, а затем проверяю каждое значение в диапазоне на другом листе.

Моя проблема заключается в том, что когда код захватывает значения даты (как целое число (или двойное число — в зависимости от того, какое значение он использует на самом деле)), он сохраняет значение на 1462 больше значения даты на листе.

Я использую систему дат 1904 года, поэтому я могу использовать отрицательные значения времени, и я нахожусь в Австралии, поэтому даты имеют формат дд/мм/гггг.

На листе: 01.01.2009 = 42004

В коде: 01.01.2009 = 43466

Я понимаю, что разница такая же, как разница между значениями дат при использовании систем дат 1900 г. по сравнению с 1904 г., что заставляет меня поверить, что, возможно, VBA по умолчанию использует значение листа в 1900 г. и снова преобразовывает значение в 1904 г. при выполнении кода?

Эта рабочая книга настроена следующим образом:

Sheet1 содержит даты с 01.01.2009 по 25.01.2009 в Range(«A1:A25») .

Sheet2 содержит 01.01.2009 в ячейке A1 и 01.10.2009 в ячейке A2 и командную commandbutton .

Вывод значений cell в столбцах 3 и 4 выглядит следующим образом (первые 5 строк для демонстрации):

Даты записываются в ячейку в виде краткого формата даты, а не числового значения.

Используя окно запугивания, которое я заметил ?cdbl(DateValue(now)) = 43496 (31/01/2019) что заставляет меня задаться вопросом, какие значения являются правильными для дат, использующих систему дат 1904 года? В соответствии со значениями в Sheet1 это должно быть 42034 .

Является ли проблема вызванной типом данных или функцией, которую я использовал, или как было задано ранее — лист преобразует их в 1904, когда значения присваиваются Sheet2 с VBA, это ошибка в Excel или что-то еще?

Я нашел вопрос с той же проблемой здесь, на mrexcel, однако в этом случае было принято решение изменить Excel для использования системы дат 1900 года или вычесть 1462 из значений в коде, которых я надеюсь избежать обоих.

2 ответа

5 Решение Vityata [2019-01-31 16:44:00]

В общем, система дат в VBA отличается от системы дат в Excel. Вы можете иметь эти 3 варианта системы дат:

  • Дата Excel
  • Дата Excel с 1904 собственности
  • Дата VBA

Это разница:

Даты конвертируются в числа. Например, каждая дата преобразуется в число, но начальный номер немного отличается.

  • В Excel 1 конвертируется в 01. Jan. 1900;
  • В VBA 1 преобразуется в 31 декабря 1899 года;
  • В Excel с 1904 г. 1 преобразуется в 02. января 1904 г.;

Система 1904 года (или ее отсутствие) устанавливается для каждой рабочей книги. Таким образом, если у вас есть две книги в Excel, одна с 1904 и одна без нее, она распознает их соответственно. Система установлена в:

Файл> Параметры> Дополнительно> Использовать систему дат 1904

В общем, если есть вероятность, что кто-то каким-то образом изменит вашу рабочую книгу с неверной системой, рассмотрите возможность добавления этой проверки при открытии рабочей книги:

Если вам интересно, какую систему выбрать — я могу рекомендовать никогда не использовать 1904.

Для того, чтобы обеспечить решение моего примера упоминается коллега, если вы тусклый значения даты как date типа данных вопросов со значениями происходит лист → УВА → лист исчезает.

Я пытаюсь выяснить разницу между системной датой и датой, хранящейся на листе. Если разница между ними составляет> 30 дней, результат верен, иначе результат неверен

Как узнать разницу в днях между системной датой и датой, хранящейся в рабочем листе? Дата на листе также может быть прошлой датой.

Создан 22 ноя. 11 2011-11-22 02:13:25 Ank

Какое значение даты хранится в электронной таблице? т.е. 1 апреля 2010 года, 01/30/2010 и т. д. – brettdj 22 ноя. 11 2011-11-22 10:18:59

В качестве текста, я думаю. mm/dd/yyyy – Ank 22 ноя. 11 2011-11-22 18:00:18

3 ответа

Интересно, почему я редко вижу людей, использующих функции даты.

Вы также можете использовать это:

в этом случае date1 бы CDate и date2 будет SDATE (либо залит (Worksheets («дата») Cells (1,1).) CDate или dim’d как дата, как сказал Джефф

«d» означает, что мы получаем разницу в днях Вот интервалы в течение многих лет, месяцев и т.д. в VBA.

Создан 22 ноя. 11 2011-11-22 19:47:48 Justin Self

Создан 22 ноя. 11 2011-11-22 02:16:10 Jeffrey L Whitledge

Я не знал, что что-то вроде CDate существует !! lol .. Позвольте мне попробовать .. – Ank 22 ноя. 11 2011-11-22 02:17:36

CDate (Рабочие листы («даты»). Ячейки (1,1)) дают несоответствие типа! – Ank 22 ноя. 11 2011-11-22 18:10:03

@Ankur — О, sDate также должна быть датой. Я вижу, что это строка. На самом деле, если вы измените sDate на дату, вам может не понадобиться подавать CDate. – Jeffrey L Whitledge 22 ноя. 11 2011-11-22 18:40:33

Спасибо .. Работает сейчас !! – Ank 22 ноя. 11 2011-11-22 20:36:26

SDATE это STRI NG, который НЕ является реальной датой!

Преобразуйте свою строку в дату, используя либо функцию CDate(), либо функцию DateValue().

Однако в этом преобразовании есть оговорка. Эти преобразования будут обрабатывать следующие структуры:

Они не будут правильно преобразованы

И избегать использования любого 2-значный год.

Я бы посоветовал использовать функцию DateSerial() для преобразования даты.

Так что в отношении вашего кода, считая, что значения на листе являются фактическими датами (чтобы быть уверенным, просто выберите столбец и измените формат номера на GENERAL. Если это настоящие даты, каждый из них отобразит ЧИСТЫЙ НОМЕР. ударить UNDO, чтобы получить ваш формат даты назад)

Создан 22 ноя. 11 2011-11-22 21:54:58 SkipVought

Оцените статью