是否有某种方法可以在Excel中获取比单元格工作表函数中的起始数组更小的数组?
所以,如果我有:
{23, "", 34, 46, "", "16"}
我最终会:
{23, 34, 46, 16}
然后我可以使用其他一些功能进行操作。
结论:如果我要做很多这些,我肯定会使用jtolle的UDF梳子解决方案。 PPC使用的公式很接近,但潜入并测试,我发现它在空插槽中出错,错过了第一个值,并且有更简单的方法来获取行号,所以这是我的最终解决方案:
=IFERROR(INDEX($A$1:$A$6, SMALL(IF(($A$1:$A$6<>""),ROW($A$1:$A$6)),ROW(1:6))),"")
必须以数组公式(CTRL-SHIFT-ENTER)输入。如果显示,则必须至少输入与结果集一样大的区域,以显示所有结果。
答案 0 :(得分:7)
如果您只想获取数组的一个子集,并且您已经知道所需元素的位置,那么您只需将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
我只发布了伪代码,因为我的实际代码是对库函数的所有调用,包括collect-positions和copy-from-positions操作。它可能会掩盖基本思想,这很简单。
你会这样称呼这样的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)
函数的许多好处。
我使用名称“comb”,因为“过滤器”通常表示“使用此功能过滤”,而使用Excel,您必须在调用过滤功能之前应用测试功能。计算一个“梳子”作为中间结果,然后用它来梳理......多个列表也很有用。
答案 1 :(得分:5)
此网站上有一个答案:http://www.mrexcel.com/forum/showthread.php?t=112002。但是解释不多。
假设您在A列上有空白单元格的数据,并将其放在B列中;将以跳过空白的相同顺序检索数据
=INDEX( $A$1:$A$6,
SMALL(
IF(
($A$2:$A$6<>""),
ROW($A$2:$A$6)
),
ROW()-ROW($B$1)
)
)
以下是解释:
答案 2 :(得分:1)
可能的工作表功能解决方案:
=INDEX(A1:A6,N(IF(1,MODE.MULT(IF(A1:A6<>"",ROW(1:6)*{1,1})))))
MODE.MULT
函数返回一个简化的索引数组,并插入N(IF(1,.))
,以便数组通过 by-reference 传递给INDEX
函数。 / p>
答案 3 :(得分:1)
以上答案均给出了脆性公式,这些公式无法移动到图纸上的不同位置,并且对插入的行和列非常敏感。
这是一个不敏感的版本,可以移动到任何行:
=INDEX($A$10:$A$40, SMALL(IF(B$10:B$40,ROW(INDIRECT("1:30"))),ROW(INDIRECT("1:30"))))
在此示例中,原始数组值放置在$ A $ 10:$ A $ 40中(如果原始数据是行而不是列,则可以使用数组公式{TRANSPOSE(originalArray)})。
B $ 10:B $ 40列包含布尔标志(TRUE或FALSE),这些布尔标志确定此数组元素是否应保留在结果中(TRUE)或不保留(FALSE)。您可以使用任何所需的功能来填充此列。要创建OP中提到的测试,<>“”,B $ 10应填充:= A10 <>“”(然后向下复制到B $ 40)。列A具有绝对列引用,列B具有相对列引用,因此可以将公式复制到更右侧的列中,从而允许您创建其他类型的属性和子数组,这将由您放置的布尔测试来控制在C和D列等中。
此示例将处理多达30个元素的原始数组。对于较大的数组,请调整范围$ A $ 10:$ A $ 40和B $ 10:B $ 40(代表30行),并调整两次出现的“ 1:30”以适合。