虽然Python已经进入了Excel,但是彻底替换VBA尚待时日。作为一个10多年的重度VBA用户,分享一些技巧。欢迎阅读点赞。谢谢!
1,MS Office装好后,启动Excel。开发工具菜单不是默认项。如果你菜单没有,需要去文件\选项\自定义功能区勾选开启。如果不打开这个菜单,可以按alt+F11快速进入VBA编辑器。
2,为了实时显示单元格内容变化,Excel默认实时刷新。比如你有10个单元格,每改一个就刷一次,一共刷十次。这个可以在选项配置菜单去改成手动重算,变成10个单元格都改完后,按F9一次性刷新。同理,如果你的代码要变更单元格内容,为了提升计算效率,可以在代码开头声明完变量后,加入以下语句禁止实时刷新。
application.ScreenUpdating=False
代码运行结束,end sub前添加以下语句恢复。
application.ScreenUpdating=True
除了以上好处,屏蔽刷新还可以防止程序运行途中鼠标键盘的干扰。
3,两种方式声明一个新的对象。一为用new关键字,一为createobject。建议开发调试阶段先用new,VBA编辑器能自动提示和完成代码。完成后,将其转为createobject,方便代码在不同的PC上运行--如果用new声明,而运行PC与开发PC的组件代码版本不同,会造成"对象xxx丢失"错误。比如在VBA编辑器菜单工具\引用勾选Microsoft Word 16.0 Library,用new声明开发和交付。在新PC上运行,microsoft word版本是15.0,那么就会提示Microsoft Word 16.0 Library丢失(missing)错误。
4,这一点是第3点的补充。new转createobject声明时,set xxx = createobject("yyy"),yyy用new后面的对象名替代即可,如word.document,word.application等。
5,这一点继续补充第3点。Excel / Word / PPT...的VBA都只是基于其自身对象去构建环境。比如Excel里开VBA,你声明new word,word不会自动提示。强行运行还报“用户类型未定义”错误。需要额外支持的对象,都得在VBA编辑器菜单工具\引用勾选后,才能用new声明。
6,VBA编辑器自带强大的调试功能。代码窗口双击左边原点位置或按F9,可以将该行代码设为断点,程序运行到这里会停下,方便你在立即窗口观察变量的值或者错误,以便分析摸索解决方案。VBA程序运行出错,提示错误的时候,你选择调试,就会进入VBA编辑器,看到黄色高亮的代码,即出错行。调试菜单中有更多调试选项及其快捷键。
7,如果你有几千上万行数据要读取和修改。建议先声明一个数组变量,将单元格值赋值给数组,修改完后,数组写入单元格。如果逐个单元格读写,速度非常慢,乃至你会认为程序已经卡死。
8,数组分静态和动态数组。静态,顾名思义,就是大小固定的,一经声明,不可改变。好处就是简单,坏处就是可能费空间或者空间不够。动态数组,就是大小可以变。dim array() as xxx声明(xxx是数据类型,比如string),运行中通过redim preserve array(n)重声明。一定要用preserve关键字,否则n以前的数组值都丢失。
9,有时候不影响结果的警告会打断程序运行,这个时候可以通过代码抑制。
application.DisplayAlerts=False
结束程序前用以下代码还原。
application.DisplayAlerts=True
10,VBA不是强类型语言,变量可以不声明就拿来用。为规范代码,你可以转强类型,在每个代码页面使用Option Explicit语句强制。
11,代码有效性分全局和私有。默认情况下为私有,各工作簿工作表代码页代码仅限于本页调用,如果要全局调用,可将private改为public。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
12,如果需要全局引用的代码,建议插入一个模块,将代码放在模块页中。每个模块页可以改成一个有意义的名字,不使用模块1,模块2...
13,立即窗口,可以用? xxx(xxx是变量名)快速打印变量的值到立即窗口。代码中可以用debug.print输出变量值到立即窗口。
14,代码注意行列缩进。选中需要调整缩进的代码模块,按tab缩进,shift+tab反缩进。
15,工具\VBA Project属性窗口中,可以设置项目密码,防止别人查看代码。这个只能防一般人,网上有VBA代码破解。但至少让人不容易抄袭你的劳动。
16,写好的代码,发布时,除了在工作表里放个按钮,你还可以通过office ribbon editor工具,将你代码绑定在office菜单里,美观大气。具体自行搜索。可以私信讨论。改日我单独为文,讲这事。
17,运行时,esc键是中断键,会被VBA监听。所在程序界面,一旦你按下,运行中的VBA程序会被中断。
18,给一个函数或者过程传递参数有2方式。byval,就是传值。编译器把变量拷贝一份传给函数或过程。函数或过程中对参数值的改变不影响原变量值。byval传参,编译器不拷贝,直接传递。函数或过程中对参数值的改变就改变了变量值。
19,一个单引号'注释一行。两个'''(三个单引号)间的代码都被注释掉。
今天就想到这些,写到这里。希望对仍然奋斗在VBA上的人有用。