最近总是遇到只有Excel表、没有数据库的情况,不太可能让别人搭Python环境来建数据库,但对常用数据库的使用也不太熟悉,也没买服务器不能让别人远程操控。再加上Python操作Excel的效率令人发指,不妨退而求其次直接学会VBA。

  没想到坑挺多的,来分享一下其中的典型。考虑到之后可能还需要使用它,可能还会遇到其他天坑,因此,不妨将本文提到的作为VBA不可不说的注意事项(第一篇)

1 要想运行之后Excel文件的大小不爆炸,你需要……

慎用Cells.xxx、Range(A:A)等选择范围极其广的,精确选择范围

(1)引言

举个例子,原始表格如下图所示,10KB:

我添加一个筛选器,设置成绩>19,结果如下,Excel文件大小不变:

接下来,我全选(也就是Cells的选择范围),将这个筛选结果复制到另一个Sheet工作表中,并保存:

您猜怎么着?
——文件大小直接爆炸啦!

并且更糟糕的是,此时再删除新表,文件大小也不会完美复原了


不过好消息是,Ctrl+Z撤回操作可以将大小完美复原。
但谁编程的时候会没事用Ctrl+Z啊?

(2)解决方式

最关键的是,确定范围的代码:

参考:

  1. Excel VBA获取最后一行列_CSDN
  2. Excel VBA-查找包含数据的最后一列_JavaRoad问答社区

对于行,确定最后一行的行号的方式是:

LastRow = Range("A" & Rows.Count).End(xlUp).Row
- LastRow = UsedRange.Rows.Count
Range("A1:N" & LastRow).Select

