【问题标题】:Simplify Multiple COUNTIFS Used for Search in Excel 2010在 Excel 2010 中简化用于搜索的多个 COUNTIFS
【发布时间】:2014-08-29 20:42:27
【问题描述】:

简介:


我有一个 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 行的 L 列中显示的数据。

上面显示的代码多次引用名为Indiv. Match Stats 的单独工作表。 COUNTIFS 按日期、玩家等级、回合数、套牌名称……和比赛类型缩小搜索范围。不幸的是,所有这些标准都必须重复,对每种匹配类型重复一次,然后代码添加结果,给出最终结果(给定标准的适当的赢、输等数量)。它是一大块代码,正在被添加到另一个代码块中。

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

【问题讨论】:

    标签: excel excel-formula excel-2010


    【解决方案1】:

    可以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 用于对该数组求和,因为它不像 SUM 那样需要“数组条目”。

    注意 1:SUMPRODUCT 只是简单地将 6 个值相加,因此在这种情况下使用它不会“影响”性能 - 所有“繁重的工作”都是由 COUNTIFS 完成的

    注意 2:如果在 L12:L17 中重复了任何值,那么您将得到“双重计数”,就像原来的公式一样

    为避免重复计算,请使用此公式 - 请注意末尾的附加 COUNTIF 函数:

    =SUMPRODUCT(COUNTIFS('Indiv. Match Stats'!I:I,"Win",'Indiv. Match Stats'!H:H,L12:L17, '个人。比赛统计'!L:L,L7,'Indiv.比赛统计'!T:T,L9,'Indiv。匹配 统计'!Q:Q,L10,'Indiv。比赛统计'!P:P,L11,'Indiv.比赛统计'!C:C, ">="&L5,'个人。比赛统计'!C:C,"1/COUNTIF(L12:L17,L12:L17&""))

    【讨论】:

    • 感谢您提供此解决方案。我也有 testet COUNTIFS 作为数组公式。但我没有考虑到,某些 Excel 函数本身并不作为数组公式运行,而是在数组上下文中将它们的参数作为数组获取。
    • 谢谢!我知道如果您为匹配类型输入相同的搜索词两次,该公式确实会重复计算。我认为阻止 excel 重复计数将是一个全新的问题和一个非常修改或不同的公式?
    • 为避免重复计算,我认为您需要根据 Axel 的建议使用 SUMPRODUCT,但对于“OR”部分,您可以使用 MATCH,即ISNUMBER(MATCH('Indiv. Match Stats'!H:H,L12:L17,0)) - 这样您就可以将 L12:L17 扩展为在不扩大公式的情况下随心所欲......正如 Axel 所说,使用 SUMPRODUCT 最好使用特定范围而不是整个列,否则公式会很慢
    • ....不,实际上有更好的方法,只需在我原来的建议中添加另一个 COUNTIF 函数,我编辑了我的答案.......
    【解决方案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:I 并单击编辑栏左侧的名称框,为列表键入名称,例如 IMSI。重复'Indiv。匹配统计信息!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))
    

    【讨论】:

      【解决方案3】:

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

      使用 SUMPRODUCT 的数组公式可以缩短公式。这将起作用,因为有可能通过 sum boolean 结果执行 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)
      )
      

      但这会产生非常糟糕的表现。这样的数组公式非常慢,尤其是对于整列。

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

      问候

      阿克塞尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多