【发布时间】:2018-01-15 10:10:09
【问题描述】:
问题摘要: 为什么我以编程方式安装的加载项在我从程序菜单启动 Excel 时不加载,但在我打开安装它们的 Installer.xlsm 工作簿时加载?
详情: 我的团队开发了我们组织中各种用户使用的加载项层次结构。 我有一个 Installer.xlsm 文件,它为每个加载项安装新版本。它有一个 Workbook_Open 方法,该方法在打开工作簿时会卸载当前安装的加载项版本并安装其较新版本。
这在一年多的时间里效果很好。最近我们更新了加载项的层次结构,从那时起,相同的脚本将成功运行,卸载旧加载项并安装新加载项。但是,当 Excel 重新打开(从程序菜单或现有工作簿)时,脚本似乎根本没有效果 - 在运行之前安装的加载项仍然安装,甚至没有列出新加载项在“管理加载项”表单中。这也反映在 HKCU\...\Excel\Add-in Manager 中 - 加载项列表与运行前的列表保持一致。
但是,如果我再次打开 Installer.xlsm - 它只会加载我希望它在脚本成功运行后加载的加载项(加载新安装的加载项,而不加载脚本卸载的加载项)!就好像外接程序安装在单个.xlsm 文件的范围内...
注意事项:
加载项不是放在 Excel 的加载项目录中,而是在项目文件夹中 (C:\appname\Addins\date)。
我在 Windows 7 上使用 Excel 2010,并且在我的机器上拥有管理员权限。
- 这与注册表写入权限无关,因为相同的加载项(如果使用 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
【问题讨论】:
-
如果插件名称相同但文件夹路径不同,您是否删除了对应的旧文件?或者使旧的无法访问。如果名称相同,Excel 倾向于使用旧版本。
-
感谢@PatricK 的建议。一般来说,这可能是一件好事,但问题是即使根本没有安装加载项(所有以前的加载项都被卸载甚至从文件夹中删除),它也会发生。当我打开安装它们的 Installer.xlsm 文件时,加载了 正确 加载项(我看到在 Windows 资源管理器中打开了哪些文件)。就好像外接程序安装在单个xlsm文件的范围内...
-
检查注册表中的 LoadBehavior 设置,确保它是 3(启动时加载)而不是 2(按需加载)或 0(禁用)。还要检查禁用项目列表以确保 Excel 没有“隔离”它们。
-
只是一个想法,如果单个插件可以自己检查更新,那不是更好吗?插件更新在安全模式下启动新的 Excel 进程,打开安装程序的变体,然后退出运行插件的 Excel。然后,安装程序变体会从网络源覆盖本地版本的插件,然后正常启动新的 Excel 进程,以便运行更新的插件。然后变体自行关闭。
标签: vba excel excel-addins