VBA Excel: сравнение дат
Сравнение таблиц в Excel с помощью макросов VBA
В этой статье мы рассмотрим способ сравнения таблиц Excel с использованием макросов VBA на примере тех же исходных данных.
Проиллюстрируем проблему изображением из первой статьи.
Для начала напишем алгоритм наших действий при сравнении таблиц.
- Мы определяем диапазоны данных первой и второй таблиц, то есть находим последние значимые строки и сохраняем их номера в переменных (последняя строка таблицы 1 — last_i, а последняя строка таблицы 2 — last_j).
- Начнем с изучения каждой строки таблицы 2 (внешний цикл), данные которой должны быть перенесены в таблицу 1. От первой строки данных (в примере это строка 3) до последней строки таблицы 2.
- Для каждой строки таблицы 2 мы определяем идентификатор строки, формируя строку, содержащую полный адрес квартиры (значения нескольких столбцов, разделенные тире).
- Мы начинаем исследовать каждую строку таблицы 1 (внутренний цикл) от первой строки данных (в примере это строка 3) до последней строки таблицы 1, определяя идентификатор строки.
- Сравним значения идентификаторов строк в Таблице 1 и Таблице 2.
- Если идентификаторы совпадают, перепишем полное имя покупателя из ячейки таблицы 2 в соответствующую ячейку таблицы 1; мы разорвем внутренний цикл согласно таблице 1 и перейдем к следующей строке таблицы 2 (переход к шагу 2).
Теперь осталось реализовать алгоритм в виде программного кода макроса.
Для этого откройте вкладку «Просмотр» на ленте функций Excel. Щелкните внизу со стрелкой на кнопке Macro. В открывшемся подменю выберите «Записать макрос». Это начнет запись нового макроса. Поскольку мы будем генерировать код вручную, мы еще раз перейдем в подменю макросов и выберем Остановить запись. Затем еще раз войдите в подменю макросов и выберите «Макросы.
В появившемся диалоге выбираем наш макрос и нажимаем Edit.
Откроется окно редактора макросов Visual Basic для приложений. В области кода (верхняя правая область) отображается код только что созданного пустого макроса.
В процедуре Macro1 (между объявлениями начала и конца процедуры: Sub и End Sub) вам необходимо вставить код, решающий проблему. Пример кода показан ниже.
Результат решения проблемы:
Урок 15 по VBA — функции работы с датой и временем
Итак, в этой естественно скучной публикации я кратко рассмотрю функции даты и времени vba, которые позволяют вам получать или устанавливать параметры даты и времени, устанавливать таймер для выполнения определенного блока кода или одного скрипта в целом. Также в конце статьи будет затронута функция языка форматирования vba. Которая отвечает за форматирование данных.
Функции VBA даты и времени
Date () — получить текущее значение даты, установленное в системе.
Time () — вернет время, установленное в системе
Now () — это комбинированная функция, поскольку она получает значение системной даты и времени.
DateAdd (интервал, число, дата) — добавляет указанное количество лет, кварталов, месяцев или секунд к указанной дате (параметр «дата»). На выходе получаем следующее значение: дата + (число * диапазон).
DateDiff (range, date, date2) — получить, например, разницу между заданными датами. В годах, месяцах и т.д. Разница определяется параметром «интервал”.
DatePart (диапазон, дата): получает указанную часть даты, например, только год, месяц или день недели. Результат возврата регулируется параметром «интервал”.
DateSerial (год, месяц, день): эта функция vba принимает три числовых значения, на основе которых возвращается дата.
DateValue (строка) является аналогом предыдущей функции, но мы не передаем здесь числа в качестве параметра. А строковое значение, по которому будет возвращена дата, vba работает с датами.
День: получает значение текущего дня (если параметр «дата» не указан) или для определенной даты.
Год: получает значение текущего года (если параметр «дата» не указан) или для определенной даты.
Месяц: получает значение текущего месяца (если параметр «дата» не указан) или для определенной даты.
Weekday (date) — получает значение текущей недели (если параметр «date» отсутствует) или для определенной даты.
Hour (время) — получает текущее значение часа (если параметр «время» отсутствует) или для определенного времени, даты и времени vba.
Минута: получает текущее значение минут (если параметр «время» отсутствует) или за определенное время.
Секунда (время): получает текущее значение в секундах (если параметр «время» отсутствует) или за указанное время.
Timer () — удобная функция для определения количества времени, необходимого для выполнения заданного блока кода. Сама функция возвращает целое число секунд, прошедших с полуночи.
Дополнительные сведения: режим разработчика Excel 2020
TimeSerial (часы, минуты, секунды): получает время, указанное тремя параметрами
TimeValue (строка): работает аналогично предыдущей функции, но для получения времени передается не целочисленное значение, а строка.
MonthName (числовое значение) — функция VBA позволяет получить название месяца, в качестве параметра мы указываем номер месяца.
WeekDay (date) — set возвращает название месяца буквами в зависимости от его номера. Возвращаемое значение зависит от языкового стандарта. Если они русские, будет возвращено русское название месяца.
В дополнение к указанным выше функциям даты и времени vba вы можете использовать следующие варианты:
Дата: установка системной даты
Время: установите системное время.
Функции даты и времени vba в указанном выше языке используют параметр «interval», который может принимать следующие значения:
VBA функции форматирование данных
Для форматирования данных в VBA используется функция Format, которая позволяет формировать данные любого встроенного типа по заданному шаблону. Общий синтаксис функции форматирования:
Формат (Выражение, «формат», [первы]й день недели, [первая недел[я года]]) — здесь параметр «выражение» — любое допустимое значение. Формат — необязательный параметр, указывающий формат данных, должен быть заключен в кавычки. Два других параметра также являются необязательными и задают первый день недели и первую неделю года.
Параметр формата может принимать следующие значения:
- Общее число — это числовое значение без выделения тысяч позиций, например 12150,2003
- Валюта — формат валюты, присваиваются тысячные и два десятичных знака, например 255,33 рубля.
- Исправлено: числовое значение без разделения тысяч разрядов и двух десятичных знаков, например 22439.12.
- Стандарт: числовое значение, умноженное на 100, оставляя два десятичных знака и символ процента, например 55,63%.
- Научный: числовой формат для научных вычислений, например 5.23E + 03
- Да / Нет: этот параметр определяет, что функция вернет «Да», если форматированное выражение содержит строку «Нет» или ненулевое значение, и «Нет» в противном случае.
- True / False — аналогично предыдущему параметру, но для строк «True» и «False”.
- Вкл / Выкл — для линий типа «Вкл» и «Выкл”.
- Общая дата: форматирование выражения в соответствии с установленными стандартами даты и времени, например 10.11.02 12:25:50
- Длинная дата — отображает полный формат даты, в зависимости от настроек в системе, например 10 октября 2013 года, функция даты vba.
- Средняя дата: формат средней даты, например 10-окт-13.
- Краткая дата — вывод в кратком формате даты, например 10.10.13.
- Long Time — вывод в формате времени (часы, минуты, секунды), например 12:20:40.
- Среднее время: 12-часовой формат времени (часы, минуты), например 05:30.
- Краткое время: 24-часовой формат времени (часы, минуты), например 17:30.
excel vba разница дат
Я пытаюсь понять разницу между системной датой и датой, хранящейся на листе. Если разница между ними> 30 дней, результат будет истинным, иначе результат будет ложным
Как узнать разницу в днях между системной датой и датой, хранящейся на листе? Дата на листе также может быть более ранней датой.
Интересно, почему я редко вижу людей, использующих функции даты.
Вы также можете использовать это:
в этом случае date1 будет CDate (Worksheets («date»). Cells (1,1)), а date2 будет sdate (с CDate или dim’d в качестве даты, как сказал Джефф.
«D» означает разницу в днях. Вот несколько лет, месяцев и так далее в VBA:
s Дата — STRING, а это не настоящая дата!
Преобразуйте строку в дату, используя функцию CDate () или функцию DateValue().
Однако есть предостережение в отношении этого преобразования. Эти преобразования будут управлять следующими структурами:
Они не будут правильно преобразованы
И избегайте использования двузначного года.
Я бы предложил использовать функцию DateSerial () для преобразования даты.
Итак, что касается вашего кода, предполагая, что значения на вашем листе являются фактическими датами (просто выберите столбец и измените числовой формат на ОБЩИЙ, чтобы быть уверенным. Если это реальные даты, для каждого будет отображаться ЧИСТЫЙ НОМЕР. Нажмите ОТМЕНА, чтобы получить даты формата).
Я пишу процедуру vba в Excel для хранения всех значений дат между двумя датами в массиве измерений, а затем проверяю каждое значение в диапазоне на другом листе.
Моя проблема в том, что когда код фиксирует значения даты (как целое число (или двойное — любое значение, которое он фактически использует)), он сохраняет значение на 1462 больше, чем значение даты в листе.
Я использую систему дат 1904 года, поэтому могу использовать отрицательное время, и я нахожусь в Австралии, поэтому даты указаны в формате дд / мм / гггг.
На листе: 01.01.2009 = 42004
В коде: 01.01.2009 = 43466
Я понимаю, что разница такая же, как и разница между значениями даты при использовании систем дат 1900 и 1904, что наводит меня на мысль, что, возможно, VBA автоматически устанавливает значение рабочего листа на 1900 и преобразует значение 1904 года при выполнении кода?
Чтобы узнать больше: прогнозируйте значения в Excel
Эта книга настроена следующим образом:
Sheet1 содержит даты с 01.01.2009 по 25.01.2009 в диапазоне («A1: A25») .
Sheet2 содержит 01.01.2009 в ячейке A1 и 01.10.2009 в ячейке A2 и команду командной кнопки .
Вывод значений ячеек в столбцах 3 и 4 выглядит следующим образом (первые 5 строк для демонстрации):
Даты записываются в ячейку в виде краткого формата даты, а не в виде числового значения.
Используя окно запугивания, я заметил? Согласно значениям в Sheet1, это должно быть 42034 .
Проблема вызвана типом данных или функцией, которые я использовал, или как указано выше: преобразует ли лист их в 1904, когда значения назначаются Sheet2 с помощью VBA, это ошибка в Excel или что-то в этом роде?
Я нашел вопрос с той же проблемой здесь, на mrexcel, однако в этом случае было принято решение изменить Excel для использования системы дат 1900 или вычесть 1462 из значений в коде, чего я надеюсь избежать обоих.
2 ответа
5 Решение Витята [2019-01-31 16:44:00]
В целом система дат в VBA отличается от системы дат в Excel. У вас могут быть 3 варианта системы дат:
- Дата в Excel
- Дата в Excel 1904 г
- Дата VBA
Вот в чем разница:
Даты конвертируются в числа. Например, каждая дата преобразуется в число, но начальное число немного отличается.
- Excel преобразует 1 в 01 января 1900 г;
- В VBA 1 конвертируется в 31 декабря 1899 г;
- В Excel с 1904 года 1 конвертируется в 2 января 1904 г.;
Система 1904 (или ее отсутствие) устанавливается для каждой рабочей папки. Таким образом, если у вас есть две книги в Excel, одна 1904 года, а другая нет, программа распознает их соответственно. Система установлена в:
Файл> Параметры> Дополнительно> Использовать систему дат 1904
В общем, если есть вероятность, что кто-то каким-то образом изменяет вашу книгу с использованием неправильной системы, подумайте о добавлении этой проверки при открытии книги:
Если вам интересно, какую систему выбрать, я могу посоветовать вам никогда не использовать 1904.
Чтобы предоставить решение для моего примера, упомянутого коллегой, если вы уменьшите значения даты, такие как проблемы типа данных даты со значениями, возникает рабочий лист UVA, рабочий лист исчезает.