为什么这个Excel公式有效?

在这个答案中给出了下面的公式。

{=PERCENTILE(IF(COLUMN(INDIRECT("1:"&MAX(Data!N3:N15)))<=Data!N3:N15,Data!M3:M15,""),0.25)} 

它应该用权重来计算第一个四分位数据。

我一直在试图理解这个公式说什么,但我不能。

首先,大括号是什么? (可能是一个愚蠢的问题。)

其次,在给定两个数据范围作为操作数时, <=操作符是做什么的?

第三,如果不pipeif语句中的条件如何,返回的数据只是值列,这怎么可能给出正确的答案呢? 在我看来,这个公式是做什么的

  • 如果奇怪的条件满足,则计算值列的第一个四分位数。
  • 如果不是,则计算“”的第一个四分位数。

这似乎是完全错误的…

另外,我在哪里可以findExcel函数和操作符的完整手册? 在线帮助文​​件没有说明比较两个范围。

就我个人而言,我不会使用引用的公式 – 我怀疑它是否完全符合作者的想法,在某些情况下会得到不正确的结果。 你可以看到这个部分的问题

=COLUMN(INDIRECT("1:"&MAX(Data!N3:N15))

如果MAX(Data!N3:N15)是2或200,则返回完全相同的结果。如果MAX(Data!N3:N15) = 2,

=COLUMN(INDIRECT("1:2"))

我假设作者的意图是返回一个数组像{1,2} …….但它不这样做。 INDIRECT(“1:2”)给你1:2,它被解释为整个行1和2,所以= COLUMN(1:2)给你所有列的数字(1到256或1到16384取决于您使用的是哪个版本的Excel,或者您是否使用兼容模式)。

你可以在单元格中使用这个公式来testing

=COUNT(COLUMN(INDIRECT("1:"&MAX(Data!N3:N15))))

CTRL+SHIFT+ENTER

你要么得到256或16384,但是这不取决于列N中的值。

该公式可能会给你正确的结果,但如果Data!N3:N15中的任何值> 256(或16384取决于版本),则该公式可能无法正常工作。

在所有情况下,这个版本的公式应该按照预期进行:

=PERCENTILE(IF(TRANSPOSE(ROW(INDIRECT("1:"&MAX(Data!N3:N15)))) <=Data!N3:N15,Data!M3:M15,""),0.25)

…..但解释它如何工作让我们看看只有4行,即减less版本

=PERCENTILE(IF(TRANSPOSE(ROW(INDIRECT("1:"&MAX(Data!N3:N6))))<=Data!N3:N6,Data!M3:M6,""),0.25)

并假设M3:M6包含这些值 – 10,75,15,23,并且N3:N6包含这些值1,2,3,4,

现在MAX(Data!N3:N6) = 4,所以INDIRECT给你“1:4”,并传递给ROW函数,所以你得到一个数组{1; 2; 3; 4} [这是一个“列”的值],但TRANSPOSE将其转换为{1,2,3,4} [这是值的“行”) – 转换的原因是因为当一列与一行进行比较时,反之亦然, 在一个数组中,每个数值都在另一个数组中 ,这就是所需要的(给出一个4x4matrix的值)。

现在当我们这样做时,{1,2,3,4}中的每个值都是<= 4(N6值),但是只有3个是<= 3(N5值),只有2个是<= 2(N4值)传递给PERCENTILE函数的数组正确地返回10个值,2个75个值,3个15个值和4个23个值(其他值是“”,PERCENTILE忽略的空白)

我的例子的结果是15和原来的公式也给出15 …….但如上所述,原来的公式可能会得到不正确的结果与更大的数字 – 例如,我在Excel 2007中testing兼容模式,如果我把N4换成4000,把N6换成1000,我现在预计结果是75(这是我的公式给出的结果)…..但是原来的公式给出了23。

  1. 最里面的操作是MAX(Data!N3:N15)并且这在M3:M15范围内查找最高值。 假设最大值是10。
  2. 第二个操作是INDIRECT("1:"&10) ,这个INDIRECT变成了1:10的范围。
  3. COLUMN返回一个数组,其中包含范围1:10的列号。 (如果是范围A1:B1 ,则得到数组{1,2} ,如果是B1:D1 ,则数组为{2,3,4} ,因此COLUMN(1:10)返回{1, 2, 3, etc...}
  4. Data!N3:N15应该很容易理解。 范围本身是一个数组。 假设它包含值: {2, 3, , 5, etc...}
  5. 比较: {1, 2, 3, etc...} <= {2, 3, , 5, etc...} 。 如果比较满足,则返回范围Data!M3:M15 。 假设这个包含{15, 14, 13, 12, 11, etc... }

    • 第一次比较:1 <= 2(两个数组的第一个元素)是真的,因此返回15
    • 第二个比较:2 <= 3(两个数组的第二个元素)是真的,因此返回14
    • 第三个比较:3 <=“”(两个数组的第三个元素)是错误的,因此,返回""作为IF其他结果。
    • 等等…

    由此产生的数组{15, 14, "", 12, etc... } 15,14 {15, 14, "", 12, etc... }

  6. 获取这个数组的百分位数。

由于这是一个数组公式,所以必须使用公式Ctrl + Shift + Enter 。 每当你这样做,括号自动包裹公式。

附录我没有得到更早的补充(这一点是我会看到巴里胡迪尼的答案之前):

无论N3:N15范围内的最大值(除了那些取决于excel版本的256或16384), COLUMN(INDIRECT("1:"&MAX(Data!N3:N15)))将返回一个常数值,我相信这个公式在某种程度上是错误的。

更好的解释,请看barry houdini的回答 。

回答问题的第一部分 – 大括号表示数组公式(函数)。 PERCENTILEfunction就是其中之一。 要input公式,您需要使用:CTRL + SHIFT + ENTER,纯粹的ENTER是不够的。

你可以在这里阅读更多