2009-01-06 80 views
6

我是VBA的新手,并且一直在为Office提供一个小型宏应用程序。在基本相同的PC设置中,我们已经有大约80位用户,并且只有少数用户可以访问它。VBA参考库

我一直在玩一些使用Web服务引用访问网页的自动化,并且我还将Microsoft脚本运行时引用加载到项目中。我试图在一台测试PC上运行它,并且抱怨说缺少参考文献。

我并不特别想绕过80台PC并手动加载参考。

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

谢谢!

+0

如果你的参照依赖链接到其他软件所能比存在不同的版本(例如Excel 2003或Excel 2007),安装程序解决方案将不会提供预期的结果。 – 2009-01-07 06:38:57

回答

2

而不是让文档公开功能,使其成为Office(套件或单个应用程序,您的选择)的加载项。这样,你不必处理参考。

然后,只需分发一个安装包,并在其中注册组件并在适当的Office应用程序中注册加载项。

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

4

如果您有应用程序依赖的引用,而您知道不会在目标PC上运行,那么我强烈建议您调查一些安装程序技术。

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

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

虽然有几个选项供您使用(有几个关于堆栈溢出的讨论),但我们使用InstallShield进行所有部署。

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

+0

安装程序技术将不允许管理“外部软件”引用,例如对Office,Excel或Outlook对象库的引用。另一个问题是当不同的机器使用不同版本的Excel时......我在答案中添加了关于这些特定问题的一些词语。 – 2009-01-07 10:10:38

2

除了this answer,这是解决这类问题的防弹解决方案,但实现相当复杂,您还可以编写一些代码在VBA应用程序启动时执行,检查'引用''应用程序'对象的集合。然后,您可以检查(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包
  • 分发OLB文件既可以是“XP版本或更新一个

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

所以,最好的策略可能是MSI包和管理之间的混合通过代码:

  • 微星是伟大的分配独立的DLL的或在您的应用程序,是完全“嵌入式”等文件,例如ActiveX控件(如扫描仪控制,报告或文件浏览器等)
  • 代码是你的应用程序将有可以在用户的​​机器不同的版本存在其他应用程序(Word,Excel和前景等)沟通的最佳解决方案。
5

大多数情况下,后期绑定将解决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)