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


介绍:


我有一个Excel工作簿,用于跟踪Hearthstone游戏的统计信息。 一张纸包含每个单独游戏的数据(赢取损失等)。 另一张表格允许用户根据用户input的search标准search赢/输统计。


我的问题:


在我使用COUNTIFS公式的search表中。 这些公式变得相当长 有什么办法可以简化COUNTIFS公式吗?


设置:Excelsearch页面的外观如何:


| 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中input条件。任何留空的都被视为通配符。 用户input标准缩小了search结果,并确定了在列L的行21至26中显示的数据。

上面显示的代码引用了名为Indiv. Match Stats的单独表单Indiv. Match Stats Indiv. Match Stats很多次。 COUNTIFS按date缩小search范围,玩家类别,转数,牌组名,…以及匹配types。 不幸的是,所有这些标准必须重复,每种匹配types一次,然后代码添加结果,给出最终结果(给定标准的适当数量的胜利,损失等)。 这是一大块代码,被添加到另一个代码块。

有没有更好的方法来做到这一点,或只是一些方式来直观地简单的代码? 有没有办法让类似的代码块等于一些variables,以便那些类似的部分不必被重复input?

可以COUNTIFS有效地使用“OR” – 假设您想要计算列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对该数组进行求和,因为它不需要“数组入口”。

注1: SUMPRODUCT简单地总结了6个值,所以在这种情况下没有使用它的性能 – 所有的“繁重”都是由COUNTIFS

注2:如果在L12:L17重复任何值,那么就会像原来的公式那样得到“重复计数”

为了避免重复计算,使用这个公式 – 在最后注意额外的COUNTIF函数:

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

缩短代码的简单方法是缩短标签“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命名的范围。 突出显示每个范围,如“个人” Match Stats'!I:I,然后点击公式栏左边的名称框,为IMSI列表input名称。 重复“个人”。 匹配统计'!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)) 

我发表这个答案不是我的build议,而是要显示问题是什么。 问题是,在COUNTIFS中没有OR快捷方式function。 所以你不能说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) ) 

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

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

问候

阿克塞尔