获得不同大小的群体的群体平均值

时间:2013-05-31 14:21:43

标签: excel if-statement excel-formula countif array-formulas

我觉得这几乎是不可能的,但是这里有。我的数据结构如下:

Test Group 1
pass
fail
pass
fall

Test Group 2
pass
fail

Test Group 3

pass 
fail
fail
pass

我希望能够将其粘贴到Excel中并让Excel汇总每个测试组的百分比。所以它最终看起来像这样:

Test Group 1               Percentage Pass: 50%
pass
fail
pass
fall

Test Group 2              Percentage Pass: 50%
pass
fail

Test Group 3              Percentage Pass: 50%

pass 
fail
fail
pass

但是您可以看到未设置测试组长度,并且可能会有所不同。我希望我能够创建一个遵循这个逻辑的公式:

if( A<n> contains "Test")

count A<n> +1 until A<n> contains "Test"

好像我从Excel公式中问了很多。我今天花了一些时间编写了一个小型的C#应用​​程序,它将配置文件拆分成单独的文件,这样我就可以将单独的文件复制并粘贴到Excel中。但是减少步骤会很棒!

---更新----

这个问题有三个非常有趣的方法,证明没有什么是不可能的:p

我想要一个解决方案,允许我复制并粘贴结果并看到弹出百分比的负载,所以我总是在寻找一个公式解决方案但是,请花时间看看pnuts和Jerrys的答案,因为他们揭示Excel的一些有用功能!

chuffs回答是我正在寻找的那个,它开箱即用。对于任何想要深入研究其工作原理和原因的人,我将公式分解为步骤并填写一些帮助信息。这些公式的关键是结合MATCH,OFFSET和稍微更明显的SEARCH / FIND / LEFT(我以前使用IFERROR(FIND类型方法,LEFT似乎更干净:))

请查看这些公式的文档,但要通过一些示例查看所有这些公式,请参阅我创建的Google Spreadsheets详细说明chuffs回答:

https://docs.google.com/spreadsheet/ccc?key=0AqODI11eAjtldDhDd2dBcFhpZW9SXzEybGtMUWMwM3c#gid=0

--- --- P.S 为了记录,我确实创建了一个C ++程序来美化我的数据并将其作为.csv文件输出。如果我有这个信息,我就不会打扰,但我很高兴我尝试了两条路线,这是一次有趣的学习冒险。

3 个答案:

答案 0 :(得分:2)

可以使用针对此问题的单一阵列公式解决方案。它只需要在数据列的底部添加一个停止值“Test”。

假设您的数据位于A2:A18范围内,以下是计算单元格B2中平均值的公式:

  =IF(LEFT(A1,4)="Test",
      COUNTIF(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1),"pass")
          / COUNTA(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1)),
      "")

公式的关键部分是计算两个计数函数COUNTIFCOUNTA的范围的表达式。

COUNTIF函数 - 计算组中的遍数 - 采用两个参数,计数范围和细胞计数条件。

我使用OFFSET函数来提供计数范围。 OFFSET有五个参数:

  • 锚单元格(如果提供范围,则该函数仅使用范围中的左上角单元格。)
  • 要返回的范围将开始的锚单元格下方(+)或以上( - )的行数。
  • 返回范围开始的锚单元格右侧(+)或左侧( - )的列数。
  • 要返回的行数。
  • 要返回的列数。

例如,OFFSET(A1,5,2,4,1)将返回范围C6:D9

在公式中,锚单元格为A1,行偏移为1,列偏移为0,换句话说,要返回的范围的开始为A2

要返回的行数由MATCH函数计算。为了计算第一个测试组的平均值,MATCHA2:A18范围内查找以“Test”开头的第一个单元格的行。 A2是启动测试组的单元格正下方的通过/失败列中的单元格。

列中的最后一个单元格是A18,它已添加到数据中并包含单词“Test”。这可以防止公式为最后一个测试组返回错误。否则,匹配将返回错误,因为在最终组的开头之外找不到另一个Test

另请注意,匹配范围的锚点(即$A2:$A$18)会将行引用无法锚定到范围的顶部(A2中的2)。这样,当公式被复制下来时,范围将向下调整,以便找到“测试”的下一个而不是之前的发生。

最后,我将返回行数减少1,以排除Text找到的属于下一组的MATCH

COUNTA函数 - 计算传递总数并在组中失败 - 使用相同的OFFSET / MATCH表达式来获取组的范围。

这是一个数组公式,因此必须使用 Control - Shift - Enter 组合键输入。将公式复制到数据的底部(不包括具有“测试”停止值的单元格)以计算每个组的平均值。

为方便起见,这里是没有上面显示的中断的公式。它可以直接粘贴到工作表中(记住用 Control - Shift - Enter 确认)。

  =IF(LEFT(A1,4)="Test",COUNTIF(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1),"pass")/COUNTA(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1)),"")

spreadsheet result

答案 1 :(得分:1)

基本上小计将满足要求,提供一些相当繁琐的布局调整是可以接受的。

<强>制备
假设Test Group 1位于A1,请在A2 =IF(LEFT(B2,1)="T",B2,"")C2 =IFERROR(MATCH(B2,{"fail","pass"},0)-1,"")中插入Row1和ColumnA,并根据需要向下复制这两个公式。 (并在源头改变失败!)

<强>小计:
选择A:C,数据&gt;大纲 - 小计,每次更改时:(1) Test Group 1,使用函数:Average,将小计添加到:检查(列C),取消选中下面的数据摘要,确定。

整理:
 1.将A3:C3移至A1,将A2:C2移至A3  2.过滤A:CColumnB文字过滤器,包含添加Test,确定。
 3.在C3放置="Percentage Pass: "&C4*100&"%"并复制到以蓝色编号的最后一行(应显示#DIV/0!)。
 4.突出显示所有以蓝色和embolden编号的行的A:C  5.隐藏ColumnA,并可选择隐藏或删除Rows1:2  6.取消过滤器选择。

希望如左边的准备,结果将类似于右侧所示:

SO16859574 first example


示例重新评论@Jerry的答案:

SO16859574 second example

答案 2 :(得分:-1)

有很多方法可以解决这个问题 - 一种可能的简单解决方案是在通过/失败列旁边添加一个列(假设列A):

=IF(A1="pass",100,0)

如果你这样做,那么这些值的平均值将等于通过百分比。