VBA参考库

时间:2009-01-06 20:52:30

标签: vba reference ms-office

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

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

我并不特别想去80台电脑并手动加载参考资料。

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

谢谢!

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:4)

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

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

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

我们使用InstallShield进行所有部署,尽管您可以使用多个选项(有关Stack Overflow的讨论)。

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

答案 2 :(得分:3)

除了this answer,它是解决此类问题的防弹解决方案,但实现起来相当复杂,您还可以编写一些代码,以便在VBA应用程序启动时执行,检查'application'对象的'references'集合。然后,您可以检查(1)计算机上是否有可用的文件(dll,ocx,tlb)和(2)是否可以创建引用(application.references.addFromFile ...)。

注意:对象声明可能是“依赖于引用”,例如:

Dim cat as ADOX.catalog 
如果在“编译”相应模块时引用未处于活动状态,

将引发编译错误。然后,我建议您在启动模块(相当于'autoexec')中隔离您的“引用检查过程”,该模块仅处理VBA和基本应用程序对象。使用帮助文件进行检查(例如:在Access中,可以在没有外部引用的情况下使用的默认引用是VBA,Access和DAO)。

编辑:

如果外部引用依赖于其他软件包,并且(1)不能与MSI文件一起分发,或者(2)可以有多个版本,我认为'references.addFromFile'是唯一可以应用的解决方案。例如:

  • 您有一个VBA / Access运行时客户端 需要引用Word的应用程序 (msword.olb文件)。
  • 对于许可问题,您无法使用msi pack自由分发此文件
  • olb文件可以是'XP版本,也可以是较新版本

我们的解决方案是在客户端Access文件上有2个表。一个列出了在启动时必须检查或添加的所有引用(Word将是其中之一),另一个列出文件的所有可能位置(取决于用户是否具有'office11'版本或更新版本)一个),两个表之间有一对多关系。

因此,最好的策略可能是msi包和管理之间的混合代码:

  • msi非常适合分发独立的dll或其他完全“嵌入”在您应用中的文件,例如activeX控件(如扫描仪控件,报表或文件查看器等)
  • 代码是您的应用必须与用户计算机上不同版本中存在的其他应用程序(word,excel,outlook等)进行通信的最佳解决方案。

答案 3 :(得分:2)

不要让文档显示功能,而是将其作为Office(套件或单个应用程序,您的选择)的加载项。这样,您就不必处理引用。

然后,只需使用加载项分发安装包,该加载项注册组件并使用相应的Office应用程序注册加载项。

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