嫌Excel VBA执行速度慢,这些建议你一定要看
Excel是办公利器,这无需多言。尤其在办公室,Excel用的熟练与否,会的Excel知识点多不多,很大程度上决定了你工作是否高效,能否按时打卡下班。可我们也时常听到这样的吐槽:Excel好是好,可就是表格大了之后,公式多了之后,它运算起来忒慢了。
我们写VBA宏,除了要实现特定的自动化功能,还肩负一个极其重要的使命:让Excel快起来~那么如何优化我们的VBA代码,给Excel宏提速呢?
方法一:启用【手动计算】
我们都知道【公式】菜单栏有【计算选项】,可以选择【自动计算】、【手动计算】,一般Excel默认是自动计算。如果我们的工具是VBA+Excel公式结合,那么VBA每执行一行,更改了某些单元格值,则整个Excel都会自动计算一遍公式。我们完全可以在VBA代码开始时先切换到【手动计算】,等VBA主体执行完后,再切换到【自动计算】,减少过程中不必要的计算开销。

具体到代码层面,写起来也是非常简便:
Application.Calculation = xlManual '手动
'在【手动】状态下,需要点击【开始计算】来触发excel计算公式
Application.Calculate '开始计算
Application.Calculation = xlAutomatic '自动计算
方法二:关掉Excel窗口的刷新功能
当我们的VBA代码飞速执行时,伴随着单元格值在不停变化,Excel界面也在快速计算和刷新着,这都会拖慢VBA的执行速度,因此大多数情况下,我们可以选择关掉页面的刷新,执行完不要忘记恢复它的刷新功能,代码如下:
Application.ScreenUpdating = False '关掉屏幕刷新
Application.ScreenUpdating = True '重新启用屏幕的刷新功能
方法三:代码中少用Excel公式,擅用字典
很多刚开始写VBA的人,由于对语法还不是很熟悉,这类人更倾向于在脚本里大量调用EXCEL基本的公式,如application.WorksheetFunction.VLookup(),这样可以显著提升脚本的开发效率,本是无可厚非的事儿。随着我们对VBA原生语法和数据类型越来越熟悉,不妨把Vlookup、Hlookup等函数,替换为用VBA字典实现。它语法更灵活,可以轻松实现表格从右往左的反向查找。因为字典这类数据结构(Key,Value)查询要比Vlookup等公式的匹配速度快很多。
方法三:把Excel文件当数据库来访问
把每个工作表看作是数据库表,用SQL查询来提升VBA速度。VBA中使用SQL(结构化查询语言(Structured Query Language))连接某个Excel数据源(DataSource),可以隐式连接,而无需像workbooks.open那样显示加载打开的表,对代码速度的提升显而易见。使用SQL来过滤、筛选、条件判断、分组、求最值等,更是可以让VBA速度快到起飞,数据透视表都瞬间变得不香了。唯一的缺点,SQL的学习成本比VBA和公式还是要稍高些,间接拉高了学习门槛。但话又说回来,真正会写SQL之后,你会发现以前一些略显复杂的需求瞬间变得SO EASY。大胆去学吧,相信你绝不会后悔!
改进了VBA代码中这些细节后,你会发现,VBA原来可以这么快!

后续的随笔中,小爬会带大家一起认识SQL,解锁更多数据分析的技能,共同领略VBA+SQL的威力~
快来扫码关注我的公众号 获取更多爬虫、数据分析的知识!

嫌Excel VBA执行速度慢,这些建议你一定要看的更多相关文章
- 2017-5-29 Excel VBA 小游戏
---恢复内容开始--- 转一个Excel VBA的小游戏,最近对excel有了更深入的了解,功能很强大,也刷新了我对待事情的态度. 一.准备界面 我们先来把游戏界面准备好,选中前4行,行高调成50, ...
- Excel VBA(宏):添加宏
写在前面: .编写宏,打开VBA,双击ThisWorkbook对当前工作薄进行编写宏:双击Sheet1,对整个sheet编写宏: 或者创建模块,在模块里,编写.调试代码. 打开VBA的方法见第一讲,结 ...
- Excel VBA入门(六)过程和函数
前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...
- Excel VBA入门(五)Excel对象操作
本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...
- 如何调试Excel VBA代码
Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试. 1.编译错误 常见的编译错误有: 错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色. 错误的语法结构, ...
- Excel VBA 连接各种数据库(三) VBA连接SQL Server数据库
本文主要涉及: VBA中的SQL Server环境配置 VBA连接SQL Server数据库 VBA读写SQL Server数据 如何安装SQL Client 系统环境: Windows 7 64bi ...
- 在Excel VBA中使用SQL到底优势在哪儿
小爬在之前的博文中多次提到,可以在VBA中写SQL来操作Excel文件,实现各类数据处理和分析需求.那么,你可能有这样的疑问:Excel原生的VBA,数据透视表,数据分析功能不够吗,为啥一定要用SQL ...
- 来吧!带你玩转 Excel VBA
来吧!带你玩转 Excel VBA 从错失良机到艰辛的DOS征程,从坎坷购机自学路到转机起程,从爱好到事业,他从一个完全不懂电脑的人到VBA高级应用者,一切全是自学…… 我是罗刚君,来自四川的一个小县 ...
- C#调用Excel VBA宏
近日的一系列工作是做网站的营运维护,因此做了大量的支持工具.有Excel中写VBA的,也有直接C#做的工具.有时需要在C#中执行Excel VBA宏,甚至有时还需要在执行了VBA宏之后,获取返回值再进 ...
随机推荐
- JAVA整合kaptcha生成验证码 (字母验证码和算术验证码)
引入maven <!--图片验证码--> <dependency> <groupId>com.github.penggle</groupId> < ...
- C++11之重写说明符override和final
关于 本文代码演示环境: win10 + vs2017 一个困扰 之前MFC用的多了,发现一个问题: 子类窗口的某个函数是否重载了基类的函数.解决办法是: 打开基类的代码,一个个排查. 这只是一个具体 ...
- 【LeetCode】145. Binary Tree Postorder Traversal 解题报告 (C++&Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leetc ...
- 【九度OJ】题目1206:字符串连接 解题报告
[九度OJ]题目1206:字符串连接 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1206 题目描述: 不借用任何字符串库函数实现无 ...
- 【LeetCode】427. Construct Quad Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】528. Random Pick with Weight 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/random-pi ...
- F. Geometrical Progression
http://codeforces.com/problemset/problem/758/F F. Geometrical Progression time limit per test 4 seco ...
- EXCEL技能 | EXCEL中实现地图快照,截大图、加水印、保存PNG、TIF、HTML文件
1 应用场景 本文分享笔者使用EXCEL制作地图的体验. 之前网上有人介绍使用小O地图EXCEL插件版能够在EXCEL中标注地图.绘制地图.可视化数据等操作.如下截图.笔者通过实验,其软件保存方式只能 ...
- 第四十九个知识点:描述在IPsec和TLS后的基本想法
第四十九个知识点:描述在IPsec和TLS后的基本想法 网络安全协议(Internet Protocol Security,IPsec)和安全传输层协议(Transport Layer Securit ...
- [C++]vector去除重复元素
#include <iostream> #include <vector> #include <algorithm> #include <set> us ...