安装 2 个版本后,在 vba 中创建一个 Visio 实例

Creating an instance of Visio in vba when 2 versions are installed

我有以下代码从 Excel 创建 Visio 实例。它适用于我安装了单一版本 Visio 的机器,但在我安装了 2 个版本(2010 和 2016)的某些机器上。在这些机器上它无法 运行 并出现错误 "Method 'Visible' of object 'IVApplication' failed"。当我检查 AppVisio 时它是空的,我猜这是因为两个应用程序都是 visio.exe。有没有办法从特定路径创建对象,或者有什么方法可以在安装 2 个版本时创建对象?

Set AppVisio = CreateObject("visio.application")
AppVisio.Visible = False
Set docsObj = AppVisio.Documents

如果您通过添加对所需版本的引用 (Tools | References) 来提前绑定它,然后 Dim 将您的对象设置为该类型,您将可以保证使用的是哪个版本.

Dim visioApplication as Visio.Application
Set visioApplication = new Visio.Application

但是,如果您的公司正在升级并且有些人使用新版本而有些人使用旧版本,那么这可能不是完整的解决方案。在没有您选择的版本的机器上,您会遇到 运行 时间问题。

要解决该问题,您可以创建 MyApp2010MyApp2016,每个都链接到相应版本的 Visio,但这对您来说有点维护噩梦...

早期绑定 确实 增加了很多好处,例如 IntelliSense 和将 大多数 运行 时错误转化为编译时错误错误,所以它可能仍然值得。

我相信有一些选择。

解决方案 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")