简化在Excel 2010中用于搜索的多个COUNTIFS

时间:2014-08-28 12:50:17

标签: excel excel-formula 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      |                                               | 
       |______________________|_______________________________________________|

需要简化的代码。此代码位于第22行 第L列


=(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行至第26列中显示的数据。

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

有没有更好的方法来做到这一点或只是某种方式直观的代码?有没有办法让类似的代码块等于某个变量,这样那些相似的部分就不必输入和覆盖?

3 个答案:

答案 0 :(得分:2)

缩短代码的简单方法是缩短标题“Indiv.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命名范围。突出显示每个范围,如'Indiv。 Match Stats'!I:我点击公式栏左侧的名称框,输入列表名称,如IMSI。重复'Indiv。匹配统计'!N:N - &gt; 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))

答案 1 :(得分:2)

可以有效地使用&#34; OR&#34;在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用于对该数组求和,因为它不需要&#34;数组条目&#34;如SUM那样。

注1:SUMPRODUCT只是将6个值相加,因此没有性能&#34;命中&#34;在这种情况下使用它 - 所有&#34;繁重的提升&#34;由COUNTIFS

完成

注意2:如果在L12:L17中重复任何值,那么您将得到&#34;重复计算&#34;就像你原来的公式一样

为避免重复计算使用此公式 - 请注意最后的其他COUNTIF函数:

= SUMPRODUCT(COUNTIFS(&#39;个人匹配统计&#39;我:我,&#34;赢&#34;,&#39;个人匹配统计&#39;!H:H,L12 :L17, &#39;逐张。比赛统计&#39;!L:L,L7,&#39; Indiv。匹配统计&#39;!T:T,L9,&#39; Indiv。比赛  统计&#39; Q:Q,L10,&#39;逐张。匹配统计&#39;!P:P,L11,&#39; Indiv。匹配统计&#39;!C:C, &#34;&GT; =&#34;&安培; L5,&#39;逐张。匹配统计&#39;!C:C,&#34;&lt; =&#34;&amp; L6,&#39; Indiv。比赛统计&#39;!N:N,L8), 1 / COUNTIF(L12:L17,L12:L17&amp;&#34;&#34;)

答案 2 :(得分:0)

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

使用SUMPRODUCT的数组公式可以缩短公式。这将起作用,因为有可能通过总和布尔结果执行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的建议也是最好的。

问候

阿克塞尔