前言上一节我们讨论了 Python 在数据处理上的优势,前后台大概收到的有用评论如下:
真希望他们评论的同时能自己动手实践一下,后续我会逐一使用 power bi(不仅仅 pq,也用 dax),sql 实现。只要能提高工作效率,我非常乐意学习,也从不只看重某一种工具。 但是今天我要首先替 vba 说一句公道话,难道Excel数据处理任务的vba代码,真的不可能做到像 pandas 一样简洁直白吗?某些场景下,绝对可以! 实战案例是数据拆分,如果你觉得其他实现方式能比今天的代码更加简洁,欢迎给出你的答案,而非仅仅一句'xxx工具比你简单'! 泰坦尼克号沉船事件中的乘客信息表: 实现几个简单的拆分需求:
需要达到以下目标:
说白了,就是要提升 vba 的开发效率(写代码的时间) 与 保持执行效率(代码执行时间) 在固定逻辑中,插入自定义逻辑上一篇文章的后半部分已经说明了为什么 vba 中写不出来像 pandas 的数据处理库,这里不再复述。 但是,vba 真的就不能做到'封装固定逻辑的同时,给予使用者放入自定义逻辑' 吗? 如下数据:
vba中实现这个有许多方式,我就用最常用的一种方式,数组+字典:
当然也可以先排序,遍历判断边界。怎么实现分组其实没关系。
关键是,与需求相关的核心逻辑,是上图红框部分,就那么一小段的代码。 如果能够把非红框部分的代码包含在一个方法中,那么以后不管啥数据啥需求,分组相关的操作只需要调用这个方法就可以!
看看我们要怎么做到。 首先,把关键逻辑提取出来成为方法:
固定逻辑中,我们需要动态调用:
此时,固定逻辑的方法,可以单独收起来到一个通用模块(或类模块),里面的代码以后都不需要改动。以后你在新项目中要使用,只需要导入这个模块就可以。 这就是 vba 中实现插入逻辑的实现方式,非常简单。
核心原理就是这样子,我把这些固定方法定义在 vba_pd 模块下: 现在看看实际应用是怎么样? 需求1:按'性别',把数据拆分到不同的工作表,工作表名字使用'性别(值)' 先看 pandas : vba:
虽然看起来 vba 代码多一些,但多出来的只是一些通用细节:
可以说,代码上的多余表达两者都非常少,这需求可以说打个平手 那么,可不可以做成多关键列分组? 需求2:按 '性别'、'船舱等级',把数据拆分到不同的工作表,工作表名字使用'性别(值),船舱等级(值)' 先看 pandas : 再看vba: ![]()
对比结果也与前一个需求一样,打个平手。 数据的传递需求3:按 '性别' ,把数据拆分到不同的工作簿(文件),文件名字使用'性别值.xlsx',每个对应文件中,按 '船舱等级',拆分到不同的工作表,工作表名字使用'船舱等级(值)' pandas 实现: ![]() vba 实现: ![]()
如果你还没有理解这种代码的优点,你不妨自己动手用自己的方式实现一次。 不仅仅只是分组'你没有超越 pandas 呢!' 额,是的,毕竟我只是用了几十分钟做的小模块,自然不能与人家整个社区做了几十年的积累相比。 有些人可能以为这玩意只能做分组,实际上这与数组、字典这些玩意一点关系都没有,核心还是那句,'固定逻辑中,允许插入自定义逻辑'。 所以,理论上vba可以做到如下实现代码: ![]()
|
|