绝大多数Excel函数都可以忽略传递给它们的布尔值(有时还有其他非数字值) 。因此 , 它们可以有效地缩小操作的范围 , 该范围内仅包含非布尔值(或数字) , 这样使我们可以在函数中包含条件语句(通常使用IF函数) , 从而限制公式构造最终要处理的值 。
例如下所示的工作表:
文章插图
下面的公式:
=AVERAGE(IF(A2:A11=”X”,B2:B11))
可解析为:
=AVERAGE(IF({FALSE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE;TRUE;TRUE;TRUE},B2:B11))
解析为:
=AVERAGE({FALSE;58;FALSE;23;FALSE;93;FALSE;35;27;40})
像大多数函数一样 , AVERAGE函数忽略传递给它的数组中的布尔值 , 因此上述公式等价于:
=AVERAGE({58;23;93;35;27;40})
得到:
46
当然 , 我们可以在这里使用许多其它函数替换AVERAGE并获得同样的结果 , 关键是几乎在所有情况下 , 它们都忽略布尔值 。
但是 , 存在许多Excel函数无法处理(即忽略)传递给它们的数组中的某些数据类型 。一些是最常见的统计函数(例如GROWTH、LINEST、LOGEST和TREND函数) , 不接受除完全由数字组成的数组以外的其他数组 。因此 , 如果将之前公式中的AVERAGE替换为LINEST , 即:
=LINEST(IF(A2:A11=”X”,B2:B11))
【GROWTH,LINEST,LOGEST,TREND 怎么给统计函数提供合法的参数值】可解析为:
=LINEST({FALSE;58;FALSE;23;FALSE;93;FALSE;35;27;40})
结果为:
#VALUE!
而不是我们期望的值-3.88571428571429 , 这应该是=LINEST({58;23;93;35;27;40})的结果 。
使用GROWTH、LOGEST或TREND替换LINEST , 均返回#VALUE! 。怎么办?
解决方案是确保我们传递的数组仅包含满足条件的值 , 而不包含其他值 。下面是一个优雅的公式 , 但仅处理静态的值(如公式中的“X”):
=LINEST(INDEX(B:B,N(IF(1,MODE.MULT(IF(A2:A11={“X”,”X”},ROW(A2:A11)))))))
其中:
MODE.MULT(IF(A2:A11={“X”,”X”},ROW(A2:A11)))
因为MODE.MULT函数的特性要求传递给它的数组中每个值至少出现2次 , 所以公式中包含了两个“X” , 以生成满足该函数的数组 。可解析为:
MODE.MULT(IF({FALSE,FALSE;TRUE,TRUE;FALSE,FALSE;TRUE,TRUE;FALSE,FALSE;TRUE,TRUE;FALSE,FALSE;TRUE,TRUE;TRUE,TRUE;TRUE,TRUE},ROW(A2:A11)))
解析为:
MODE.MULT({FALSE,FALSE;3,3;FALSE,FALSE;5,5;FALSE,FALSE;7,7;FALSE,FALSE;9,9;10,10;11,11})
得到:
{3;5;7;9;10;11}
为了将ROW函数中的每个值重复一次 , 我们有效地将该函数的一维返回值转换(或重新定义)为二维返回值 。换句话说 , 将:
ROW(A2:A11)
的结果:
{2;3;4;5;6;7;8;9;10;11}
通过指定IF的参数logical_test的值包含:
{“X”,”X”}
将结果强制转换成10行2列的布尔数组:
{FALSE,FALSE;TRUE,TRUE;FALSE,FALSE;TRUE,TRUE;FALSE,FALSE;TRUE,TRUE;FALSE,FALSE;TRUE,TRUE;TRUE,TRUE;TRUE,TRUE}
这是需要注意的是 , 如果处理水平区域而不是垂直区域 , 那么建议在构造解决方案时要小心 。例如 , 如果处理的区域不是A2:B11而是A2:J3 , 那么除了要用COLUMN替换ROW外 , 还需要解决正交性问题 。例如:
=LINEST(INDEX(3:3,N(IF(1,MODE.MULT(IF(A2:J2={“X”,”X”},COLUMN(A2:J2)))))))
由于A2:J2是一个1行10列的数组 , 而{“X”,”X”}是一个1行2列的数组 , 将生成数组: