在编辑 Excel 文件时经常遇到的一个问题是,我这边用得好好地,换台机器就变了个样,或者根本用不了。下面是我在日常工作中总结的一些避免这些情况的小技巧。
1、声明每一个 VBA 变量
预先声明每个 VBA 的变量。对方的 Excel 选项也许勾选了「要求变量申明」,你没声明变量在你这里运行没问题,到对方那边就会出错。另外,预先声明变量,是一种良好的编程习惯,可防止失误。
为防止忘记声明变量,可主动勾选 VBA 选项中的「要求变量申明」,或者在每个 VBA 模块和类模块前面都写上Option Explicit
。
2、注意数据库的连接字符串
在 Excel 表格中使用外部数据源或者 VBA 中操作数据库时,连接字符串有多个写法。通过 ODBC 连接数据库相对比较简单,但损害了 Excel 文件的可迁移性,因为对方电脑上很可能没有事先定义 ODBC 数据源。 所以,尽量使用下面第二种方法。
' 使用DSN(ODBC)连接数据库的连接字符串,需对方机器同时配置ODBC
Provider=MSDASQL;DSN=odbc_name;UID=username;PWD=password;
' 使用IP直接连接数据库的连接字符串,无需对方机器配置ODBC
driver={SQL Server};server=ip;uid=username;pwd=password;
3、避免引用 dll
比如写一段调用 Outlook 发送邮件的 VBA 代码,我可以先引用「Microsoft Office 12.0 Object Library
」,然后在代码中声明对象:
dim xOutlook as New Outlook.Application
但这样做有一个缺陷。对方的 Office 版本可能与你的不一致,从而不存在你所引用的这个问题,从而导致一连串错误。 解决问题的办法是,尽量不直接引用 dll 文件,变量声明为Object
对象,并通过CreateObject
或GetObject
来生成或获取对象。
dim xOutlook as Object
Set xOutlook = GetObject(, "Outlook.Application")
这种方法相对于直接声明Outlook.Application
对象有一个稍微麻烦的地方, xOutlook 的方法和成员不会自动完成。所以,我编写该类程序时,一般都是先申明为实际对象Outlook.Application
,写完程序后再把Outlook.Appilcation
改成Object
。
上面Outlook
只是一个例子。其它还有Word
、数据裤ADODB.Connection
等对象都应注意使用该法则。
4、避免引用外部文件
Excel 可以引用其它 Excel 文件里的数据。但它有一个缺陷, Excel 在引用外部文件时使用绝对路径。这样假设 A 文件引用相同目录下的文件 B ,那么即使你把 A、B 两个文件都发给对方,对方在打开 A 文件时也可能出错。
避免该问题的方法就是避免引用外部文件,比如特殊复制粘贴去掉公式,或者把外部数据表复制到主文件直接引用等等。如果迫不得已使用外部文件,那只能让对方到「数据->编辑链接」一栏重设链接文件的位置。
5、注意 Office 版本差异
Office 各个版本有一些差异,功能也不完全一样。 尤其要注意的是各版本的函数不一样。比如 Office 2003 里就没有 Office 2007 的IfError
函数。如果已知对方的 Office 版本有差异,一定要注意这些函数上的差异。
比如AVERAGEIF, AVERAGEIFS, CUBEKPIMEMBER, CUBEMEMBER, CUBEMEMBERPROPERTY, CUBERANKEDMEMBER, CUBESET, CUBESETCOUNT, CUBEVALUE, COUNTIFS, IFERROR和SUMIFS这些函数都是从 Office 2007 才引入的。
当然这点也可以无视。Office 2003 是应该扔到垃圾堆了。
Q. E. D.