2014-08-28 80 views
0

介绍用于搜索简化多个COUNTIFS:在Excel 2010


我有我使用的追踪游戏炉石统计Excel工作簿。一张表包含每个单独游戏的数据(赢取损失等)。另一张表格允许用户根据用户输入的搜索标准搜索赢/输统计。


我的问题:


在搜索片我使用COUNTIFS公式。这些公式变得相当长。有什么办法可以简化COUNTIFS公式吗?


的设置:Excel的搜索页的外观:


 |  Column K  |    Column L   | 
     |____________________|______________________________| 
Row 5 |Date Start   | User input goes in Column L | 
Row 6 |Date End   |        | 
Row 7 |Player's Class  |        | 
... |Turn Number   |        | 
     |Deck Name   |        | 
     |Opponent's Class |        | 
     |Opponent's Username |        | 
     |Match Type 1  |        | 
     |Match Type 2  |        | 
     |Match Type 3  |        | 
     |Match Type 4  |        | 
... |Match Type 5  |        | 
Row 17 |Match Type 6  |        | 
     |____________________|______________________________| 


     |  Column K  |     Column L     | 
     |______________________|_______________________________________________| 
Row 21 | Total Matches Played | Data is displayed based on the user's input. | 
Row 22 | Total Wins   | The code that needs simplifying is goes here. | 
Row 23 | Total Losses   |            | 
Row 24 | Win to Loss Ratio |            | 
Row 25 | Win Percentage  |            | 
Row 26 | Loss Percentage  |            | 
     |______________________|_______________________________________________| 

需要简化了代码。这一代码进入在行22L栏


=(COUNTIFS('Indiv. Match Stats'!I:I,"Win",'Indiv. Match Stats'!H:H,L12, 
'Indiv. Match Stats'!L:L,L7,'Indiv. Match Stats'!T:T,L9,'Indiv. Match 
Stats'!Q:Q,L10,'Indiv. Match Stats'!P:P,L11,'Indiv. Match Stats'!C:C, 
">="&L5,'Indiv. Match Stats'!C:C,"<="&L6,'Indiv. Match Stats'!N:N,L8)) 
+ 
(COUNTIFS('Indiv. Match Stats'!I:I,"Win",'Indiv. Match Stats'!H:H,L13, 
'Indiv. Match Stats'!L:L,L7,'Indiv. Match Stats'!T:T,L9,'Indiv. Match 
Stats'!Q:Q,L10,'Indiv. Match Stats'!P:P,L11,'Indiv. Match Stats'!C:C, 
">="&L5,'Indiv. Match Stats'!C:C,"<="&L6,'Indiv. Match Stats'!N:N,L8)) 
+ 
(The code repeats the above four more times. Basically each block of code 
stands for one Match Type in Column K) 

工作表的说明和代码:通过按行5


用户输入标准17,列L.任何空白处理为通配符。用户输入标准缩小了搜索结果并确定了列21中的行21至26中显示的数据。

上面显示的代码多次引用名为Indiv. Match Stats的单独图纸。 COUNTIFS按日期,玩家类别,转数,牌组名称,...和比赛类型缩小搜索范围。不幸的是,所有这些标准都必须重复,每种匹配类型一次,然后代码添加结果,给出最终结果(给定标准的适当数量的胜利,损失等)。它是一大块代码,被添加到另一个代码块中。

有没有更好的方法来做到这一点或只是以某种方式在视觉上简单的代码?有没有办法让类似的代码块等于一些变量,以便那些类似的部分不必被重复输入?

回答

2

可以有效地使用 “或” COUNTIFS - 假设你要计算,如果列H =任何L12:L17然后使用这个版本

=SUMPRODUCT(COUNTIFS('Indiv. Match Stats'!I:I,"Win",'Indiv. Match Stats'!H:H,L12:L17, 'Indiv. Match Stats'!L:L,L7,'Indiv. Match Stats'!T:T,L9,'Indiv. Match Stats'!Q:Q,L10,'Indiv. Match Stats'!P:P,L11,'Indiv. Match Stats'!C:C, ">="&L5,'Indiv. Match Stats'!C:C,"<="&L6,'Indiv. Match Stats'!N:N,L8))

COUNTIFS现在返回一个包含6个值(L12:L17各一个)的数组,然后返回SUMPRODUCT用于对该数组求和,因为它不需要“数组输入”,如SUM所示。

注1:SUMPRODUCT简单相加6个值,所以没有表现“命中”在这种情况下使用它 - 所有的“繁重”是由COUNTIFS

注2做:如果有任何值在重复L12:L17那么你会得到“双重计算”就像原来的公式不

为了避免重复计算,用这个公式 - 注意附加COUNTIF功能结尾:

