【问题标题】:VBA: detecting if a library is available at run-timeVBA:检测库在运行时是否可用
【发布时间】:2010-06-22 10:50:43
【问题描述】:

我有一个 xla 文件,它引用了目标计算机上可能存在或不存在的其他一些 Excel 加载项。目前 Excel 在加载 xla 时失败,并显示“编译错误:找不到项目或库”。

代码类似于:

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

用“On Error Goto AddInMissing”作为前缀并没有帮助,因为这被视为编译错误。

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

【问题讨论】:

标签: vba xla


【解决方案1】:

您可以检查Addins 集合;

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

或者你可以检查文件名

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

【讨论】:

  • +1 但写 If x = True 是非常非常错误的。
  • 谢谢,这揭示了一些东西,尽管不幸的是,这不是我所追求的。 (请原谅我的 VBA nube-ness)枚举加载项集合列出加载项,如 Excel 中的“工具|加载项...”菜单所示。这与您在 Excel 的 VB 环境中看到的 VBA 项目列表不同。我感兴趣的特定 xla 在此处列为项目,不在 AddIns 集合中。有没有办法枚举这些? (似乎工作簿集合似乎没有提供这个 - 我尝试的第一件事)
  • 可能需要弄乱宏安全设置和“信任对 VBA 项目设置的访问”但尝试;对于 Application.VBE.VBProjects 中的每个项目 ..Debug.Print proj.Name .. Next
【解决方案2】:

您不需要使用 VBE.VBProjectsApplication.AddIns:XLA 是 Workbooks 集合中的隐藏元素,因此如果您知道 XLA 加载项的名称,您可以直接签入 @987654324 @collection 看是否打开:

Public Function IsLoaded(ByVal AddInName As String) As Boolean
    On Error Resume Next
    Dim xla As Object
    Set xla = Application.Workbooks(AddInName)
    IsLoaded = Not xla Is Nothing
    On Error GoTo 0
End Function

这样您就不需要用户系统信任对 VBE 可扩展性对象模型的访问

【讨论】:

    【解决方案3】:

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

    更复杂的解决方案可能会同时考虑 AddIns 和 VBE.VBEProjects

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-20
      • 2014-05-17
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多