最近总是遇到只有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. maven项目中解决 .git文件太大问题

    一.git项目上传后项目文件太大,git filter-branch手动清理 最近发现一个项目git目录已经达到200MB,严重影响了clone代码.操作之前请全量备份代码,操作失误可恢复 二.测试项 ...

  2. 为什么Raft算法是分布式系统的首选?

    背景 当今的数据中心和应用程序在高度动态的环境中运行,为了应对高度动态的环境,它们通过额外的服务器进行横向扩展,并且根据需求进行扩展和收缩.同时,服务器和网络故障也很常见. 因此,系统必须在正常操作期 ...

  3. [POJ3237] 树的维护 题解

    一眼树链剖分或 \(LCT\),由于在学后者所以就写了. 取反操作相当于把 \(min,max\) 取反后交换,所以要维护 \(min,max,val\). 时间复杂度 \(O(m\log n)\). ...

  4. win7系统安装mysql新建数据库/数据表及故障处理,安装mysql后net start mysql服务无法启动

    问题描述:win7系统安装mysql,安装mysql后net start mysql服务无法启动 1.下载mysql: 官网地址:https://dev.mysql.com/downloads/mys ...

  5. mysql安装以及2059 - Authentication plugin 'caching_sha2_password' cannot be loaded:报错的解决办法

    2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_ ...

  6. Supervisor-进程守护工具

    前言 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理 ...

  7. HTTP内容编码和HTTP压缩的区别

    HTTP压缩,在HTTP协议中,其实是内容编码的一种. 在http协议中,可以对内容(也就是body部分)进行编码, 可以采用gzip这样的编码. 从而达到压缩的目的. 也可以使用其他的编码把内容搅乱 ...

  8. Delphi CheckListBox 用法

    for i := CheckListBox1.Items.Count-1 downto 0 do //从后面往前面删 begin if CheckListBox1.Checked[i] then // ...

  9. [每日算法] leetcode第3题:无重复字符的最长子串

    leetcode第3题入口 题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解法1: ...

  10. DeepSeek 会话补全 API

    DeepSeek 会话补全 API 是一个超强大的 AI 对话接口 ,可以让你: 打造自己的 智能聊天机器人 让 AI 帮你 写文章.改代码.编故事 甚至模拟 各种角色(比如猫娘.霸道总裁.科幻作家- ...