Excel 从索引和匹配中平均非零值
我在excel中有一个数据表,其中包含时间、名称和结果列 我的目标是使用公式生成一个不同的新表,其中显示每个时间(列)和名称(行)组合的结果。这将在以后用于生成热图(结果是实数) 我是通过在新表的每个单元格上使用公式来实现的。新表中单元格K5的示例如下:Excel 从索引和匹配中平均非零值,excel,excel-formula,Excel,Excel Formula,我在excel中有一个数据表,其中包含时间、名称和结果列 我的目标是使用公式生成一个不同的新表,其中显示每个时间(列)和名称(行)组合的结果。这将在以后用于生成热图(结果是实数) 我是通过在新表的每个单元格上使用公式来实现的。新表中单元格K5的示例如下: =INDEX($AE$2:$AE$999, MATCH(1, INDEX(($A5=$X$2:$X$999)*(K$4=$V$2:$V$999),0,1),0)) 其中,$AE$2:$AE$999是结果列,$A5是新表中的名称行,$X$2:$
=INDEX($AE$2:$AE$999, MATCH(1, INDEX(($A5=$X$2:$X$999)*(K$4=$V$2:$V$999),0,1),0))
其中,$AE$2:$AE$999
是结果列,$A5
是新表中的名称行,$X$2:$X$999
是名称列,K$4
是新表中的时间列,$V$2:$V$999
是时间列
问题是我的数据表有多个条目,它们具有相同的名称和时间组合,但结果值不同。对于这些组合,我希望公式返回所有非零结果的平均值
我认为当前公式只返回它遇到的第一个匹配项。我希望此过程尽可能自动化,因为原始数据表将频繁更改
显示两个表的屏幕截图
新桌子。G6
中显示的公式返回0
。我希望它返回3.1
和2.6
的平均值
注意:您的问题文本与图片不同。我将使用您的消息文本中提到的列,而不是图像中的列
看起来你正在做的是计算一个平均值,但只是在某些条件下。由于您处理的是多个条件,因此首先要查看公式AVERAGEIFS()
在您的例子中,对于单元格G5,如果列X中的任何一行是印度(A5),列V中的同一行是6(G4),列AE中的同一行不是零,则需要平均值
因此,在其基础上,G5中的公式如下所示:
= AVERAGEIFS( $AE$2:$AE$999
, $X$2:$X999, "=India"
, $V$2:$V$999, "=6"
, $AE$2:$AE$999, "<>0" )
=AVERAGEIFS($AE$2:$AE$999)
,$X$2:$X999,“=印度”
,$V$2:$V$999,“=6”
,$AE$2:$AE$999,“0”)
然而,您希望它既动态又灵活,为了做到这一点,并防止Excel在移动单元格时弄乱东西,我大量使用了ROW()和COLUMN()函数
我想决赛可能是这样的
= AVERAGEIFS( $AE$2:$AE$999
, $X$2:$X$999, "=" & INDEX( $A:$A, ROW() )
, $V$2:$V$999, "=" & INDEX( $4:$4, 1, COLUMN() )
, $AE$2:$AE$999, "<>0" )
=AVERAGEIFS($AE$2:$AE$999)
,$X$2:$X$999,“=”和索引($A:$A,ROW())
,$V$2:$V$999,“=”和索引($4:$4,1,COLUMN())
,$AE$2:$AE$999,“0”)
这可以粘贴在B5右边和下面的任何单元格中,并且应该在每个单元格中提供您想要的内容。如果结果表中不存在轴的组合,则公式将给出一个错误。因此,您应该将整个过程包装在一个错误函数中,并在发生错误时显示所需内容
供参考
INDEX($A:$A,ROW())
为公式所在行提供列A中的标签。因此,对于第5行中的任何单元格,这是“印度”
INDEX($4:$4,1,COLUMN())
为公式所在的列提供第4行中的标签。因此,对于G列中的任何单元格,这将是“6”。如果您使用的是Excel版本365,则动态数组函数可以简化此操作
时代公式
=TRANSPOSE(SORT(UNIQUE(FILTER(U:U,(ROW(U:U)>1)*(U:U<>"")))))
如果没有365,则可以使用表格公式
=IFERROR(AVERAGEIFS($AD:$AD,$AD:$AD,">0",$U:$U,C$29,$W:$W,$B30),"")
并复制到表的范围。通过您选择的任何方式创建标题行/列实际数据将非常有用。一个想法是在数据上创建一个透视表,它将按名称和时间对结果进行汇总。然后,您可以创建公式,而不必担心平均结果。
=IFERROR(AVERAGEIFS(AD:AD,AD:AD,">0",U:U,C4#,W:W,B5#),"")
=IFERROR(AVERAGEIFS($AD:$AD,$AD:$AD,">0",$U:$U,C$29,$W:$W,$B30),"")