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

问题摘要:当我从程序菜单启动Excel时,为什么我的程序安装的加载项无法加载,但在打开安装它们的Installer.xlsm工作簿时加载了这些加载项?

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

这工作了一年多了。 最近我们更新了加载项的层次结构,从那以后,相同的脚本将成功运行,卸载旧的加载项并安装新的加载项。 但是,当Excel重新打开时(从程序菜单或现有的工作簿),脚本似乎根本没有任何作用 – 在运行之前安装的加载项仍保持安装状态,新加载项甚至没有列出在“pipe理加载项”窗体中。 这也反映在HKCU\...\Excel\Add-in Manager – 加载项列表与运行之前保持一致。

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

笔记:

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

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

  3. 这不是registry写入访问的问题,因为如果使用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 

代码部分,它的安装的加载项:

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