第一行,令 LastRow = 第A列的行数;(如果不只是需要A列的行数,而是需要所有用过的行,就用UsedRange.Rows.Count
第二行,精确选择所需要的范围,A1N[LastRow]

Rows.Count是当前版本最大的行号,2007年之前的版本最大行号是65535,而之后的版本增大了最大行数,变成1048576。这种方式获取的最后一行只会包括内容不为空的行,而UsedRange.Rows.Count找到的行,会包括仅设置了格式的行,因此建议用第一种。

对于列,确定最后一列的列号的方式是:

LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column
Range(Cells(1,1), Cells(1, LastColumn)).Select

第一行,令 LastColumn = 第1行的列数;(如果不只是需要第一行的列数,而是需要所有用过的列,就用UsedRange.Columns.Count
第二行,精确选择所需要的范围,第一行第一个,到第一行最后一个。

另一种方法:Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)。我还没试过,来源于参考的第二篇内容

倘若不确定最后一行/列的位置,直接Cells.Select,就容易出现选了非常非常多没用的东西的情况。

2 要想运行时内存不爆炸,你需要……

禁用应用程序屏幕更新、禁用事件

在每个编写的宏的最开始加上这三行:

ActiveWorkbook.Save
Application.ScreenUpdating = False
Application.EnableEvents = False

结尾加上这三行:

ActiveWorkbook.Save
Application.ScreenUpdating = True
Application.EnableEvents = True

这些代码禁用应用程序屏幕更新、禁用事件。这保证你的宏在运行时,屏幕不会闪来闪去的,Excel运存不会爆炸,同时较好地提高运行速度(亲测提高一倍左右)。等运行完了,屏幕才会统一发生变化。

参考:Excel,VBA:清除内存-码农家园-StackFlow译文,该文还提出使用Evaluate直接计算值,而不是将公式放入表中,会加速。

【笔记】Excel 2021|重要篇|(一)VBA精准控制选择范围、VBA提高运行速度并降低运行时的内存消耗的更多相关文章

  1. SQL Server 调优系列玩转篇一(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  2. 《Kafka权威指南》读书笔记-操作系统调优篇

    <Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...

  3. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记看另一篇吧】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  4. 【转】寻找最好的笔记软件:海选篇 (v1.0)

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b55.html   序言: 我见过的多数软件爱好者,无论是资深用户,还是初级用户,都有一个梦想:找到 ...

  5. Redis 笔记 01:入门篇

    Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  6. Java学习笔记:2021年12月31日下午-2022年1月1日上午

    Java学习笔记:2021年12月31日下午-2022年1月1日上午 摘要:主要记录了计算机的电气构成,学习Linux系统的原因以及关于Linux以及相关操作的基础知识. 目录 Java学习笔记:20 ...

  7. Java学习笔记 :2021年12月31日 上午

    Java学习笔记 :2021年12月31日 上午 目录 Java学习笔记 :2021年12月31日 上午 关于计算机语言 1.关于语言的分类 2.小结 关于Java语言的基础语法 1.主方法 2.其他 ...

  8. C# 《编写高质量代码改善建议》整理&笔记 --(一)基本语言篇

     题记:这是自己的观后感,工作两年了,本来打算好好学习设计模式,或者作为客户端深入了解GPU编程的,但是突然发现还有这么一本书. <编写高质量代码改善建议>,感觉这正是自己需要的. 我是做 ...

  9. Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  10. JVM笔记【1】-- 运行时数据区

    目录 (一)java内存区域管理 1.1 程序计数器 1.2 虚拟机栈 1.3 本地方法栈 1.4 java堆 1.5 方法区 1.5.1 运行时常量池 (二)直接内存 (一)java内存区域管理 C ...

随机推荐

  1. Hetao P1156 最大战力 题解 [ 绿 ][ 二分 ][ 最大子段和 ]

    最大战力 Vjudge 原题 题解 形式化题意 给定两个数组 \(a[n]\) 和 \(b[n]\) ,需要在数组 \(b\) 中选择一个区间 \(b[l,r]\) ,替换掉区间 \(a[l,r]\) ...

  2. datawhale-leetcode打卡 第013-025题

    搜索旋转排序数组(leetcode-033) 这道题非常简单,基本送分,之前做的代码还能用上 class Solution: def search(self, nums: List[int], tar ...

  3. 记录一次WPF程序进程挂起问题

    ## 1. 使用背景 开发`WPF`单进程项目,在项目中使用`MongoDB`数据库,需要连接多个不同的数据库实例,另外项目框架采用了事件聚合器来管理模块间的通知调用,基于`NetMQ`实现了一个`Z ...

  4. Arduino部分C语言含义之--“::”

    "::"在C++中表示作用域,和所属关系."::"是运算符中等级最高的.有三种作用. 1.作用域符号例如:A,B表示两个类,在A,B中都有成员member.那么 ...

  5. 8-2 MySQL 索引的设计原则(超详细说明讲解)

    8-2 MySQL 索引的设计原则(超详细说明讲解) @ 目录 8-2 MySQL 索引的设计原则(超详细说明讲解) 1. 测试数据准备 2. 哪些情况适合创建索引 2.1 字段的数值有唯一性的限制 ...

  6. Typecho网站内容的禁止复制和粘贴

    本教程讲JS实现网站内容的禁止复制和粘贴.另存为 1.使右键和复制失效 方法1: 在网页中加入以下代码: <script language="Javascript"> ...

  7. Elasticsearch搜索引擎学习笔记(二)

    可视化插件 GitHub搜索elasticsearch-head并下载,如果网络不好可以在gitee上搜索. 这是一个前端项目,需要安装nodejs. 在项目根目录执行 npm install npm ...

  8. RTC、直播、点播技术对比|腾讯云/即构/声网如何 选型 2025 版

    前言 作为一个有多年实战经验的开发者,在音视频技术领域我深刻体会到 RTC(实时通信).直播和点播三者的不同.虽然它们的核心都涉及音视频内容的传输,但在实际应用中,它们的技术实现.使用场景以及所面临的 ...

  9. 红日复现为什么失败之struct-046流量分析加msf特征总结

    struts2漏洞 一.指纹识别 s2的url路径组成(详见struts.xml配置文件):name工程名+namespace命名空间+atcion名称+extends拓展名 部署在根目录下,工程名可 ...

  10. svn提示Node remains in conflict的解决办法

    svn 更新提示Node remains in conflict 这个时候不管svn up多少次,都无法更新到最新的内容 解决办法: svn revert --depth=infinity * 其中* ...