Я пытаюсь выяснить разницу между системной датой и датой, хранящейся на листе. Если разница между ними составляет > 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