确保Excel文件可迁移性的注意事项

作者:

在编辑 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对象,并通过 CreateObjectGetObject来生成或获取对象。

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.

类似文章:
编程 » Excel
Excel 中可设置每个单元格显示数字和文本的格式:
编程 » Excel
此篇为学习笔记。
编程 » Excel
最近看到一个比较有趣的问题, Excel 中以下表达式代表什么含义:
编程 » Excel
香港这边没有 WIND ,部门的彭博也不在我的机器上,为了取个股票价格数据都得跑来跑去。一怒之下,我写了一个 Excel 的函数,用来获取行情数据。
编程 » VBA, Excel
如果不提供错误处理方法, VBA在出错时会停留在出错之处。Excel/VBA 提供 On Error关键词来处理程序运行过程中的错误,具体有下面两种用法:
IT » 比特币, 数字货币
最近看到一篇文章 Satoshi』s Genius: Unexpected Ways in which Bitcoin Dodged Some Cryptographic Bullets ,国内有人翻译过( 中本聪的天才:比特币以意想不到的方式躲开了一些密码学子弹 )。里面说的第一个就是天才的中本聪并不是将公钥而是将公钥两次 HASH 之后作为比特币账户的地址,这可以让比特币系统抵抗量子计算机的攻击。
几天前,中行转债( 113001 )跌到 97 块钱左右(最新价格是 97.23 ),当时转股溢价率和纯债溢价率都特别低,我发了一条微博: