使用MS Office开发VBA程序时需要注意的一些坑

介绍

VBA是一种历史悠久、易于上手的脚本语言,您可以使用它写出简单的批量表格处理程序,也可以写出复杂的网络爬虫,尽管微软官方已经逐渐要用Python替代其在Office套件中的地位,但其仍然被全世界范围内的广大人群使用着,由于它"热调试、所见即所得”的特点,它非常适合编程初学者、文职人员去学习和使用,也同时存在着较多的缺点与坑。本人进行VBA开发已有多年,在这里,我为大家整理一下,开发VBA时有哪些需要特别注意的点,如果您打算、或正在开发VBA程序,我强烈建议您看一下这篇文章。

开发项目

随时保存、定时备份

VBA项目不像一些其他编程语言,它的所有代码均保存与它的“宿主”中,这些“宿主”往往是一个Excel工作簿,或者一个Word文档,这种保存方式带来的后果是:一旦程序崩溃,未保存的更改将会消失,而一旦文档出错,您甚至会丢失您整个项目的代码,为了避免以上情况发生:

  1. 每次运行前都保存一次文档
  2. 定时将您的文档或代码备份

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程序的运行的主要有以下几点:

  1. 是否已经安装VBA扩展(Office安装界面勾选)
  2. 信任中心的ActiveX 设置
  3. 信任中心的宏设置
  4. 信任中心的受保护的视图设置
  5. 信任中心的外部内容的设置
  6. Office版本

出错时避免弹出VBA工程窗口

用户在使用程序时,突然弹出一个写满代码的窗口往往会让他们不知所措,为了避免这种情况发生,重新梳理一遍代码,在合适的位置插入on error resume nexton error goto skippoint

考虑目标用户电脑的可引用项目和控件

VBA项目的引用一直是一个头疼的问题,电脑操作系统的版本、Office的版本已经一些其他软件都会影响到VBA引用的可用性,在开发时尽量避免引用过多的外部库,或一开始就使用较低版本的Office进行开发。
对于此主题,您可以参考下我的文章《VBA判断引用库是否完整并自动修复》

考虑用户对文档进行操作后可能出现的异常

用户可能不会完全按照你的想法去做,他们可能会添加、删除某些行或列,可能会删除、改名工作表,如果您的程序中使用了这些行或列,则会导致意想不到的结果,在程序中尝试对这些对象进行操作时,先判断其是否存在。

其它技巧

使用HTML+JS扩展VBA能力

Office的VBA可以使用窗体+WebBrowser显示、操作网页,运行JS代码,如果您知道如何编写HTML和JS,您完全可以使用这些语言来扩展VBA的能力!
对于此主题,您可以参考下我的文章《VBA+HTML构建的一款兼容性强的颜色选择窗体》

添加TODO

受启发于其他编程语言,我们也可以在VBA的注释中添加“TODO”来告诉自己下一步应该做什么,然后搜索整个工程“TODO”

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值