= SUMPRODUCT(COUNTIFS('逐张。 Match Stats'!I:I,“Win”,“Individual。Match Sta ts'!H:H,L12:L17, 'Indiv。 Match Stats'!L:L,L7,'Indiv。 Match Stats'!T:T,L9,'Indiv。匹配 统计'!Q:Q,L10,'个人。 Match Stats'!P:P,L11,'个人。 Match Stats'!C:C, “> =”& L5,'个人。 Match Stats'!C:C,“< =”& L6,'Indiv。 Match''N:N,L8),1/COUNTIF(L12:L17,L12:L17 &“”)

+0

感谢您使用此解决方案。我也将COUNTFS作为数组公式进行测试。但我没有考虑过,某些Excel函数本身不是作为数组公式运行,而是在数组的上下文中以数组的形式获取它们的参数。 – 2014-08-29 04:28:40

+0

谢谢!如果您为匹配类型放入两次相同的搜索字词,我知道该公式会进行双重计数。我认为停止重复计算会是一个全新的问题,而且是一个非常修改或不同的公式? – user2348797 2014-08-29 05:11:47

+0

为避免重复计算,我认为您需要SUMPRODUCT按照Axel的建议,但对于“OR”部分,您可以使用MATCH,即“ISNUMBER(MATCH('Indiv。Match Stats'!H:H,L12:L17,0 )) - 这样你就可以扩展L12:L17的大小,而不需要扩大公式......正如Axel所说,使用SUMPRODUCT,最好使用特定范围而不是整列,否则公式会变慢 – 2014-08-29 12:31:20

2

缩短代码的简单方法是缩短“Individual。Match Stats”选项卡的标题以表示IMS。这将缩短显着的事情:

=(COUNTIFS('IMS'!I:I,"Win",'IMS'!H:H,L12,'IMS'!L:L,L7,'IMS'!T:T,L9,'IVM'!Q:Q,L10,'IMS'!P:P,L11,'IMS'!C:C,">="&L5,'IMS'!C:C,"<="&L6,'IMS'!N:N,L8)) 
+ (COUNTIFS('IMS'!I:I,"Win",'IMS'!H:H,L13,'IMS'!L:L,L7,'IMS'!T:T,L9,'IMS'!Q:Q,L10,'IMS'!P:P,L11,'IMS'!C:C,">="&L5,'IMS'!C:C,"<="&L6,'IMS'!N:N,L8)) 

另一个更漂亮的方法是使用Excel命名的范围。突出显示每个范围,如'个人。匹配统计数据“!I:I并单击名称框中的公式栏左侧,为IMSI列表输入名称。重复'个人。匹配统计'!N:N - > IMSN等等。
这将使你这样的代码:

=(COUNTIFS(IMSI,"Win",IMSH,L12,IMSL,L7,IMST,L9,IVMQ,L10,IMSP,L11,IMSC,">="&L5,IMSC,"<="&L6,IMSN,L8)) 
+ (COUNTIFS(IMSI,"Win",IMSH,L13,IMSL,L7,IMST,L9,IMSQ,L10,IMSP,L11,IMSC,">="&L5,IMSC,"<="&L6,IMSN,L8)) 
0

我发布这个答案不是我的建议,而是要说明的问题是什么。问题是,COUNTIFS中没有OR快捷方式功能。所以你不能说COUNTIFS('Indiv. Match Stats'!H:H;L12 OR L13 OR L14...)

使用SUMPRODUCT可以使用数组公式缩短公式。这将起作用,因为有可能通过sum布尔结果执行OR快捷方式,因此如果只有一个布尔值为真,则总和为1。公式会是:

=SUMPRODUCT(
('Indiv. Match Stats'!I:I="win") 
*(
('Indiv. Match Stats'!H:H=L12)+('Indiv. Match Stats'!H:H=L13) 
+('Indiv. Match Stats'!H:H=L14)+('Indiv. Match Stats'!H:H=L15) 
+('Indiv. Match Stats'!H:H=L16)+('Indiv. Match Stats'!H:H=L17) 
) 
*('Indiv. Match Stats'!L:L=L7) 
*('Indiv. Match Stats'!T:T=L9) 
*('Indiv. Match Stats'!Q:Q=L10) 
*('Indiv. Match Stats'!P:P=L11) 
*('Indiv. Match Stats'!C:C>=L5) 
*('Indiv. Match Stats'!C:C<=L6) 
*('Indiv. Match Stats'!N:N=L8) 
) 

但是这会有一个非常糟糕的表现。这样的数组公式非常慢,特别是对于整列。

所以BKays的建议也是我认为最好的。

问候

阿克塞尔