Вот итоговое решение задачи. Ни один из вариантов выше не выдал четкого решения. Я все же пришел к тому, что прорешал все сам и вывел нужные неравенства. На картинке ниже видны все варианты решения задачи при любом выбранном диапазоне дат, в течение которых нужно понимать, действовал тот или иной документ или нет.
Обозначения:
StY - год введения документа в действие - Start Year;
EndY - год отмены документа - End Year (если EndY=0, это значит, что даты отмены нет, документ действует до сих пор);
StP - год начала периода выборки - Start Period;
EndP - год окончания выборки End Period.
Тогда, после рассмотрения всех возможных ситуаций, после упрощения систем неравенств, логика будет как на картинке.
Ну а дальше - очень просто все это записать в код программы:
Код на удивление быстро работает, а для разового применения - вообще замечательно.
Главное - что все корректно определяется. Да, криво написано, да, ручками, да, может не сильно профессионально, но задача решена )))
Обозначения:
StY - год введения документа в действие - Start Year;
EndY - год отмены документа - End Year (если EndY=0, это значит, что даты отмены нет, документ действует до сих пор);
StP - год начала периода выборки - Start Period;
EndP - год окончания выборки End Period.
Тогда, после рассмотрения всех возможных ситуаций, после упрощения систем неравенств, логика будет как на картинке.
Ну а дальше - очень просто все это записать в код программы:
Код |
---|
Sub Exist_or_NO() Dim rows As Long, StY, EndY, StP, EndP As Integer 'Определим переменные rows = Cells(1, 1).End(xlDown).Row 'определим последнюю заполненную строку в таблице StP = ThisWorkbook.Worksheets("Реестр").Cells(2, 7) 'Берем из ячейки (2;G) на листе год начала периода отсева EndP = ThisWorkbook.Worksheets("Реестр").Cells(2, 8) 'Берем из ячейки (2;H) на листе год окончания периода отсева 'запускаем обработку For r = 5 To rows StY = Val(Right(ThisWorkbook.Worksheets("Реестр").Cells(r, 6), 4)) 'Из даты введения в действие (находится в столбце F) выдергиваем год EndY = Val(Right(ThisWorkbook.Worksheets("Реестр").Cells(r, 7), 4)) 'Из даты отмены (находится в столбце G) выдергиваем год. Если там пусто, то получаем ноль. 'проверяем все условия с картинки, в столбец "H" напротив каждого документа пишем, действовал он или нет в заданном периоде дат (между StP и EndP) If StY <= EndP And EndY = 0 Then ThisWorkbook.Worksheets("Реестр").Cells(r, 8) = "Действовал" If EndY >= StP And EndY <= EndP Then ThisWorkbook.Worksheets("Реестр").Cells(r, 8) = "Действовал" If StY <= EndP And EndY > EndP Then ThisWorkbook.Worksheets("Реестр").Cells(r, 8) = "Действовал" If StY > EndP Then ThisWorkbook.Worksheets("Реестр").Cells(r, 8) = "Не действовал" If EndY < StP And EndY <> 0 Then ThisWorkbook.Worksheets("Реестр").Cells(r, 8) = "Не действовал" Next r End sub |
Главное - что все корректно определяется. Да, криво написано, да, ручками, да, может не сильно профессионально, но задача решена )))