Как я могу создать цикл для получения двух последних дат в диапазоне ячеек в строке

#excel #vba

#excel #vba

Вопрос:

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

Вот последняя вещь, которую я пытался повторить и найти две последние даты.

 For Each cell In Range("Q2:Q1000")
        If cell.Value < cell.Offset(0, 3).Value Or cell.Offset(0, 
        6).Value Or 
        cell.Offset(0, 9).Value Or cell.Offset(0, 12).Value Or 
         cell.Offset(0,15).Value Then
       cell.ClearContents
       End If

       If cell = "" Then
       cell.Offset(, -1) = ""
       cell.Offset(, -2) = ""
       End If




Here is the code to find out if contents is more than 2 years old.



For Each cell In Range("Q2:Q1000")
        If cell.Value < (currentDate - 730) Then
        cell.ClearContents

       End If


       If cell = "" Then
       cell.Offset(, -1) = ""
       cell.Offset(, -2) = ""
       End If

Next
  

Я думаю, что мне не хватает чего-то простого, но я не могу его найти.

Комментарии:

1. Вы пробовали Max функцию, чтобы найти самую большую (самую раннюю) дату?

2. Вы должны написать If cell.Value < cell.Offset(0, 3).Value Or cell.Value < cell.Offset(0, 6).Value и т. Д.

Ответ №1:

Вот метод очистки всех ячеек с датами старше двух самых последних дат. Предполагается, что ваши значения в Range("Q2:Q1000") правильно отформатированных Date ячейках:

 Dim cel as Range

For CurRow = 2 to 1000
    'Find the 2nd most recent date:
    BeforeDate = Application.WorksheetFunction.Large(Range("Q" amp; CurRow amp; ",T" amp; CurRow amp; ",W" amp; CurRow amp; ",Z" amp; CurRow amp; ",AC" amp; CurRow amp; ",AF" amp; CurRow),2)

    For Each cel In Range("Q" amp; CurRow amp; ",T" amp; CurRow amp; ",W" amp; CurRow amp; ",Z" amp; CurRow amp; ",AC" amp; CurRow amp; ",AF" amp; CurRow)
        If cel.Value < BeforeDate Then
            cel.ClearContents
            cel.Offset(, -1) = ""
            cel.Offset(, -2) = ""
        End If
    Next cel
Next CurRow
  

Комментарии:

1. Это выглядит как возможное решение, за исключением того, что, похоже, я, возможно, не предоставил достаточно информации по этой проблеме. Предыдущая дата выглядит великолепно, но диапазон, который я сравниваю, находится в диапазоне («Q2, T2, W2, Z2, AC2, AF2»). Затем то же сравнение тех же столбцов на одну строку вниз до 1000 строк. Как будет выглядеть этот цикл при запуске этого кода, начинающегося с диапазона Q2, T2, W2, Z2, AC2, AF2, затем тех же столбцов в строке 3 и так далее?

2. Решение сработало, когда я использовал следующий код, но только для этой строки необходимо выполнить цикл по листу до строки 1000. Dim cel Как диапазон ‘Найдите 2-ю самую последнюю дату: BeforeDate= Application. WorksheetFunction. Большой (диапазон («Q2, T2, W2, Z2, AC2, AF2»), 2) Для каждого cel в диапазоне («Q2, T2, W2, Z2, AC2, AF2») Если cel.Value < BeforeDate, то cel. ClearContents чел. Смещение (, -1) = «» чел. Смещение (, -2) = «» Конец, если следующий чел

3. @Mark Обновлено с помощью цикла строк.