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

时间:2017-08-08 01:57:25

标签: 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下正确注册。
  4. 请帮助解决这个谜团!

    执行卸载的代码部分:

        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
    

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

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

1 个答案:

答案 0 :(得分:0)

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

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