Подтвердить что ты не робот

Преобразование текстовых результатов формулы массива в удобный формат

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

* Изменить - после прочтения этого снова я могу поочередно суммировать свой вопрос как: есть ли способ доступа к нескольким текстовым элементам из "результата массива формул", без индивидуального выбора (например: с помощью INDEX)?

Примеры, в которых работают формулы массива, где массив результатов - это числовые значения

(1) Пример 1: Предположим, что столбец Строки 1-500 представляют собой список идентификаторов продукта в формате xyz123, а в столбцах B строк 1-500 показаны общие продажи этого продукта. Если я хочу найти продажи для продукта с наивысшими объемами продаж, где последние 3 цифры ID превышают 400, я мог бы использовать Формулу массива, подобную так (подтвержденную CTRL + SHIFT + ENTER вместо просто ENTER):

=MAX(IF(VALUE(RIGHT(A1:A500,3))>400,B1:B500,""))

(2) Пример 2 Теперь предположим, что столбец B содержит имена продуктов, а не Sales. Теперь я хочу просто вернуть первое имя, которое соответствует критериям последних трех цифр идентификатора продуктa > 400. Это можно сделать следующим образом:

=INDEX(B1:B500,MIN(IF(VALUE(RIGHT(A1:A500,3))>400,ROW(A1:A500),"")))

Здесь я сделал небольшую манипуляцию, так что фактическая часть массива формулы [IF (RIGHT (A1: A500,3...) возвращает результат значения [ROWs cellsA1: A500, где последний 3 цифры выше 400], поэтому я могу использовать MIN для отображения только первого ROW #, который соответствует, и затем я могу использовать этот свернутый результат в регулярной функции INDEX.

(3) Пример 3. Для окончательного примера см. обсуждение аналогичного вопроса здесь. [Более подробно, чем приведенный ниже пример ниже, таким образом, который не имеет прямого отношения к этому вопросу]: qaru.site/info/500493/...

Предположим теперь, что вам нужен список всех наименований продуктов, где указаны последние 3 цифры идентификатора продуктa > 400. Насколько мне известно, это невозможно сделать ни в одной ячейке, это должно быть сделано путем размещения каждого отдельного результата в последующей ячейке. Следующая формула может быть помещена, например, в C1 и перетащена вниз на 10 строк, а затем отображать первые 10 наименований продуктов с идентификатором продукта, имеющим последние 3 цифры > 400.

=INDEX($B$1:$B$500,SMALL(IF(VALUE(RIGHT($A$1:$A$500,3))>400,ROW($A$1:$A$500),""),ROW()))

Пример, где формулы массива не будут работать, где массив результатов - текстовые значения

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

=CONCATENATE((IF(VALUE(RIGHT($A$1:$A$500,3))>400,ROW($B$1:$B$500),"")))

Итак, вопрос: кто-нибудь знает, как заставить эту последнюю формулу работать? Или, как получить формулу для работы, которая принимает массив текстовых результатов, и либо преобразует ее в "полезный диапазон" [так что она может быть вставлена ​​в Concatenate выше], либо может быть немедленно обработана текстовыми аргументами [например, в середине, поиск, замена и т.д.]? Прямо сейчас, единственный способ, который я могу увидеть, будет использовать пример 3 выше, а затем идти дальше и говорить, например, "Конкатенация" (C1, C2, C3... C10).

4b9b3361

Ответ 1

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

Пример:

Produce Name   Type
Apple          Fruit
Broccoli       Vegetable
Carrot         Vegetable
Orange         Fruit

Скажите, что вы хотите, чтобы одна ячейка отображала все результаты Fruit. Вы можете использовать другой столбец для размещения этой формулы. Вы позже будете скрывать столбец, поэтому позвольте использовать один из них, например столбец Z. Мы также хотим легко изменить то, что вы ищете, поэтому мы поставим условие в ячейку D2. В ячейке Z2 и скопированной вниз вы должны использовать эту формулу:

=IF(B2=$D$2,IF(Z1="",A2,Z1&", "&A2),IF(Z1="","",Z1))

Это приведет к следующему:

Produce Name   Type              Search For   (other columns until you get to Z)      
Apple          Fruit             Fruit                                             Apple
Broccoli       Vegetable                                                           Apple
Carrot         Vegetable                                                           Apple
Orange         Fruit                                                               Apple, Orange

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

=Z5

Это приводит к следующему:

Produce Name   Type              Search For
Apple          Fruit             Fruit
Broccoli       Vegetable         Apple, Orange
Carrot         Vegetable
Orange         Fruit

Вы можете использовать динамический именованный диапазон вместо простого =Z5, чтобы убедиться, что вы всегда получаете последнюю ячейку в своем вспомогательном столбце, чтобы ваши данные могли расти или сокращаться, и вы все равно получите правильный результат. Но теперь вы можете изменить содержимое ячейки D2 с Fruit на Vegetable, и теперь ячейка результата отобразит Broccoli, Carrot. Надеюсь, что-то подобное можно адаптировать к вашим потребностям.

Ответ 2

Чтобы повторить другие ответы, я не нашел способ использовать функцию concatenate в массиве. Тем не менее, я нашел способ объединить "названия продуктов", используя только одну функцию массива и не так называемую "вспомогательную колонку". Хотя это довольно длинный и утомительный, я думаю, что это может добавить к обсуждению. Во-первых, если вы действительно собираетесь использовать такую ​​формулу для определенной цели или преодолеть конкретный барьер, ее можно легко использовать при копировании и вставке формулы (то есть на самом деле она относительно адаптируется). С другой стороны, если ваши интересы более любопытны, мой ответ может быть более банальным, чем вам может понравиться.

В моей симуляции вашей проблемы у меня также было два столбца, но сокращено количество строк до 40. Самый левый столбец ( "C" ) содержит последовательности из трех букв и трех чисел, а правый столбец ( "D" ) содержит случайные последовательности букв и цифр, которые имитируют ваши "названия продуктов".

Я использовал комбинацию вложенных функций замены и конкатенации. Функция ниже нарезается, чтобы сфокусироваться на "базовом блоке" агломерированной функции.

Базовый блок

REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),1)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),1))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),1)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),2)))=TRUE,"",

