我正在尝试做的是一个简单的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变得疯狂。 我在这里做的只是简单的愚蠢,因为我产生了太多的比较操作? 什么是一个简单的方法来完成我在这里尝试做的事情?
答案 0 :(得分:1)
我认为解决此问题的更好方法是使用数据透视表,您可以按公司对Dummy1求和,并将数据作为摘要。
以下是一个例子:
http://www.excel-easy.com/data-analysis/pivot-tables.html
我希望这个帮助
答案 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
。
样本计算时间环境:
测试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
你无法神奇地打破时间和空间的物理定律,但有时你可以欺骗它们。这个解决方案可能并不完美,但也许你可以忍受它。
在相关的说明中,如果这些结果不太可能定期更改,那么大型(r)工作表会在计算完成后将其公式恢复为结果值。虽然复制,选择性粘贴,值是一种相当快速的实现方法,但选择包含公式并运行以下子宏的大量单元格是快速的。
sub sel_2_Value
application.enableevents = false
selection = selection.value
application.enableevents = true
end sub
如果区域设置差异不重要(货币,日期等),那么selection = selection.value2
会更好。
唯一会减慢上述操作的是公式,其范围内的dependents将被重新计算为值,因为它们将被重新计算。