Excel表格为什么那么慢以及怎么解决(一)

我们对Excel的直观感受就是公式一多,Excel计算速度就会很慢。但是实际上并不是这样的。Excel中很多公式并不必然导致计算速度变慢,让计算速度变慢的原因是你对公式的选择以及公式的写法。

关于Excel计算速度的问题,以前零星写过一些文章(例如:公式太多速度太慢,一招帮过你解决)。但是还是不断有人遇到这个问题,而那些招数并不适用于所有场景。因此,我决定写一系列文章详细介绍一下Excel中如何进行公式调优(关于VBA代码的速度,我们不涉及。那是另外一个话题)。
不知道能写几篇,写到哪算哪吧。今天是第一篇。

速度分析工具

工欲善其事,必先利其器。为了更好的进行讲解,我们需要一个速度统计工具。我简单做了一个工具:

很简单,选中一个区域,点击上方的“开始分析”,就会得到一个计算时间,时间是以秒为单位显示的。

我们这一系列文章都是基于这个工具进行的。这个工具是用VBA写的,你可以通过下面的方式获得这个工具:

  1. 关注本公众号:ExcelEasy

  2. 回复:计算速度分析工具

还需要强调的是,这个计算速度依赖于你的计算机的速度。这一系列文章及案例是在我的笔记本上完成的,配置如下:

另外,这个计算速度有随机性。如果你对同一个公式进行多次测试,会得到不同的耗时,不过这些不同结果不会产生数量级的差别。

计算速度慢的简要分析

速度慢的直接原因主要是公式的选择和使用造成的。我们看一个例子:

我们有一个表格记录了销量,总共5000条。D列记录了滚动销量,这个滚动销量的计算是通过公式:

=SUM($C$6:C6)

这是一个很简单的公式,单元格引用也是一个经常用到的技巧,我们来分析一下,看看5000条公式运行耗时多少呢。我们选中D列数据,然后点击“开始分析”,得到了结果:

耗时0.1秒!你可能觉得还不到1秒呢。其实已经很慢了。因为这只是一个简单的公式,如果表格中还有其他公式的话,速度很容易就超过1秒(对于一般的表来说,这就是个很慢的速度了)。

而且,随着你的数据量增多,这个数字并不是线性的。比如,如果我们的数据增加一倍至10000行(在表格下面重新粘贴一遍即可),我们得到的计算速度是:

并没有从0.1增加1倍到0.2,而是原来的四倍:

0.1 * 2的平方=0.4

也就是说随着数据量的增加,这个公式的耗时是指数增加的。这就是一个非常可怕的事情了。

我们可以重新修改一下公式:

将D6的公式改为:

=C6

将D7的公式改为:

=D6+C7

然后将D7的公式向下填充。

很容易就会发现,从计算结果的角度,这两个公式是等价的。那么,计算速度呢:

要记住我们是用了增加一倍数据量后的数据。也就是说速度从0.4变成了0.02:

0.42961/0.02739=15.68

整整15倍的速度差距啊。仅仅是一个公式的修改就产生了15倍的速度差距。

而且后一个公式写法随着数据量的增加速度是线性增加的。比如,如果我们 的数据再增加1倍至2万条(复制粘贴即可):

速度只增加了不到1倍。

这个特性非常好。搞算法研究的都知道,如果你的算法计算速度是线性的,那么恭喜你,找到了一个好的算法。如果你的算法计算速度是指数的,那就赶紧放弃吧。函数也是这样的,请千万使用一个线性的公式啊😀

那么如何找到呢?

计算速度慢的秘密

并没有一个清单列出有哪些函数是线性速度,哪些是指数速度。事实上跟函数无关,如果我们把上面例子的后一种写法写成:

=SUM(C7,D6)

都是用的SUM函数,但是速度就是会差出10多倍。

这里的关键就在于参与公式计算的单元格个数。

我们来看第一个公式:

=SUM($C$6:C6)

D6单元格,引用$C$6:C6,共1个单元格

D7单元格,引用$C$6:C7,共2个单元格

D8单元格,引用$C$6:C8,共3个单元格

......

D10005单元格,引用$C$6:C10005,共10000个单元格

如果我们在10000个单元格使用这个公式,那么共引用多少单元格呢:

1+2+3+......+10000=50005000
那么第二个公式呢:

D6单元格,引用C6,共1个单元格

D7单元格,引用C7,D6,共2个单元格

D8单元格,引用C8,D7,共2个单元格

......

D10005单元格,引用C10005,D10004,共2个单元格

我们在10000个单元格中使用这个公式,共引用了:

1+2+2+......+2=19999

两者之间差距是明显的。(之所以速度没有差的这么悬殊,是因为还有很多其他开销在里面。)
所以,基本上,很多情况下Excel公式的计算速度慢并不是因为公式太多造成的,而是因为公式中引用单元格太多造成的。

回归线经验:这确实是个真正的秘密。在进行公式优化时,大部分我们对公式的修改都是基于这个秘密原则进行的,即想法设法减少公式中引用的单元格数量。基于这个原则,我最快的是从长达20分钟的计算耗时降低到了不到1秒钟。

当然还有其他因素影响公式计算速度,在后面的文章中我们会分别给大家介绍。

总结

其实不算总结,算一个强调吧。

把计算方式从自动改为手动并不解决速度问题。

很多朋友都知道,我们可以将计算方式从自动改为手动:

网上很多文章也会教你这么做来解决公式速度太慢的作用。

实际上当然不起作用。你只是回避了这个问题,而且会产生如下副作用:

  1. 有时,你的很多图表或者报表是依赖于前面的计算结果的。如果前面结果不是实时的,那么这些图表和报表都是不准确的。

  2. 如果你的文件发给别人,别人可能忘了把这个选项打开,也不知道需要手动重新计算,就看不到最新结果。

我们设置强烈建议,一定要保持这个选项为“自动”。如果计算速度太慢,就想法设法优化你的公式。具体优化方法我会在后续文章中详细介绍。

取得本文所用文件的方式:

  1. 关注本公众号

  2. 回复:计算速度分析工具

(0)

相关推荐