Вышеприведенная формула в основном рассматривает первое имя продукта с соответствующим идентификатором продукта с числовой последовательностью > 400, а затем заменяет его конкатенацией, учитывая, что существует другой продукт, удовлетворяющий тем же критериям идентификатора продукта. Это можно рассматривать как "накопительную" конкатенацию, начиная с самых внутренних скобок. Эта "базовая единица" формулы может быть повторена в произвольной степени. То есть, если вы считаете, что в списке есть от 200 до 280 продуктов, удовлетворяющих критериям идентификатора продукта, вы можете повторить этот базовый код 280 раз. Как вы видите, если формула пытается объединить имена продуктов, которых нет (у вас есть 280 базовых единиц формулы и всего 275 продуктов, удовлетворяющих критериям), формула автоматически завершается... в некотором смысле. Он фактически начинает конкатенировать ничего снова и снова, пока не будут приняты все базовые единицы. Результатом будут все желаемые названия продуктов, объединенные в одну ячейку, с периодом, разделяющим каждый.

Только одно число изменяется от базового блока до базового блока, а это k-й элемент массива SMALL. Эти переменные, очевидно, будут действовать на единицу в каждом базовом блоке. Для моего теста я использовал 14 базовых единиц.

Полная формула с 14 базовыми единицами

=REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),1)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),1))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),1)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),2)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),2)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),2))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),2)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),3)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),3)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),3))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),3)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),4)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),4)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),4))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),4)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),5)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),5)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),5))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),5)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),6)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),6)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),6))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),6)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),7)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),7)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),7))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),7)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),8)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),8)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),8))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),8)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),9)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),9)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),9))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),9)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),10)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),10)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),10))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),10)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),11)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),11)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),11))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),11)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),12)))=TRUE,"",**REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),12)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),12))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),12)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),13)))=TRUE,"",REPLACE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),13)),1,LEN(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),13))),CONCATENATE(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),13)),".",IF(ISERR(INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),14)))=TRUE,"",INDEX($D$1:$D$40,SMALL(IF(VALUE(RIGHT($C$1:$C$40,3))>400,ROW($D$1:$D$40),""),14)))))))))))))))))))))))))))))))))))))))))

Очевидно, что если вы посмотрите на всю формулу, она довольно неразборчива. Но, глядя на это с точки зрения базовых единиц, вы можете увидеть, как его можно легко построить, а затем скопировать и вставить (после написания исходного базового блока потребовалось около 2 минут, чтобы собрать все вместе).

Ответ 3

Это решение без VBA, использующее Get & Transform в Excel 2016 или надстройку Power Query для версий до:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    ExtractLast3Digits = Table.AddColumn(Source, "Value", each Text.End([ProductID],3)),
    ChangeToNumber = Table.TransformColumnTypes(ExtractLast3Digits,{{"Value", type number}}),
    FilterAbove400 = Table.SelectRows(ChangeToNumber, each [Value] > 400),
    Concatenate = Text.Combine(FilterAbove400[ProductName])
in
    Concatenate

Вы можете выполнять всевозможные манипуляции с текстом на "массиве-выходе" (шаг "FilterAbove400" ), в этом примере я просто конкатенирован без разделителей, поскольку я понял ваш запрос.

Он принимает ваши входные данные, которые должны быть в табличной форме и названы "Таблица1" на первом этапе (Источник).

