Сравнение дат Vba Excel

Обновлено: 02.12.2024

Этот форум перенесен в раздел вопросов и ответов Майкрософт. Посетите Microsoft Q&A, чтобы публиковать новые вопросы.

Вопрос:

Вопрос

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

Я не хочу утомлять людей ненужными подробностями об остальном коде, но я постараюсь подробно рассказать о той части кода, с которой у меня возникли проблемы. На рабочем листе будут указаны действия, которые нужно выполнить в ячейке, целевая дата завершения, дата закрытия, когда оно было фактически завершено, и статус действия. Что я хочу сделать с кодом, так это сравнить целевую дату с сегодняшней датой, и если она больше сегодняшней даты, статус будет поздним, если целевая дата меньше сегодняшней даты и нет даты закрытия, статус выйдет как открытое, и, наконец, если есть дата закрытия, и она меньше или равна целевой дате, статус будет закрыт. Вставка даты в ячейки - день/месяц/год. Вот часть кода, с которым я пытаюсь это сделать, с соответствующими переменными. Будем признательны за любую помощь.

Dim Status As String
Dim TargetDate As Date
Dim TodaysDate As Date
Dim ClosureDate As Date
Dim i As Integer
Dim j As Integer
Dim k As Integer
Set sh2 = ActiveWorkbook.Sheets("RAIL")
row1 = sh2.Range("H" & Rows.Count).End(xlUp).row
row2 = sh2.Range("C" & Rows.Count).End(xlUp).row
row3 = sh2.Range("F" & Rows.Count).End(xlUp).row
row4 = sh2.Range("G" & Rows.Count).End(xlUp).row
TodaysDate = Date
For i = 7 To row3
For j = 7 To row1
>For k = 7 To row4
TargetDate = sh2.Cells(i, 6).Value
ClosureDate = sh2.Cells(k, 7).Value
Status = LCase(sh2.Cells (j, 8).Value)
If ClosureDate = "" & TargetDate > TodaysDate Then
Status = "open"
ElseIf TargetDate TargetDate Then
Status = "late"
иначееслидата закрытия

Все ответы

Я не смотрел ваш код, так как ваш подход может нуждаться в доработке.

Текущий:
Сравните целевую дату с сегодняшней датой.
если она больше сегодняшней даты, статус будет поздним,
если целевая дата меньше сегодняшней даты и нет даты закрытия, статус будет открыт
если есть дата закрытия, и она меньше или равна целевой дате, статус будет закрыт

Должно быть:
Сравнить даты в этом порядке.
если есть дата закрытия, статус будет закрытым,
если целевая дата больше, чем сегодняшняя дата, статус будет открытым,
иначе, статус будет поздним

'---
Джим Коун
Портленд, Орегон, США

Спасибо за предложение, вот мои проблемы.

Я не просто хочу, чтобы он был закрыт, если есть значение даты закрытия. Если дата закрытия больше, чем целевая дата, я все равно хотел бы, чтобы она заявляла, что она опоздала. Вот почему у меня есть дополнительные условия в моих операторах if, а для статуса «закрыто» у меня есть, если дата закрытия меньше или равна целевой дате. Я понимаю, что вы имеете в виду под порядком, и это на самом деле похоже на то, на что я его изменил, но независимо от порядка это не работает. Вот моя текущая кодировка, пожалуйста, просмотрите ее и дайте мне знать, что я могу изменить в ней. Возможно, я неправильно использую встроенные операторы for.

Для i = 7 до строки 1
Для j = 7 до строки 4
Для k = 7 до строки 3
TargetDate = sh2.Cells(k, 6).Value
ClosureDate = sh2.Cells(j, 7).Value
Status = LCase(sh2.Cells(i, 8).Value)
If ClosureDate = "" And TargetDate > Date Then
Status = "open"
ElseIf ClosureDate TargetDate Then
Status = "late"
End If
Next k
Next j
Next i

"Не работает" не очень полезно. «Моя машина не работает» может означать, что в ней закончился бензин или вы потеряли ключи от машины.

