除了这个答案,这是解决此类问题的防弹解决方案,但实现起来相当复杂,您还可以编写一些代码以在您的 VBA 应用程序启动时执行,检查“引用”集合“应用程序”对象。然后,您可以检查 (1) 请求的文件(dll、ocx、tlb)是否在计算机上可用,以及 (2) 是否可以创建引用(application.references.addFromFile ...)。
注意:可能是“依赖于引用”的对象声明,例如:
Dim cat as ADOX.catalog
如果在“编译”相应模块时引用未激活,则会引发编译错误。然后,我建议您将“引用检查过程”隔离在仅处理 VBA 和基本应用程序对象的启动模块(相当于“自动执行”)中。用您的帮助文件检查它(例如:在 Access 中,可以在没有外部引用的情况下使用的默认引用是 VBA、Access 和 DAO)。
编辑:
如果外部引用依赖于其他软件包并且 (1) 不能与 MSI 文件一起分发或 (2) 可以有多个版本,我认为“references.addFromFile”是唯一可以应用的解决方案。例子:
- 您有一个需要引用 Word(msword.olb 文件)的 VBA/Access 运行时客户端应用程序。
- 对于许可问题,您不能随您的 msi 包免费分发此文件
- olb 文件可以是 'XP 版本或更新版本
我们的解决方案是在客户端 Access 文件上有 2 个表。一个列出在启动时必须检查或添加的所有引用(Word 将是其中之一),另一个列出文件的所有可能位置(取决于用户是否拥有“office11”版本或更新版本一),两个表之间的一对多关系。
因此,最好的策略可能是混合 msi 包和通过代码进行管理:
- msi 非常适合分发完全“嵌入”在您的应用程序中的独立 dll 或其他文件,例如 activeX 控件(如扫描仪控件、报告或文件查看器等)
- 代码是最好的解决方案,您的应用程序必须与其他应用程序(word、excel、outlook 等)进行通信,这些应用程序可能存在于用户机器上的不同版本中。