【问题标题】:Creating an instance of Visio in vba when 2 versions are installed安装 2 个版本时在 vba 中创建 Visio 实例
【发布时间】:2019-10-16 16:27:09
【问题描述】:
我有下面的代码来从 Excel 创建一个 Visio 实例。它适用于我安装了单个版本的 Visio 的机器,但在某些机器上我安装了 2 个版本(2010 和 2016)。在这些机器上,它无法运行并出现错误“对象'IVApplication'的方法'Visible'失败”。当我检查 AppVisio 时它是空的,我猜这是因为这两个应用程序都是 visio.exe。有没有办法从特定路径创建对象,或者在安装 2 个版本时创建对象?
Set AppVisio = CreateObject("visio.application")
AppVisio.Visible = False
Set docsObj = AppVisio.Documents
【问题讨论】:
标签:
vba
visio
createobject
【解决方案1】:
我相信有一些选择。
解决方案 1(我会推荐这个)。在您的开发计算机上仅安装 Visio 2010(并卸载 2016)。无论如何,拥有您希望您的应用程序在您的开发机器上运行的最低版本是最安全的。在 Excel 中添加对 Visio 2010 类型库的引用。删除对 Visio 21016 类型库的引用。 Visio 版本向上兼容,因此代码即使在装有 Visio 2016 的机器上也应能正常运行。
解决方案 2. 使用后期绑定。从您的 excel 项目中完全删除对 Visio 的引用,并仅使用类似脚本的访问。在这种情况下,您将失去自动完成功能。如果您的应用程序不是很大,那应该不是问题。
解决方案 3.(如果您想运行特定版本)。您可以从程序文件(与任何其他可执行文件一样)启动 Visio 应用程序,然后使用“GetObject(...)”而不是“CreateObject(...)”连接到它
顺便说一句,有一种更好的方法可以将 Visio 作为不可见的应用程序运行(不闪烁):
Set appVisio = CreateObject("Visio.InvisibleApp")
【解决方案2】:
如果您通过将引用 (Tools | References) 添加到所需版本然后Dim将您的对象作为该类型来提前绑定它,您将得到保证您使用的是哪个版本。
Dim visioApplication as Visio.Application
Set visioApplication = new Visio.Application
但是,如果您的公司正在升级中期并且有些人拥有新版本而有些人拥有旧版本,那么这可能不是完整的解决方案。您会在没有您选择的版本的机器上遇到运行时问题。
要解决该问题,您可以创建 MyApp2010 和 MyApp2016,每个都链接到适当版本的 Visio,但这对您来说有点维护噩梦...
早期绑定确实增加了很多好处,例如 IntelliSense 并将大多数运行时错误转化为编译时错误,所以它可能仍然值得。