6

我是 VBA 新手,一直在为 Office 编写一个小型宏应用程序。我们有大约 80 个用户使用基本相同的 PC 设置,除少数用户外,所有用户都可以访问它。

我一直在尝试使用 Web 服务引用访问网页的一些自动化,并且我还将 Microsoft Scripting Runtime 引用加载到项目中。我试图在测试 PC 上运行它,但它抱怨缺少引用。

我不是特别想去大约 80 台 PC 并手动加载参考。

基本上,我的问题是我应该如何管理这个宏应用程序向 80 多个用户的分发,以确保每次都为每个用户加载引用。

谢谢!

4

4 回答 4

6

在大多数情况下,后期绑定将解决 VBA 中的引用问题,除非您有一些不寻常的引用。大多数问题是由可以通过后期绑定克服的库版本差异引起的。使用 VBA,通常建议您使用早期绑定进行开发,但使用后期绑定进行发布。后期绑定的主要缺点是将内置常量更改为值(速度不再是过去的问题。)

所以:

Dim fs As Object 'Instead of FileSystemObject '
Dim xl As Object 'Instead of Excel.Application '

Set fs=CreateObject("Scripting.FileSystemObject")
Set xl=CreateObject("Excel.Application")

'Value instead of built-in constant '
ForReading=2
Set f = fs.OpenTextFile("c:\testfile.txt", ForReading)
于 2009-01-06T22:44:21.823 回答
4

如果您有应用程序所依赖的引用,并且您知道不会出现在目标 PC 上,那么我强烈建议您研究一些安装程序技术。

使用安装程序,您应该能够安装宏,并安装和注册所有适当的引用/库。

Windows 上通常有两种风格,基于 Windows Installer 的技术和基于脚本的技术。

我们在所有部署中都使用 InstallShield,尽管有几个选项供您使用(在 Stack Overflow 上有几个讨论)。

使用 Windows 安装程序技术,您可以构建 MSI 安装文件,然后您可以使用组策略自动部署这些文件。

于 2009-01-06T21:04:46.487 回答
3

除了这个答案,这是解决此类问题的防弹解决方案,但实现起来相当复杂,您还可以编写一些代码以在您的 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 等)进行通信,这些应用程序可能存在于用户机器上的不同版本中。
于 2009-01-06T21:20:11.090 回答
2

与其让文档公开功能,不如让它成为 Office 的加载项(套件或单个应用程序,您的选择)。这样,您不必处理引用。

然后,只需分发带有注册组件的加载项的安装包,并将加载项注册到适当的 Office 应用程序。

VB6 在这里可能是一个好主意,因为它与 VBA 相似。

于 2009-01-06T21:01:57.490 回答