介绍
VBA是一种历史悠久、易于上手的脚本语言,您可以使用它写出简单的批量表格处理程序,也可以写出复杂的网络爬虫,尽管微软官方已经逐渐要用Python替代其在Office套件中的地位,但其仍然被全世界范围内的广大人群使用着,由于它"热调试、所见即所得”的特点,它非常适合编程初学者、文职人员去学习和使用,也同时存在着较多的缺点与坑。本人进行VBA开发已有多年,在这里,我为大家整理一下,开发VBA时有哪些需要特别注意的点,如果您打算、或正在开发VBA程序,我强烈建议您看一下这篇文章。
开发项目
随时保存、定时备份
VBA项目不像一些其他编程语言,它的所有代码均保存与它的“宿主”中,这些“宿主”往往是一个Excel工作簿,或者一个Word文档,这种保存方式带来的后果是:一旦程序崩溃,未保存的更改将会消失,而一旦文档出错,您甚至会丢失您整个项目的代码,为了避免以上情况发生:
- 每次运行前都保存一次文档
- 定时将您的文档或代码备份
VBA无法实现异步逻辑
VBA是一种单线程程序,它无法实现异步逻辑,如有此需求请考虑使用其他编程语言。
永远编写带条件的do loop语句
我们无法避免一念间的错误,但我们可以用习惯去规避他,在do loop 等结构中,加入次数限制,来避免程序崩溃:
i = 0
Do
something
i = i + 1
Loop While i < 10000
If i >= 10000 Then Msgbox("循环超出限制次数")
操作外部异步动作时,需要等待
当我们使用外部的异步动作(如调用解压程序等)之后,不能马上就去获取操作的结果,需要等待该操作的完成。
'构造命令文本
Shellstring2 = Sheet1.TextBox1 & " x " & Chr(34) & road & Chr(34) & " -o" & Chr(34) & Sheet1.TextBox5 & "\" & Chr(34) & " -aoa"
'用shell执行命令并监听执行结果,获取结果后继续
pid = Shell(Shellstring2, vbHide)
pid = OpenProcess(PROCESS_QUERY_INFORMATION, False, pid)
Do
GetExitCodeProcess pid, PExit
Loop While PExit = STILL_ACTIVE
对于此主题,您可以参考下我的文章《VBA综合应用——解压并剔除Excel敏感数据》
操作同名文档问题
如果一个Office文档已经打开或隐藏打开了,打开同名文档时会报错,先判断是否已经有同名文档打开了。
避免程序忙碌
在进行大批量的操作时,如果直接编写过程代码,运行时程序会长时间显示为忙碌状态,不更新显示,有时会给人一种程序已经崩溃的感觉,时间长了,任务管理器会认为该程序无法响应,为了避免这种情况发生,我们可以编写一个状态窗口(进度条),同时用doevents来避免忙碌状态:
For X = 2 To TotalRow
UserForm1.Show (0)
UserForm1.ProgressBar1.Value = 100 * (X / TotalRow)
UserForm1.Label1.Caption = X & "/" & TotalRow
DoEvents
Next
部署项目
考虑目标用户的设置
用户的设置影响到VBA程序的运行的主要有以下几点:
- 是否已经安装VBA扩展(Office安装界面勾选)
- 信任中心的ActiveX 设置
- 信任中心的宏设置
- 信任中心的受保护的视图设置
- 信任中心的外部内容的设置
- Office版本
出错时避免弹出VBA工程窗口
用户在使用程序时,突然弹出一个写满代码的窗口往往会让他们不知所措,为了避免这种情况发生,重新梳理一遍代码,在合适的位置插入on error resume next 或on error goto skippoint
考虑目标用户电脑的可引用项目和控件
VBA项目的引用一直是一个头疼的问题,电脑操作系统的版本、Office的版本已经一些其他软件都会影响到VBA引用的可用性,在开发时尽量避免引用过多的外部库,或一开始就使用较低版本的Office进行开发。
对于此主题,您可以参考下我的文章《VBA判断引用库是否完整并自动修复》
考虑用户对文档进行操作后可能出现的异常
用户可能不会完全按照你的想法去做,他们可能会添加、删除某些行或列,可能会删除、改名工作表,如果您的程序中使用了这些行或列,则会导致意想不到的结果,在程序中尝试对这些对象进行操作时,先判断其是否存在。
其它技巧
使用HTML+JS扩展VBA能力
Office的VBA可以使用窗体+WebBrowser显示、操作网页,运行JS代码,如果您知道如何编写HTML和JS,您完全可以使用这些语言来扩展VBA的能力!
对于此主题,您可以参考下我的文章《VBA+HTML构建的一款兼容性强的颜色选择窗体》
添加TODO
受启发于其他编程语言,我们也可以在VBA的注释中添加“TODO”来告诉自己下一步应该做什么,然后搜索整个工程“TODO”