迭代未注册的加载项(.xla)

jev*_*lio 9 excel vba add-in excel-vba excel-addins

我需要帮助

  • 弄清楚如何使用菜单路径迭代尚未在Excel中注册的当前打开的Excel加载项文件(.xla)Tools > Add-ins.
  • 更具体地说,我对任何未出现在加载项对话框中的工作簿感兴趣,但有ThisWorkbook.IsAddin = True.

证明问题:

尝试按如下方式遍历工作簿不会使工作簿具有.AddIn = True:

Dim book As Excel.Workbook

For Each book In Application.Workbooks
    Debug.Print book.Name
Next book
Run Code Online (Sandbox Code Playgroud)

通过加载项循环不会获得未注册的加载项:

Dim addin As Excel.AddIn

For Each addin In Application.AddIns
    Debug.Print addin.Name
Next addin
Run Code Online (Sandbox Code Playgroud)

循环通过VBProjects集合可以正常工作,但前提是用户在宏安全设置中具有对Visual Basic项目的特别可信访问权限 - 这很少:

Dim vbproj As Object

For Each vbproj In Application.VBE.VBProjects
    Debug.Print vbproj.Filename
Next vbproj
Run Code Online (Sandbox Code Playgroud)

但是,如果已知工作簿的名称,则无论是否为加载项,都可以直接引用工作簿:

Dim book As Excel.Workbook
Set book = Application.Workbooks("add-in.xla")
Run Code Online (Sandbox Code Playgroud)

但是,如果名称未知,那么如何获取对此工作簿的引用,并且不能依赖用户的宏安全设置?

Chr*_* C. 10

从Office 2010开始,有一个新的集合.AddIns2与.AddIns相同,但也包含未注册的.XLA插件.

Dim a As AddIn
Dim w As Workbook

On Error Resume Next
With Application
    For Each a In .AddIns2
        If LCase(Right(a.name, 4)) = ".xla" Then
            Set w = Nothing
            Set w = .Workbooks(a.name)
            If w Is Nothing Then
                Set w = .Workbooks.Open(a.FullName)
            End If
        End If
    Next
End With
Run Code Online (Sandbox Code Playgroud)

  • 是的,我意识到有点晚了.:-)但我遇到了同样的问题,并认为它可能会帮助别人. (2认同)