Похоже, вашим петлям нужно указать, в каком направлении петлять.
Excel автоматически переходит от малого числа к большему (по одной единице за раз).
Если вы выполняете цикл от большого числа к меньшему, вам необходимо предоставить инструкции.

Для i = 7 до row1
должно быть
Для i = 7 до row1 шаг -1
(или шаг -2, если вы хотите пропустить каждую вторую строку)

То же самое для других циклов.
Если вы выполняете цикл от большого к меньшему без индикатора шага, Excel выходит из цикла.

Зачем нужно встраивать оператор For? Можете ли вы просто перебрать строки Целевой даты и выполнить сравнение?

Извините, я не был описательным. Он буквально пропускает эту часть кода. У меня есть другая часть кода, которая меняет цвет строки в зависимости от компании, которая должна выполнить действие.Когда я запускаю код, изменение цвета работает, но оно пропускает код, который я пытаюсь использовать для сравнения дат. Я не получаю никаких ошибок. Это должно быть то, что вы говорите, это выход из цикла, спасибо.

Спасибо за ответ, Джеки.

Причина, по которой я пытался использовать встроенный цикл for, заключалась в том, что я установил каждую из строк row1, row3 и row4 равными диапазону в разных столбцах, чтобы он проверял каждый столбец. Оглядываясь назад, может быть, мне следовало использовать другой термин для определения диапазонов в столбцах, лол, использование строки кажется немного запутанным.

Я попробовал ваш код, используя только одну из переменных строки, и он действительно работал для меня, но он проверял только один столбец и отображал только статус закрытия или опоздания, и это не всегда приводило к тому, что я хотел для условий. Есть ли способ объединить эти диапазоны в разных столбцах в одну переменную или способ указать все из них (row1, row3 и row4) в цикле for без встраивания? Я думаю, что это будет работать так, как я хочу, если есть способ сделать это.

Я извиняюсь, если мои описания не очень хороши или если я не полностью понимаю ответы, я все еще осваиваю VBA. Я ценю любую помощь.

Чтобы помочь мне узнать больше о кодировании, я хотел спросить, почему вы добавили последнюю строку:

ш2 . Ячейки (i, 8). Значение = статус

Что это делает? Это похоже на предыдущую часть кода ( Status = LCase ( sh2 . Cells ( i , 8 ). Value )), но я не уверен, что делает добавление последней строки, не могли бы вы объяснить мне это, чтобы я мог лучше понятно?

чтобы установить в ячейке "Статус" одно из значений "открыто"/"поздно"/"закрыто".

Может быть, это не так?

Извините, я не могу полностью понять ваше требование. Не могли бы вы поделиться своим примером файла Excel, он не обязательно должен быть вашим полным, если он содержит несколько строк данных.

Да, это то, что я хочу, чтобы код делал. Без этой строки ничего не получится, спасибо.

Я экспериментировал с кодом, пытаясь заставить его работать так, как я хочу. Я удалил некоторые условия и попытался использовать отдельные циклы for для каждого результата статуса. Однако я могу заставить открытый статус работать только вместе с поздним или закрытым статусом. По какой-то причине я не могу заставить одновременно работать статус «закрыто» и «поздно», и тот, который работает, появляется тогда, когда должен работать другой.

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

Excel VBA, работа с датами, сравнение, сложение, вычитание…

Если вы работаете с датами в таблицах Excel, вам необходимо понимать объект даты. Используя объект даты, вы можете легко обрабатывать даты на листах Excel. Вы можете сравнивать даты, чтобы увидеть, какая из них более поздняя, ​​вы можете добавлять и вычитать определенное количество дней, месяцев, лет до определенной даты. Вы можете получить текущую дату….

Вы можете скачать коды и файлы, относящиеся к этой статье, здесь.
Перейти к:

DateSerial(), создание объектов даты из значений года, месяца и дня:

С помощью функции DateSerial() вы можете создать объект даты, указав в качестве входных данных год, месяц и день. Следующий код создает объект даты для даты 5 апреля 2014 г. и печатает его в ячейке A2:

Sub Example1()

