SumIf在Excel中有大量数据

时间:2015-01-27 02:58:11

标签: excel sumifs

我正在尝试做的是一个简单的sumif,大约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。 因此,对于特定公司的所有条目,Dummy 2基本上是Dummy 1的总和。 数据已按A列排序。 无论如何,Excel变得疯狂。 我在这里做的只是简单的愚蠢,因为我产生了太多的比较操作? 什么是一个简单的方法来完成我在这里尝试做的事情?

2 个答案:

答案 0 :(得分:1)

我认为解决此问题的更好方法是使用数据透视表,您可以按公司对Dummy1求和,并将数据作为摘要。

以下是一个例子:

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

enter link description here

我希望这个帮助

答案 1 :(得分:1)

根据您的样本数据填写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 8 64位(14.0.7015.1000)在带有8Gbs DRAM的商务级i5笔记本电脑上在Windows 7 Pro下运行。
  • 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

Elapsed time for calculation

你无法神奇地打破时间和空间的物理定律,但有时你可以欺骗它们。这个解决方案可能并不完美,但也许你可以忍受它。

在相关的说明中,如果这些结果不太可能定期更改,那么大型(r)工作表会在计算完成后将其公式恢复为结果值。虽然复制,选择性粘贴,值是一种相当快速的实现方法,但选择包含公式并运行以下子宏的大量单元格是快速的。

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

如果区域设置差异不重要(货币,日期等),那么selection = selection.value2会更好。

唯一会减慢上述操作的是公式,其范围内的dependents将被重新计算为值,因为它们将被重新计算。