Excel 带数组的Frequency():将元素添加到返回数组中
我使用以下公式作为命名公式(通过名称管理器)。然后在更大的sumproduct()中使用它。目标是确保使用数组计算时,对某些行组只进行一次计算(例如,对于类别A,在多行中重复相同的数据。我只需要知道一次类别A中有多少人) 让我们使用Excel中的评估公式逐一查看结果。很抱歉看到屏幕截图,但Excel不允许用真实数据复制实际步骤 按步骤顺序: 在最后一张图中,我的阵列中现在有第7项。我只有6行数据,因此对于前面的步骤,正如预期的那样,我在数组中只有6项 这会把我的计算搞砸,因为这个函数的返回数组会被其他数组相乘,这些数组都有6个项目(或者我的数据行数) 这第七项是什么,我如何才能驾驭它或防止它返回错误 我确实尝试过将一些公式包装到iferror()或ifna()中,但是感觉不干净。我觉得这可能会适得其反,不是一个很好的处理方法。我宁愿从源头上看 编辑:例如,与其他阵列一起使用:Excel 带数组的Frequency():将元素添加到返回数组中,excel,excel-formula,array-formulas,Excel,Excel Formula,Array Formulas,我使用以下公式作为命名公式(通过名称管理器)。然后在更大的sumproduct()中使用它。目标是确保使用数组计算时,对某些行组只进行一次计算(例如,对于类别A,在多行中重复相同的数据。我只需要知道一次类别A中有多少人) 让我们使用Excel中的评估公式逐一查看结果。很抱歉看到屏幕截图,但Excel不允许用真实数据复制实际步骤 按步骤顺序: 在最后一张图中,我的阵列中现在有第7项。我只有6行数据,因此对于前面的步骤,正如预期的那样,我在数组中只有6项 这会把我的计算搞砸,因为这个函数的
{=SUMPRODUCT(--IFERROR(((tdata[_isVisible]=1)*(f_uniqueUUIDfactor),0))}
其中f_uniqueUUIDfactor是来自初始帖子的公式。tdata[_isVisible]=1用于过滤仪表板上的数据(例如,通过下拉菜单,用户可以设置日期范围,并使用VBA隐藏原始数据中不在该范围内的行)
关键是sumproduct()最终将每个原始数据行乘以0&1s,这样只有满足所有标准的行才能返回。上面的IFERROR()是frequency()引入的额外数组元素的变通方法。它按原样工作,但如果存在更干净的方式,我更愿意这样做。我也很想理解为什么要添加这些元素。这是一个很好的例子,说明了为什么在根据多个条件计算数组时,最好使用多个递归的
IF
语句,而不是形成这些数组的乘积
不过,首先,在解释该声明的原因之前,我还应该指出您的构造中的一些小的技术错误/缺陷
1) 通过在构造中包含一个value_if_false子句作为FREQUENCY
的数据数组和bins数组参数传递,您有可能得到错误的结果,因为零是FREQUENCY
考虑的有效数字,而布尔值false
(如果您完全省略了值_if_false子句,那么它将是结果数组中的等效项)被此函数忽略
2) MATCH
与精确(即0,或FALSE
)MATCH_类型参数匹配是一种相对资源密集的构造,特别是当要考虑的范围相当大时。因此,由于无需对频率
的bin_数组参数使用此结构,因此最好使用更有效的:
ROW(tdata[reportUUID])-MIN(ROW(tdata[reportUUID])+1
此外,请注意,在第二个参数中也不需要重复IF(LEN
构造
总之,那么:
IF(频率(IF(LEN(tdata[reportUUID])>0,匹配(tdata[reportUUID],tdata[reportUUID],0)),行(tdata[reportUUID])-MIN(行(tdata[reportUUID])+1)>0,真)
比您提供的版本更严格、更高效
为了回答您的主要问题,有充分的证据表明,FREQUENCY
总是返回一个数组,该数组的条目数比传递的bins\u数组的条目数大一个
正如我在你文章的评论中提到的,你所面临的问题的解决在很大程度上取决于你对结果数组的进一步操作
但是,为了便于解释,让我们假设您只希望将频率构造得到的数组乘以表中的其他列,例如tdata[Column2],然后对结果求和
两者之间的区别:
=SUM(IF(频率)(IF(LEN(tdata[reportUUID])>0,MATCH(tdata[reportUUID],tdata[reportUUID],0)),ROW(tdata[reportUUID])-MIN(ROW(tdata[reportUUID])+1)>0,TRUE)*tdata Column2])
i、 e.使用两个数组的乘法,以及:
=SUM(IF(频率)(IF(LEN(tdata[reportUUID])>0,MATCH(tdata[reportUUID],tdata[reportUUID],0)),ROW(tdata[reportUUID])-MIN(ROW(tdata[reportUUID])+1)>0,tdata[Column2])
i、 e.在这里使用一个简单的IF
子句至关重要
事实上,前者总是会返回错误,而后者通常不会返回错误
原因是前者将解析为(假设您的表有10行数据,并假设一些随机布尔结果用于频率
构造):
=SUM(如果({TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE},TRUE)*tdata[Column2])
也就是说,因为value_if_true子句在这里是多余的:
=SUM({TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE}*tdata[Column2])
鉴于我给出的第二个解释将决定:
=SUM(如果({TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE},tdata[Column2]))
两者看起来可能相同,但前者使用乘法来解析数组,而后者则不是,这是关键区别
虽然在这两种情况下,阵列都是由频率结构产生的,即:
{TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;FALSE}
包含11个条目(即,比第二个arr中的条目数量多1个
{=SUMPRODUCT(--IFERROR(((tdata[_isVisible]=1)*(f_uniqueUUIDfactor),0))}