#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 Обновлено с помощью цикла строк.