简介
我有一个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按日期,玩家等级,转弯数,牌组名称,......和匹配类型缩小搜索范围。不幸的是,必须重复所有这些标准,每种匹配类型一次,然后代码添加结果,给出最终结果(给定标准的适当的获胜,损失等数量)。这是一个很大的代码块,被添加到另一个代码块中。
有没有更好的方法来做到这一点或只是某种方式直观的代码?有没有办法让类似的代码块等于某个变量,这样那些相似的部分就不必输入和覆盖?
答案 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的建议也是最好的。
问候
阿克塞尔