Страницы: 1
RSS
Найти максимум, отвечающий условию, и извлечь данные из этой строки., Удаление по критериям
 

Здравствуйте!

Primer.xlsx (10 КБ) Помогите, пожалуйста решить проблему. Есть таблица с семью столбцами, в третьем столбце, который называется «PROD_ID» есть повторяющиеся значения и их нужно удалить, но остаться должно, то значение, у которого во втором столбце «TIM_ID» значение наибольшее. Например, из всех строк со значением «PROD_ID» =1 должна остаться строка в которой «TIM_ID» =2080

 
Формула массива (для второй строки)
Код
{=МАКС(ЕСЛИ($C$2:$C$42=$C2;$B$2:$B$42;""))=$B2}
вернет ИСТИНА в случае, когда в текущей строке находится больший из TIM_ID для соответствующего PROD_ID и ЛОЖЬ во всех прочих случаях.

Скопируйте ее во все строки таблицы, затем отсортируйте таблицу по новому столбцу или используйте автофильтр - и удаляйте лишние строки...
 
Макрос
Код
Sub Povtor()
Dim i As Long
Dim iLastRow As Long
 iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
  For i = iLastRow To 2 Step -1
    If Cells(i - 1, 3) = Cells(i, 3) Then Rows(i - 1).Delete
  Next
End Sub
 

Спасибо !!!

 

Видно рано радовался  :)

Первый пример просто выдаёт только одно единственное значение ИСТИНА в строке в которой TIM_ID наибольшее, то есть независимо от значения столбца PROD_ID

Макрос работает отлично, но только на том примере, который я выслал, стоит задать его в таблице, в которой более 150000 строк, комп зависает конкретно и на долго…

 
Формула массива для доп. столбца:
=ЕСЛИ(МАКС(ЕСЛИ($D$2:$D$42=D2;$C$2:$C$42))=C2;СТРОКА();"")
Вводить тремя клавишами Ctrl+Shift+Enter. Если введете правильно, формула обернётся фигурными скобками { }.
Для извлечения значений формула:
=ЕСЛИОШИБКА(ВПР(НАИМЕНЬШИЙ($A:$A;СТРОКА()-1);$A:$H;СТОЛБЕЦ()-8);"")
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Ещё один вариант в приложении
 
Цитата
Teo написал:
Первый пример просто выдаёт только одно единственное значение ИСТИНА в строке в которой TIM_ID наибольшее, то есть независимо от значения столбца PROD_ID
Попробуйте скопировать формулу в любую свободную ячейку второй строки => затем ввести ее при помощи трех клавиш => и лишь затем скопировать ее на весь диапазон своей таблицы...
В том случае, если вы вставляете ее сразу же в несколько ячеек какого-либо столбца, то формула будет некорректно работать...

На 15 тысячах строк формулы массива также могут работать достаточно долго.
Однако, если Ваша таблица отсортирована по возрастанию PROD_ID, а затем по возрастанию TIM_ID, то во всех случаях Вы ищите строку последнего вхождения PROD_ID
А его можно найти и без медленной формулы массива, например с помощью:
Код
=ПРОСМОТР(2;1/($C$2:$C$42=$C2);$B$2:$B$42)=$B2
Или же еще более простой формулой (дл второй строки => копировать во все ячейки, кроме последней):
Код
=C3<>C2
:)
Изменено: IKor - 14.11.2017 18:34:11
 
Цитата
стоит задать его в таблице, в которой более 150000 строк, комп зависает конкретно и на долго…
А пробовали в начале макроса вставить
Код
Application.ScreenUpdating = False
а в конце
Код
Application.ScreenUpdating = True


 

=C3<>C2 О чудо  :) Всё было так просто оказывается :)

Всем огромнейшее человеческое спасибо!!! Вы меня очень выручили!

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

 
Название темы ни о чём, а помощь оказывается...
 
Цитата
Teo написал:
О чудо  
Теперь Ваша очередь сотворить чудо и предложить нормальное название.
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Юрий М, предлагаю название:
Найти максимум отвечающий условию и извлечь данные из этой строки.
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Teo, в следующий раз САМИ давайте темам адекватные названия.
 

Наверно так правильней будет, не знаю, по сути, получилось отфильтровать один столбец по условиям другого столбца

Страницы: 1
Наверх