未加载以编程方式安装的Excel加载项

Tam*_*viv 6 excel vba excel-vba excel-addins

问题摘要: 为什么我从程序菜单启动Excel时加载以编程方式安装的加载项,但是在我打开安装它们的Installer.xlsm工作簿时加载?

详细信息: 我的团队开发了组织中各种用户使用的加载项层次结构.我有一个Installer.xlsm文件,它为每个加载项安装新版本.它有一个Workbook_Open方法,在打开工作簿时卸载当前安装的加载项版本并安装它们的新版本.

这种方法运作了一年多.最近我们更新了加载项的层次结构,从那时起,相同的脚本将成功运行,卸载旧的加载项并安装新的加载项.但是,当重新打开Excel时(从程序菜单或现有工作簿),似乎脚本根本没有任何效果 - 在运行之前安装的加载项仍然安装并且新的加载项甚至没有列出在"管理加载项"窗体中.这也反映在HKCU\...\Excel\Add-in Manager- 加载项列表与运行前的列表相同.

但是,如果我再次打开Installer.xlsm - 它只加载我希望它在成功运行脚本后加载的加载项(加载新安装的加载项并且不加载卸载脚本的加载项)!就像加载项安装在单个.xlsm文件的范围内一样......

笔记:

  1. 加载项不会放在Excel的加载项目录中,而是放在项目文件夹(C:\ appname\Addins\date)中.

  2. 我在Windows 7上使用Excel 2010并在我的计算机上拥有管理员权限.

  3. 这不是注册表写入访问的问题,因为如果使用Excel UI安装相同的加载项,则正确注册HKCU\...\Excel\Add-in Manager.

请帮忙解决这个谜!

执行卸载的代码部分:

    For Each ad In Application.AddIns
        For Each appName In pAppNames
            If pIniMap.item("FilePrefix").Exists(appName) Then
                filePrefix = pIniMap.item("FilePrefix").item(appName)
                If Left(ad.Name, Len(filePrefix)) = filePrefix Then
                    If ad.Installed Then
                        ad.Installed = False
                        Workbooks(ad.Name).Close False
                    End If
                End If
            Else
                logger.Warn "Entry is missing for section FilePrefix, appName=" & appName, methodName
            End If
        Next appName
    Next ad
Run Code Online (Sandbox Code Playgroud)

执行加载项安装的代码部分:

For Each file In addinFiles
    curAddInPath = pAddinDir & file
    With Application.AddIns.Add(fileName:=curAddInPath)
        .Installed = True
    End With
Next file
Run Code Online (Sandbox Code Playgroud)

W-h*_*hit 1

您可能是从默认目录而不是您指定的自定义目录添加的。我在您的安装代码中添加了下面的参数。希望它有帮助。

For Each file In addinFiles
    curAddInPath = pAddinDir & file
    With Application.AddIns.Add(fileName:=curAddInPath, CopyFile:=False) 'add false to args if addin is not coming from default directory
        .Installed = True
    End With
Next file
Run Code Online (Sandbox Code Playgroud)