VBA开发的新手提示

虽然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上的人有用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值