我是VBA的新手,并且一直在为Office提供一个小的宏应用程序。我们在基本相同的PC设置上有大约80个用户,除了少数用户之外,所有用户都可以访问它们。
我一直在使用Web服务引用来访问网页的一些自动化,我还将Microsoft Scripting Runtime引用加载到项目中。我试图在测试PC上运行它并抱怨缺少引用。
我并不特别想去80台电脑并手动加载参考资料。
我的问题,基本上,我应该如何管理这个宏应用程序向80多个用户的分发,以确保每次为每个用户加载引用。
谢谢!
答案 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'是唯一可以应用的解决方案。例如:
我们的解决方案是在客户端Access文件上有2个表。一个列出了在启动时必须检查或添加的所有引用(Word将是其中之一),另一个列出文件的所有可能位置(取决于用户是否具有'office11'版本或更新版本)一个),两个表之间有一对多关系。
因此,最好的策略可能是msi包和管理之间的混合代码:
答案 3 :(得分:2)
不要让文档显示功能,而是将其作为Office(套件或单个应用程序,您的选择)的加载项。这样,您就不必处理引用。
然后,只需使用加载项分发安装包,该加载项注册组件并使用相应的Office应用程序注册加载项。
VB6可能是一个好主意,因为它与VBA相似。