0

类似于 Stephen Roy 于 2013 年 4 月 26 日提出的问题,由 Barry Houdini 回答。根据这个通用公式,我有一个命名范围

{=IFERROR(INDEX(Range,SMALL(IF( MATCH(Range,Range,0)=ROW(INDIRECT("1:"&ROWS(Range))), MATCH(Range,Range,0)),ROW(INDIRECT("1:"&ROWS(Range))))),"")}

[显然在 2003 年我不使用 IFERROR()]

“范围”本身就是一个命名数组公式。

该公式用于从一个范围中提取唯一条目并将它们排列在另一个“范围”的“顶部”。但是,INDEX() 似乎只“存储”一个值,而不是预期的数组。Barry 谈到将 ROW() 包装在另一个函数中以丢失 {array}。看起来第一个 ROW() 返回多个值并且工作正常,它是最后一个 ROW() 似乎只减少到第一个数组条目,从而导致 INDEX() 只返回一个值。但是,我没有尝试将其存储在内存中,而是选择了一个多单元格范围进行输出,并使用 CSE,它运行良好。但我不想这样做。

我尝试过使用 INDIRECT(),但根本无法让它发挥作用。

感谢你们的想法,伊恩·泰勒

4

2 回答 2

1

这可能对你有用。要返回给定范围的唯一值列表,x例如:

=LOOKUP(SMALL(IF(MATCH(x,x,0)=ROW(INDIRECT("1:"&ROWS(x))),MATCH(x,x,0)), ROW(INDIRECT("1:"&SUM(IF(FREQUENCY(MATCH(x,x,0),MATCH(x,x,0)),1))))), ROW(INDIRECT("1:"&ROWS(x))),x)

您可以将其定义为一个名称Unique并在其他公式中使用它,例如=COUNTIF(x,Unique)返回一个频率数组。

附录

关于 INDIRECT/INDEX/ROW 等,这是我的 2c(另请参见此处)。函数输入输出基本上可以分为三种情况:单值、数组或引用。如果函数输入参数默认采用单个值并指定数组,则结果取决于函数输出的类型。如果函数的输出类型是:

A) 单个值- 返回一个值数组,每个输入值一个。大多数函数都是这种情况,例如=LOOKUP({1;2},{1;2;3},{"a";"b";"c"})返回{"a";"b"}

B) 引用- 返回引用数组。间接/偏移就是这种情况。例如=INDIRECT("A1:A"&ROW()),返回包含引用的单个元素数组,但这可能会在许多函数中引发错误,因为默认情况下引用不会转换为值。

C) 数组- 如果正常评估并输入单个单元格,则基于函数的第一个输入返回值或数组。否则,如果输入多个单元格,则基于每个输入的第一个结果返回一个数组。INDEX 就是这种情况,如果其中一个参数为零,它可能会返回一个数组。例如,在公式栏中计算时=INDEX({1,2;3,4},0,{1;2})返回{1;3},但{1;2}在单元格中输入数组时返回。

事实上,Excel 使用了一种变体数据类型,它可以采用任何这些类型,因此细节比这要复杂一些。还可以在适当的位置修改参数,这可能就是为什么例如在第一个参数中具有数组的VLOOKUP情况C而在第三个参数中具有情况A的原因。

于 2013-06-15T09:05:40.947 回答
-1

我尝试将此作为定义的名称说“Unique_List”,以便我可以将其用作数据验证列表,但是当我将此定义的名称添加到数据验证列表时,它会给出错误。

=LOOKUP(SMALL(IF(MATCH(x,x,0)=ROW(INDIRECT("1:"&ROWS(x))),MATCH(x,x,0)), ROW(INDIRECT("1:"&SUM(IF(FREQUENCY(MATCH(x,x,0),MATCH(x,x,0)),1))))), ROW(INDIRECT("1:"&ROWS(x))),x)

其中 x 是我的范围。

我尝试转置此公式以获取逗号分隔而不是分号分隔的值,但数据验证列表似乎不起作用。

=TRANSPOSE(LOOKUP(SMALL(IF(MATCH(x,x,0)=ROW(INDIRECT("1:"&ROWS(x))),MATCH(x,x,0)), ROW(INDIRECT("1:"&SUM(IF(FREQUENCY(MATCH(x,x,0),MATCH(x,x,0)),1))))), ROW(INDIRECT("1:"&ROWS(x))),x))

好心劝告。

于 2013-12-11T19:53:41.250 回答