【VBA就是好】我可以理解你是宣传,但是不能胡说啊!

现在满大街都是Python的广告,也不管什么人,反正是告诉你别学Excel了,别学VBA了,那些东西弱爆了,赶紧来学Python吧。

说实话,我一直都是很不以为然的。作为一个有20多年使用Excel处理数据经验的表哥,我有充分的证据证明,Excel和VBA的组合还是非常强悍的。

不过这是自说自话,我也理解各机构为了推广Python课程,总是需要夸大一些的。但是我看到这篇广告,还是不太能接受:

你说Python快无所谓,说光速也行,反正不上税。但是你是怎么写的VBA程序,用Excel处理50,000行,100列数据需要15分钟啊!?

让事实说话

为了证明这个说法的错误,我决定实际检验一下,究竟在Excel里处理需要多长时间。

首先说明,数据处理时间依赖于机器的能力。我的机器配置算是比较老的了,下面是我机器配置的截图,供大家作为参考:

我准备了2倍的数据:50000行,200列:

加上表头是10000200个单元格:

至于处理数据,我选择的是同时对数据进行两个处理:

  1. 遍历所有行列,对所有除了第一列的单元格进行求和
    这个动作相当于对所有单元格进行遍历,一般对数据的处理并不会遍历所有的单元格

  2. 判断每行的第1列和100列(实际上是随便挑选两列),做两个判断

    1. 如果第一列以1结尾,并且

    2. 第100列可以被7整除

    就将该行取出,放到新的工作表中

    这个数据处理可以比拟大多数的实际数据场景了。而且,从后面的测试结果可以看出,实际上处理数据所花费的时间并不多。

    下面是代码:

    Sub t() Dim t1 t1 = Timer
    Dim arr
    arr = Sheet1.Cells(1, 1).CurrentRegion.Value Dim arr1(1 To 100, 1 To 200) Dim count As Integer
    Debug.Print "数据加载完成:" & Timer - t1 count = 1 summ = 0 For i = 2 To UBound(arr, 1) For j = 2 To 200 Sum = Sum + arr(i, j) Next j
    If Right(arr(i, 1), 1) = "1" Then If arr(i, 100) Mod 7 = 0 Then For j = 1 To 200 arr1(count, j) = arr(i, j) Next j count = count + 1 If count > 100 Then count = 1 End If End If
    End If
    Next i Debug.Print "数据处理完成:" & Timer - t1
    Erase arr Sheet2.Range("A1").Resize(100, 200).Value = arr1 Erase arr1 Debug.Print "数据复制完成:" & Timer - t1
    MsgBox ("End")End Sub

    整个代码的进行了三个计时,分别是读取数据,处理数据,和数据复制。经过测试,在我的机器上运行结果如下(单位是秒):

    数据加载完成:2.5

    数据处理完成:3.515625

    数据复制完成:3.730469

    可以看出,总共程序运行时间为3.7秒,远远少于15分钟,而这个时间还是处理了2倍的数据。

    真正的数据处理时间是3.5-2.5,只有一秒钟的时间。

    对Excel及VBA的误解和分析

    实际上,很多人(也包括很多对Excel很熟悉的人)对Excel有很多误解,而那些机构不过是利用和放大了这些误解。这些误解涵盖很多方面。下面这两个是在Excel的数据处理能力方面是最常见的:

        Excel只能处理简单的少量的数据,数据量稍大就没有办法。

        VBA太慢了,能力也不够,不如Python,又快,又方便。

    就一个误解最常见。很多人会貌似客观的说,Excel就是一个桌面的表格软件,用于进行日常的少量数据处理,就根本不是给大数据处理的。说这话的人没有想一想,如果只进行少量的数据处理,那为什么Excel需要100万行和16000多列?这么多的数据还能称为少量数据吗?数据量再多的话,Excel也支持多个工作表。当然,数据量这么多的话,一般都是各种交易产生的数据了,这个时候交易系统必然会将数据放在数据库中了。Excel也支持从数据库中读取和查询数据进行分析。

    很多人对这个说法表示赞同可能是因为数据量稍微一大就会导致表格计算过慢,但其实这是因为对Excel不熟悉造成的。实际上,大家都是用工作中摸索出来的一些技巧和网上看来的一些函数公式来对付日常工作,对于较大数据量的处理需要使用另外一套方法,需要稍微了解Excel的运行机制,这些是需要花些时间深入研究的。

    可以说,对于任何一个类似的软件,如果不进行专门设计,要想处理100万行数据,速度都堪忧。而Excel只要经过合适的设计,基本上都可以在感受不到计算时间的情况下处理大部分日常数据。关于Excel的公式计算效率,本公众号发过一系列文章,有兴趣的朋友可以阅读:Excel表格为什么那么慢以及怎么解决(二)常见求和公式的效率分析

    更何况,现在有Power Query这样的神奇功能,Excel更是如虎添翼。

    对于第二个误解来说,我觉得更多的是因为IT行业更新速度太快造成的,开发的热点每几年就转换一次。作为一个诞生了快30年的编程语言,VBA到现在还在发挥着重大的作用,已经很不容易了。(客观的说,VBA落后这一点至少是部分成立的。微软对Excel的开发环境也有自己的新思路,不过那是另外的话题了,我以后会介绍)

    不过我还是要为VBA再次摇旗呐喊:

    • 对于绝大多数(如果不是全部的话)的数据处理任务,VBA都足够了。

    • 对于大部分使用Excel的朋友来说,如果必须学习编程的话,VBA最合适了,比Python合适的多了。

    • 由于VBA与Excel的紧密集成关系,对于Excel数据处理这项工作来说,VBA做起来非常轻松,程序可以写的非常简单。

    以上这些,是我20多年来的真实体会和理解,当然,你可能需要学习一点VBA后才能真正感受到这些。

    关于学习VBA和Python来说,我还有几点补充:

    • 如果你单纯的想学习编程,从事程序员这份有前途的工作,我其实不建议你从这两个东西入手。还是应该更加系统的学习。

    • 如果你想从事现在所谓的大数据分析工作,Python是现在的热点。但是我看很多做这方面工作的,不过是在做爬虫而已。当然,也有人在用python做一些数据分析工作,不过我觉得python不是主要方面,R,SPSS之类的东西更重要一些。

    • 如果你处理数据的场景跟主要跟Excel相关,更确切的说,只要有一头(数据源或者结果报表)是Excel,比如你需要根据Excel数据制作月报,那么我建议你学习VBA。

    • VBA太容易学习了。只要入门了,遇到不会做的事情,录制一个宏简单修改一下就可以了!

好了,今天就分享到这里了!你想学习什么呢?

关注本公众号,点击底部菜单“联系客服”,与客服取得联系,索取“VBA速度测试”案例文件
(0)

相关推荐