如何遍历所有加载项模块,找到指定模块并禁用对应加载项
问题描述
我开发了一款在组织内广泛使用的加载项,目前正在开发新版本,希望新版本能找到并禁用旧版本加载项。我原本尝试通过以下代码遍历Application.AddIns并根据名称禁用加载项:
Dim objAddIn as Object Dim mdl as string mdl = "old_version" For Each objAddIn in Application.AddIns If objAddIn.Name = mdl then objAddIn.Installed = False Next objAddIn
但问题是用户手动安装时可自定义加载项名称,存在多种变体。不过旧版本加载项内的模块名称固定,因此希望遍历所有加载项的模块,找到指定模块后禁用其所属加载项,但操作Application.AddIns时无法遍历每个加载项的模块,请问如何原生实现该功能?
解决方案
要通过固定模块名称定位并禁用旧版加载项,可借助Office的VBE对象模型实现,具体步骤如下:
开启VBA工程对象模型访问权限:
先在Office应用的「信任中心」→「宏设置」中勾选「信任对VBA工程对象模型的访问」,否则代码会因权限不足报错。遍历加载项工程与模块:
直接通过Application.VBE.VBProjects遍历所有已加载的VBA工程,先筛选出加载项类型的工程,再遍历其内部的所有模块,匹配到目标模块后,找到对应的加载项并禁用。
以下是完整的实现代码:
Sub DisableOldAddInByModule() Dim vbProj As VBIDE.VBProject Dim vbComp As VBIDE.VBComponent Dim targetModuleName As String Dim addInObj As AddIn targetModuleName = "OldVersionCore" '替换为旧版加载项的固定模块名称 '遍历所有已加载的VBA工程 For Each vbProj In Application.VBE.VBProjects '判断当前工程是否为加载项类型 If vbProj.Type = vbext_pt_AddIn Then '遍历工程内的所有组件(模块、类模块等) For Each vbComp In vbProj.VBComponents If vbComp.Name = targetModuleName Then '匹配到目标模块,查找对应的加载项并禁用 For Each addInObj In Application.AddIns '通过文件路径匹配,比名称/ProgId更准确 If addInObj.FullName = vbProj.FileName Then addInObj.Installed = False MsgBox "已成功禁用旧版加载项" Exit Sub '找到后直接退出,避免重复操作 End If Next addInObj End If Next vbComp End If Next vbProj MsgBox "未找到目标旧版加载项" End Sub
- 补充注意事项:
- 若加载项的文件路径存在特殊字符或权限限制,可尝试用
UCase(addInObj.FullName) = UCase(vbProj.FileName)忽略大小写匹配。 - 代码运行时需要确保Office应用处于非保护视图状态,且用户有足够的权限修改加载项设置。
- 若加载项的文件路径存在特殊字符或权限限制,可尝试用
内容的提问来源于stack exchange,提问作者David Vinnicombe
相关产品推荐
相关产品推荐

