Excel 中有大量数据的 SumIf

SumIf with lots of data in Excel

我想做的是对大约 20 万行数据进行简单的求和,这会导致 excel 出现问题。 基本上我的列表是这样的

List of Companies    Dummy1  Dummy2  
Company A             0       1
Company A             0       1
Company A             1       1 
Company B             1       1
Company B             0       1
Company B             0       1
....

如果特定公司的 B 列的任何行中有一个 1,我需要在该公司的 C 列的每一行中插入一个 1。
因此虚拟 2 基本上是特定公司所有条目的虚拟 1 的总和。 数据已按 A 列排序。 总之,Excel 发疯了。 我在这里做的事情是不是很愚蠢,因为我生成了太多的比较操作? 什么是完成我在这里尝试做的事情的简单方法?

我认为解决这个问题的更好方法是使用 pivot table,你可以按公司对 Dummy1 求和并得到数据作为摘要。

示例如下:

http://www.excel-easy.com/data-analysis/pivot-tables.html

enter link description here

希望对您有所帮助

根据您的样本数据,C2:C200000填写

=SUMIF(A:A, A2, B:B)

... 将根据需要执行 3 倍的 SUMIF 计算。 IF 公式只处理 TRUE 或 FALSE 的部分,具体取决于标准如何解析,因此将公式更改为如下所示,

=IF(A2<>A1, SUMIF(A:A, A2, B:B), C1)

...应该大大减少计算周期中的处理。改进的程度将取决于 A 列中有多少重复的公司值,以及 A 列是否已排序以将公司名称保持在一起。唯一公司的数量越少,您看到的改进就越大。简而言之,除非公司逐行变化,否则SUMIF不计算。

示例计算时序环境:

  • Excel 2010 64 位 (14.0.7015.1000) 运行 under Windows 7 Pro on a business class i5 laptop w/8Gbs DRAM.
  • XLSB;计算手册;保存 OFF 前重新计算工作簿;关闭自动恢复信息

测试 1: 26 家公司(公司 A 到公司 Z),每家在 A 列中有约 7683 个条目,已排序。 B 列随机 0 和 1 恢复为值。 C2:C200000 清除,计算工作表,然后填写公式 C2:C200000,新的计算周期定时完成。

 formula                                        calculation cycle (hh:mm:ss)
=SUMIF(A:A, A2, B:B)                                    00:21:44
=IF(A2<>A1, SUMIF(A:A, A2, B:B), C1)                    00:00:09

测试 2: 5000 家公司(公司 0001 到公司 5000),每家在 A 列中有约 40 个条目,已排序。 B 列随机 0 和 1 恢复为值。 C2:C200000 清除,计算工作表,然后填写公式 C2:C200000,新的计算周期定时完成。

 formula                                        calculation cycle (hh:mm:ss)
=SUMIF(A:A, A2, B:B)                                    00:22:10
=IF(A2<>A1, SUMIF(A:A, A2, B:B), C1)                    00:00:37

你无法神奇地打破时间和 space 的物理定律,但有时你可以愚弄它们。此解决方案可能并不完美,但也许是您可以接受的。

在相关说明中,大型 (r) 工作表受益于在计算完成后将其公式恢复为结果值,如果这些结果不太可能定期更改的话。虽然 复制、选择性粘贴、值 是完成此操作的相当快速的方法,但选择大量包含公式的单元格和 运行 以下子宏非常快。

sub sel_2_Value
    application.enableevents = false
    selection = selection.value
    application.enableevents = true
end sub

如果地区差异不重要(货币、日期等),那么 selection = selection.value2 就更好了。

唯一会减慢上述操作的是在重新计算时将范围内的依赖项还原为值的公式。