Ссылка на файл с решением: https://www.dropbox.com/s/utsraj0bec5ewqk/SE_ConvertArrayFormulasTextResult.xlsx?dl=0

Ответ 4

Вы можете создать свою собственную агрегированную функцию для обработки результатов массива формул. Это требует немного VBA... но это не сложно. Это позволит вам выполнять все виды строковых манипуляций или численный анализ массивов значений.

Чтобы выполнить вашу функцию конкатенации, откройте окно кода VBA и создайте новый модуль, щелкнув правой кнопкой мыши по проекту → insert → new module. Дважды щелкните новый модуль и вставьте этот код, чтобы создать функцию, которая будет конкатенировать массив в одну большую строку:

Function ConcatenateArray(ParamArray Nums() As Variant) As Variant
Dim BigString As String
Dim N As Long
Dim A() As Variant
Let A = Nums(0)

BigString = ""
For N = LBound(A) To UBound(A)
    BigString = BigString & A(N, 1)
Next
ConcatenateArray = BigString

End Function

Затем измените формулу массива в ячейке на:

=ConcatenateArray(IF(VALUE(RIGHT($A$1:$A$500,3))>400,$A$1:$A$500,""))

Конечно, вам нужно нажать CTRL + SHIFT + ENTER вместо ENTER, чтобы подтвердить ячейку как формулу массива.

Ответ 5

Я постараюсь ответить на несколько вопросов, поднятых в этом сообщении:

как получить формулу для работы, которая принимает массив текстовых результатов и либо преобразует его в "полезный диапазон" [поэтому его можно подключить к Конкатенация выше],

Даже если первая часть этого вопроса возможна, последняя часть (т.е. "[так что она может быть вставлена ​​в Concatenate выше]" невозможна, поскольку функция CONCATENATE не принимает диапазоны в качестве аргумента.

или можно сразу манипулировать текстовыми аргументами (например, в середине, поиск, замена и т.д.]? Сейчас единственный способ, который я могу увидеть, следует использовать пример 3 выше, а затем идти дальше и говорить, для например, Concatenate (C1, C2, C3... C10).

Это конечно один метод, но попробуйте:

Начнем с этого:

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

Но сначала допустим следующее:

-. Диапазон данных находится в D10:F510 и включает в себя поля: Product, Product, Sales и Product Name (Selection) *

* используется для отображения результатов из формулы в примере 3

.- Данные содержат 23 записи, соответствующие критериям, определенным в примере 1 (см. рис .1)

.- Значение 400 вводится в ячейку E4 для облегчения внесения изменений в критерии вместо жесткого кода в формулах (см. рисунок 3).

Рис .1 Рисунок 1

Теперь, чтобы сгенерировать массив с конкатенированными результатами и опубликовать его в полезном диапазоне, примените незначительную модификацию формулы в примере 3. Введите FormulaArray в G11 и скопируйте до последней записи ( не только 10 строк)

=TRIM(CONCATENATE(
IF(ROW(G11)-ROW(G$11)+1=1,"",G10)," ",
IFERROR(INDEX($E$11:$E$510,
SMALL(IF(VALUE(RIGHT($D$11:$D$510,3))>$E$4,ROW($D$11:$D$510)-ROW($D$11)+1,""),
ROW(G11)-ROW(G$11)+1)),"")))

введите описание изображения здесь Рисунок 2

В разделе "Сводка", расположенном по адресу D4:E8, мы получаем результаты из примеров 1 и 2 и результаты Concatenated со списком выбранных продуктов (см. рисунок 3). Введите эту формулу в E8 (предложите увеличить высоту строки до максимума 409 и обернуть текст в true)

=INDEX($M$11:$M$510,1+MAX(ROW($M$11:$M$510))-ROW($D$11))

введите описание изображения здесь

рис. 3

Что касается этого вопроса:

Есть ли способ доступа к нескольким текстовым элементам из массива формул результат ', без индивидуального выбора (например: с помощью INDEX)?

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

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

Пример 2:

=INDEX(B1:B500,MIN(IF(VALUE(RIGHT(A1:A500,3))>400,ROW(A1:A500),"")))

Если диапазон данных не начинается с Row 1, используйте эту формулу:

=INDEX($E$11:$E$510,MIN(IF(VALUE(RIGHT($D$11:$D$510,3))>400,
1+ROW($D$11:$D$510)-ROW($D$11),"")))

Пример 3:

=INDEX($B$1:$B$500,SMALL(IF(VALUE(RIGHT($A$1:$A$500,3))>400,ROW($A$1:$A$500),""),ROW()))

Если диапазон данных не начинается с Row 1, используйте эту формулу:

=IFERROR(INDEX($E$11:$E$510,
SMALL(IF(VALUE(RIGHT($D$11:$D$510,3))>$E$4,
1+ROW($D$11:$D$510)-ROW($D$11),""),
1+ROW()-ROW($K$11))),"")