我觉得这几乎是不可能的,但是这里有。我的数据结构如下:
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文件输出。如果我有这个信息,我就不会打扰,但我很高兴我尝试了两条路线,这是一次有趣的学习冒险。
答案 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)),
"")
公式的关键部分是计算两个计数函数COUNTIF
和COUNTA
的范围的表达式。
COUNTIF函数 - 计算组中的遍数 - 采用两个参数,计数范围和细胞计数条件。
我使用OFFSET
函数来提供计数范围。 OFFSET
有五个参数:
例如,OFFSET(A1,5,2,4,1)
将返回范围C6:D9
。
在公式中,锚单元格为A1
,行偏移为1,列偏移为0,换句话说,要返回的范围的开始为A2
。
要返回的行数由MATCH
函数计算。为了计算第一个测试组的平均值,MATCH
在A2: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)),"")
答案 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:C
和ColumnB
文字过滤器,包含添加Test
,确定。
3.在C3
放置="Percentage Pass: "&C4*100&"%"
并复制到以蓝色编号的最后一行(应显示#DIV/0!
)。
4.突出显示所有以蓝色和embolden编号的行的A:C
5.隐藏ColumnA
,并可选择隐藏或删除Rows1:2
6.取消过滤器选择。
希望如左边的准备,结果将类似于右侧所示:
示例重新评论@Jerry的答案:
答案 2 :(得分:-1)
有很多方法可以解决这个问题 - 一种可能的简单解决方案是在通过/失败列旁边添加一个列(假设列A):
=IF(A1="pass",100,0)
如果你这样做,那么这些值的平均值将等于通过百分比。