Dim objDate As Date
'год, месяц, день
objDate = DateSerial(2014, 4, 5)

'выводит результат в ячейку A1
Cells(2, 1) = objDate
End Sub

CDate(), создание (преобразование) объектов даты из строк:

С помощью функции CDate вы можете преобразовать строковое выражение в объект Date. Приведенный ниже код преобразует строковое выражение «01.01.2013» в объект Date и печатает результаты в ячейке B2:

Sub Example2()

Dim objDate As Date
'Строковое выражение
objDate = CDate("1/1/2013")

'выводит результат в ячейку B2
Cells(2, 2) = objDate
End Sub

IsDate(), проверка, является ли строка выражением даты:

Если входной аргумент функции CDate() не является выражением даты, вы получите исключение. Чтобы проверить, является ли строка допустимым выражением даты, вы можете использовать функцию IsDate(). Приведенный ниже код проверяет две строки «Не дата» и «02.03.2012», определяет, какая из них является строковым выражением, и печатает дату в ячейке C2:

Sub Example3()
Dim objDate As Date
Dim strNotDate As String
Dim strDate As String

strNotDate = "Not a Date"
strDate = "3/2/2012"

If IsDate(strNotDate) = True Then
'если это действительное выражение даты, напечатайте результаты в ячейке C2
Cells(2, 3) = strNotDate
Else
'если это не выражение даты показать окно сообщения
MsgBox ("Следующая строка" + vbCr + """" + strNotDate _
+ """" + vbCr + "не является допустимым выражением даты")

End If

If IsDate(strDate) = True Then
Cells(2, 3) = strDate
Else
MsgBox ("Следующая строка" + vbCr + """" + strDate + """" _
+ vbCr + "не является допустимым выражением даты" )
End If

End Sub

Сравнение дат, последних, старых…

После того как вы создали объект даты, вы можете сравнить их, используя арифметические операторы , =, чтобы увидеть, являются ли они одинаковыми или более поздними... Следующий код берет два выражения даты из ячеек E2 и E3. Проверяет, являются ли они допустимыми выражениями даты, и печатает самое последнее из них в ячейке E4:

Sub Example4()
Затемнить objDate1 как дату
Затемнить objDate2 как дату

If IsDate(Cells(2, 5)) = True Then
objDate1 = CDate(Cells(2, 5))
Else
MsgBox ("Неверный ввод")
Exit Sub
End If

If IsDate(Cells( 3, 5)) = True Then
objDate2 = CDate(Cells(3, 5))
Else
MsgBox ("Неверный ввод")
Exit Sub
End Если

'Обратите внимание, что меньшая дата находится дальше в прошлом,
'там для более крупной даты будет недавняя
If objDate1 Then
Cells(4, 5) = objDate2
Еще
Ячейки (4, 5) = objDate1
Конец, если

Конец подпункта

Получение значений года, месяца и дня из объекта даты:

Используя функции Year(), Month(), Day(), вы можете получить значения года, месяца и дня для объекта даты. В следующем примере используется выражение даты в ячейке G2 и печатаются значения года, месяца и дня в ячейках G3, G4 и G5 соответственно:

Sub Example5()
Затемнить objDate как дату

If IsDate(Cells(2, 7)) = True Then
objDate = CDate(Cells(2, 7) )
Else
MsgBox ("Invalid Input")
Exit Sub
End If

'печатает год в ячейке G3
Cells( 3, 7) = Year(objDate)
'выводит месяц в ячейке G4
Cells(4, 7) = Month(objDate)
'выводит день в ячейке G5
Cells(5, 7) = Day(objDate)

End Sub

Добавление и вычитание лет, месяцев и дней из дат:

С помощью функции DateSerial() вы можете добавлять годы, месяцы и дни к объекту даты. Код ниже извлекает дату в ячейке F2, добавляет к ней 3 года, 2 месяца и 5 дней и печатает результат в ячейке F3:

Sub Example6()
'входной объект даты
Dim objDate As Date
'новый объект даты
Dim objNewDate As Date
'значение года в объект ввода даты
Dim intYear As Integer
'значение месяца в объекте ввода даты
Dim intMonth As Integer
'значение дня в объекте ввода даты
Dim intDay As Integer

If IsDate(Cells(2, 9)) = True Then
objDate = CDate(Cells(2, 9))
Else
MsgBox ("Недопустимый ввод")
Exit Sub
End If

intYear = Year(objDate)
intMonth = Month(objDate)
intDay = Day( objDate)

'создать новый объект даты с +3 года, +2 месяца и +5 дней
objNewDate = DateSerial(intYear + 3, intMonth + 2, intDay + 5)
/>
Cells(3, 9) = objNewDate

End Sub

Дата(), получение текущей даты:

Функция Date() возвращает текущую дату на основе календаря компьютера:

Sub Example7()
Dim objDate As Date

'получает текущую дату на основе календаря компьютера
objDate = Date
MsgBox (objDate)
Конец подписки

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

Функции Excel, формулы, диаграммы, форматирование, создание информационной панели Excel и др.

Что такое сравнение дат в Excel?

Когда вам нужно сравнить два значения даты, представленные в двух разных столбцах, на равенство или вам нужно проверить, больше или меньше даты из другого столбца, такие сценарии можно рассматривать как те, которые вы можете вызвать сценарии сравнения дат. Это также варьируется от ситуации к ситуации (для чего мы используем условный оператор IF). Давайте посмотрим на некоторые примеры, в которых мы сравниваем даты и получаем полезную информацию для лучшего понимания темы.

Примеры сравнения дат в Excel

Давайте обсудим сравнение дат в Excel с некоторыми примерами.

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

Шаг 1. Создайте формулу в ячейке C2, введя знак равенства, как показано ниже:

Шаг 2. Поскольку мы хотели проверить, совпадают ли значения даты между ячейками A2 и B2, мы можем сделать это, используя простейший из всех операторов сравнения с именем «равно». При использовании «A2 = B2» в ячейке C2 после начального оператора равенства.

Все в одном пакете Excel VBA (более 120 курсов) Более 120 онлайн-курсов | 500+ часов | Поддающиеся проверке сертификаты | Пожизненный доступ
4,9 (2356 оценок)

Формула в ячейке C2 проверяет, совпадают ли значения в ячейках A2 и B2 друг с другом. Если значения совпадают, он вернет логический вывод как TRUE. Если значения не совпадают, он вернет логический вывод как FALSE.

Шаг 3. Формула готова. нажмите клавишу Enter и перетащите формулу по ячейкам, чтобы увидеть вывод формулы. Вы можете перетащить формулу с помощью сочетания клавиш Ctrl + D. Однако для этого вам нужно выбрать все ячейки в столбце C от C2 до C11.

Вы можете видеть, что для тех ячеек, в которых значения дат совпадают друг с другом, система генерирует логический вывод как «ИСТИНА», а для ячеек, в которых значения дат не совпадают, она генерирует вывод как «ЛОЖЬ».< /p>

Если вы заметили, ячейка C выдает значение TRUE. Даже если значения из ячеек A2 и B2 не совпадают невооруженным глазом. На самом деле оба значения одинаковы. Это просто разница в формате. Значения даты хранятся в течение нескольких дней с исходной даты 01-01-1900 в Excel. Таким образом, 43943 — это не что иное, как разница в количестве дней для даты 22-04-2020 от исходной даты. Вот почему они подходят друг другу.

Теперь мы сделаем еще один шаг и проверим, больше или меньше значения дат из одного столбца, чем значения дат из другого столбца. Это можно сделать с помощью «Больше чем» («>») и «Меньше чем» («B2». Ну, как говорит сама формула, это проверит, больше ли значение даты в ячейке A2, чем значение даты в ячейке B2. или нет. Если это так, система сгенерирует логический вывод как TRUE. Если это не так, система сгенерирует логический вывод как FALSE.

Перетащите формулу по строкам, чтобы получить результат для всех ячеек в столбце C.

Аналогичным образом вы можете проверить, меньше ли значения даты из столбца A, чем в столбце B. Все, что вам нужно сделать, это заменить оператор "больше" (">") на "меньше" ("Подробнее

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

Как сравнить две даты в Excel?

Ниже приведены несколько примеров сравнения двух дат в Excel.

Сравнить дату с другой или нет просто; у нас будет две даты, и нам нужно проверить, равна ли эта дата ячейки другой или нет.

Следуйте инструкциям, чтобы сравнить две даты в Excel.

    Посмотрите на приведенные ниже данные, чтобы сравнить даты в Excel.


У нас одна и та же дата в обоих столбцах, поэтому в результате мы получили ИСТИНА.

Итак, везде, где данные совпадают, мы получаем результат ИСТИНА, а когда данные не совпадают, мы получаем результат ЛОЖЬ.

Одним интересным фактом об этом примере является строка номер 7; в этой строке первая дата записывается как «29 октября 2019», а вторая дата записывается как 43767. Несмотря на то, что обе они разные, результат все равно ИСТИНА, т. е. обе одинаковы.

Причина, по которой я указал дату и время в Excel в самом начале, связана с таким сценарием в Excel. Когда мы применим формат даты «ДД-МММ-ГГГГ» к серийному номеру 43767, мы получим тот же результат, что и ячейка A7.

Итак, Excel читает их как серийные номера, а не как даты. Таким образом, мы можем сравнить две даты в Excel.

Теперь предположим, что вы не хотите видеть результаты по умолчанию ИСТИНА или ЛОЖЬ, а можете захотеть получить другой результат, например «Обе верны», если обе даты совпадают, или же вам нужен результат, например «Обе верны». Не верно." Итак, это делается с помощью логической функции «ЕСЛИ».

  • Откройте функцию ЕСЛИ в Excel. Функция ЕСЛИ в Excel Функция ЕСЛИ в Excel оценивает, выполняется ли заданное условие, и возвращает значение в зависимости от того, является ли результат «истинным» или «ложным». Это условная функция Excel, которая возвращает результат на основе выполнения или невыполнения заданных критериев. Подробнее читайте в столбце «ПОИСКПОЗ».
  • Первый критерий формулы — это логическая проверка в excelЛогическая проверка в ExcelЛогическая проверка в Excel приводит к аналитическому результату, истинному или ложному. Оператор равенства «=» является наиболее часто используемой логической проверкой. Читать дальше, поэтому в данном случае наша логическая проверка состоит в том, чтобы проверить, равна ли «Дата 1» «Дате 2» или нет, поэтому примените логическую проверку. проверить как E2 = F2.
  • Следующим аргументом является значение, если оно истинно; это ничего, если применяемый логический тест ИСТИНЕН, т. е. если «Дата 1» равна «Дате 2», какое значение необходимо? Итак, нам нужно значение «Оба варианта верны».
  • Следующим аргументом является значение, если оно ложно, поэтому, если логическая проверка неверна, то какое значение необходимо? Нам нужны значения как «Оба неверны».

Хорошо, мы закончили с формулой; закройте скобку и нажмите клавишу ввода, чтобы получить результат.

Перетащите формулу в другие ячейки.

Итак, результаты здесь, а не по умолчанию TRUE или FALSE.

Мы видели один набор вычислений; теперь мы увидим, является ли одна дата больше или меньше другой даты. Для этого взгляните на приведенный ниже пример данных.

Сначала мы проверим, что «Дата 1» больше, чем «Дата 2», или нет следующим образом.

Ну вот, у нас есть результаты.

Так мы можем сравнивать даты в Excel. Однако при этом нужно помнить об определенных вещах.

Что нужно помнить

  • Дата хранится в виде порядкового номера, поэтому ее необходимо знать.
  • В таких случаях дата ситуации хранится в виде текстового значения, значения, выглядящие как дата, не являются датами, поэтому вам необходимо преобразовать их в дату.

Рекомендуемые статьи

Это руководство по сравнению дат в Excel. Здесь мы обсудим, как сравнивать даты в Excel, чтобы узнать, равна ли дата, больше или меньше других дат. Вы можете узнать больше из следующих статей –

Читайте также: