2010-06-22 53 views
0

我有一个xla文件引用了目标机器上可能存在或不存在的其他一些Excel加载项。目前,Excel在加载xla时出现“编译错误:找不到项目或库”失败。VBA:检测库是否在运行时可用

代码是一样的东西:

Dim result as Integer 
    result = SomeAddIn.SomeFunction(x) 

添加前缀,这与“对错误转到AddInMissing”,因为这被看作是一个编译错误,并没有帮助。

那么,是否有任何方法在VBA中按名称延迟绑定/引用加载项,这样如果某个加载项不存在,我可以优雅地失败(禁用某些功能)?

+0

可能会感兴趣:http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.programming/2005- 03/1672.html – Fionnuala 2010-06-22 11:05:46

回答

1

您可以检查Addins集合;

if AddIns("The addins title").Installed = True then ... 

,或者你可以检查文件名

For Each Item In AddIns 
    Debug.? Item.Path, Item.Name 
Next 
+1

+1但是写'如果x = True'只是可怕的,可怕的错误。 – 2010-06-22 11:04:17

+0

谢谢,这揭示了一些事情,但不幸的是我不知道我在做什么。 (请原谅我的VBA nube-ness)枚举AddIns集合会列出Excel中的“工具|加载项...”菜单所示的加载项。这与您在Excel的VB环境中看到的VBA项目列表不同。我感兴趣的特定xla在此列为项目,不在AddIns集合中。有没有办法列举这些呢? (似乎工作簿集合似乎没有提供 - 我尝试的第一件事) – 2010-06-22 12:03:45

+0

可能需要混淆宏安全设置和“信任访问VBA项目设置”,但尝试;对于每个proj在Application.VBE.VBProjects ..Debug.Print proj.Name ..下一步 – 2010-06-22 13:12:57

0

谢谢大家。遍历Application.VBE.VBProjects允许我检测xla是否存在。下一步是将所有对目标xla中定义的函数的调用包装在一个包装模块中。这是必要的,因为我试图避免出现编译错误。如果xla可用,我只调用这些包装函数,幸运的是VBA在需要时才编译模块(这基本上意味着创建两个包装 - 外包装检查xla是否可用,内层是否调用目标xla)。

一个更复杂的解决方案可能会看

0

你并不需要使用VBE.VBProjects或加载项加载项都与VBE.VBEProjects:一个XLA是工作簿集合的一个隐藏的成员,所以如果你知道您可以直接在Workbooks集合中检查XLA的名称,以查看它是否已打开。 这种方式你不需要用户系统具有信任访问VBE