【问题标题】:Excel CountifS. Criteria multi-column ranges. Non-ordered comparison testExcel CountifS。标准多列范围。无序比较测试
【发布时间】:2013-08-06 04:31:19
【问题描述】:

这是我在这里的第一个问题,所以如果有问题请不要杀我。我在这个网站上找到了很多解决方案,但这次没有。不幸的是,我还不能发布图片。这并不容易,但我会努力的。

重点:

我的数据有以下标题:

Decision_Id Opponent1 Opponent2 Opponent3 Suitor1 Suitor2 Suitor3 Suitor4

Decision_id 是唯一的整数标识符。其余的都是字符串。

每一行代表一个特定的司法判决。每个决定最多可以有 3 个对手(防守方)和最多 4 个追求者(进攻方)。一个特定的一方可以在一个决定中成为追求者,在另一个决定中成为对手。

我想得到什么

跨表,其中行和列标题都是我在表中遇到的不同方。 (没问题,完成。) 每个单元格显示特定对手(由行标题定义)被特定追求者(列标题)攻击的不同决定的数量=>所有对角线单元格等于零(一方不能攻击自己)并且表格不是对称的。

我试过了

应用于第一个单元格然后展开:

=COUNTIFS("所有对手的固定范围:$B$2:$D$6","想要的对手值:$A2", "所有追求者的固定范围:$E$2:$H$6", "the想要的求婚者价值:B$1")

我有一个错误。我发现标准范围必须具有相同的大小。好的,创建了虚拟空列 => 没有错误,但是,结果显然被低估了。我认为只有当对手和追求者有相同的“数字”时才有匹配。详细说明:对于每一行,excel 会针对对应的值测试对手 1 和诉讼者 1,然后是对手 2 和诉讼者 2,然后对手 3 和诉讼者 3……这实际上解释了为什么范围必须具有相同的大小。

那么,我需要什么

是,对于每一行,让 excel 测试所有对手的通缉对手值,测试所有追求者的通缉追求者值。如果至少有一个对手和一个追求者对应,给它一个匹配并计算这个决定。(即使对手1和追求者3有想要的值)

备注

我已经编写了一个 VBA 代码来完成这项工作,但是它太慢了(整个表大约需要 5 个小时),我希望对这种不同的表执行相同的操作和/或修改这个。所以我对“纯excel”,快速的解决方案很感兴趣。

非常感谢!

【问题讨论】:

  • 您对标准范围的理解是正确的...您可以通过对多个计数求和来做到这一点。

标签: excel range countif


【解决方案1】:

这里的困难部分是将多列范围分成单独的行 - 一种方法是在 COUNTIF 中使用 OFFSET,即这个公式

=SUMPRODUCT(COUNTIF(OFFSET($B$2:$D$6,ROW($B$2:$D$6)-ROW($B$2),0,1),$A2),COUNTIF(OFFSET($E$2:$H$6,ROW($E$2:$H$6)-ROW($E$2),0,1),B$1))

假设任何一排的所有追求者都是不同的,而任何一排的所有对手都是不同的(尽管如果不是这种情况,可以修改公式)。

您可以将范围扩展到您想要的任何大小 - 尽管每个部分的行数必须相同

....或者这是使用MMULT函数的另一种更晦涩的方式

=SUMPRODUCT(MMULT(($B$2:$D$6=$A2)+0,{1;1;1}),MMULT(($E$2:$H$6=B$1)+0,{1;1;1;1}))

{1;1;1} 和 {1;1;1;1} 表示每个部分中的列数,因此如果您有 6 个和 8 个,则需要相应更改

【讨论】:

  • 非常感谢。两种解决方案都运行良好,但我会保留第二个(使用 MMULT)。由于 Offset 是一个 volatile 函数,excel 会不断地重新计算所有内容,这有点烦人。谢谢!更多,我至少试图了解第一个解决方案是如何工作的,我有一个问题:在我的理解中 ROW($B$2:$D$6)-ROW($B$2) 等于零,因此 OFFSET($B$2: $D$6,ROW($B$2:$D$6)-ROW($B$2),0,1) 应该不断返回 $B$2:$D$6 的第一行,并且由于整个公式有效,因此显然不是案子。有什么意见吗?
  • ROW($B$2:$D$6) 实际上给你一个这样的数组: {2;3;4;5;6}...so ROW($B$2:$D$6 )-ROW($B$2) 给你 {0;1;2;3;4} 通常总是一个从零开始的数组,其数量或元素与你范围内的行相同。这种技术允许 OFFSET 输出一个“范围范围”——每行一个,这反过来又允许 COUNTIF 返回一个结果数组——每行一个
【解决方案2】:

另一种可能是试试这个数组公式:

=SUM(MMULT(-TRANSPOSE($B$2:$D$6=$A2),-($E$2:$H$6=B$1)))

使用 CTRL+SHIFT+ENTER 输入(或定义为名称并正常输入,例如 =Total。)

【讨论】:

  • +1 - 太好了lori_m! - 我从那条路开始,但说服自己我需要两个 MMULTS ..... :(
  • 巴里 - 谢谢!这两种方法的等价性可以从恒等式(A1)'(B1)=1'(A'B)1 中看出(对于适当大小的矩阵AB 以及1 的向量,其中' 表示转置。) 矩阵乘法前后个向量与对所有元素求和是一样的。
【解决方案3】:

应该这样做:

=       COUNTIFS($B$2:$B$6,$A2, $E$2:$E$6, B$1) 
      + COUNTIFS($C$2:$C$6,$A2, $E$2:$E$6, B$1)
      + COUNTIFS($D$2:$D$6,$A2, $E$2:$E$6, B$1)
      + COUNTIFS($B$2:$B$6,$A2, $F$2:$F$6, B$1)
      + COUNTIFS($C$2:$C$6,$A2, $F$2:$F$6, B$1)
      + COUNTIFS($D$2:$D$6,$A2, $F$2:$F$6, B$1)
      + COUNTIFS($B$2:$B$6,$A2, $G$2:$G$6, B$1)
      + COUNTIFS($C$2:$C$6,$A2, $G$2:$G$6, B$1)
      + COUNTIFS($D$2:$D$6,$A2, $G$2:$G$6, B$1)
      + COUNTIFS($B$2:$B$6,$A2, $H$2:$H$6, B$1)
      + COUNTIFS($C$2:$C$6,$A2, $H$2:$H$6, B$1)
      + COUNTIFS($D$2:$D$6,$A2, $H$2:$H$6, B$1)

如果您将数据放入表格中,或者为 Opponent1、Opponent2、Suitor1 列等定义命名范围,这些看起来会更简单......

【讨论】:

  • 非常感谢您这么快的回答!我其实想过这个解决方案,问题是实际上有 6 个对手和 8 个追求者,这使得 6 乘以 8 = 48 COUNTIFS。我一直在寻找更好的解决方案。顺便说一句,如果我定义了 48 个 COUNTIFS,这不会使执行时间非常长吗?其实我的数据是表格形式的,真的有区别吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多