Если все, что вы хотите сделать, это получить подмножество массива, и вы уже знаете позиции элементов, которые вы хотите , вы можете просто использовать INDEX
с массивом для аргумента индекса.То есть:
=INDEX({11,22,33,44,55},{2,3,5})
возвращает {22,33,55}
.Но это, как правило, не очень полезно, потому что вы не знаете позиций, и я не знаю способа получить их без UDF.
Что я сделал для такого рода фильтрации массивов в рабочей таблице:написать UDF со следующей формой:
'Filters an input sequence based on a second "comb" sequence.
'Non-False-equivalent, non-error values in the comb represent the positions of elements
'to be kept.
Public Function combSeq(seqToComb, seqOfCombValues)
'various library calls to work with 1xn or nx1 arrays or ranges as well as 1-D arrays
'iterate the "comb" and collect positions of keeper elements
'create a new array of the right length and copy in the keeper elements
End Function
Я разместил только псевдокод, потому что мой реальный код - это все вызовы библиотечных функций, включая операции сбора позиций и операции копирования с позиций.Это, вероятно, затеняет основную идею, которая довольно проста.
Вы бы назвали такой UDF следующим образом:
=combSeq({23, "", 34, 46, "", "16"}, {23, "", 34, 46, "", "16"} <> "")
или
=combSeq(Q1:Q42, SIN(Z1:Z42) > 0.5)
и использоватьОбычная механика массива в Excel для генерации «гребенки».Это легкий, дружественный к Excel способ получить множество преимуществ более стандартной функции filter(list-to-filter, test-function)
, которую вы можете увидеть в других системах программирования.
Я использую имя «гребень», потому что «фильтр» обычно означает «фильтр с этой функцией», а в Excel вы должны применить функцию теста перед вызовом функции фильтрации.Также может быть полезно вычислить одну «расческу» в качестве промежуточного результата, а затем использовать ее для ... э-э, расчесывания ... нескольких списков.