ThisWorkbook.ChangeFileAccess xlReadWrite在VBA窗口中为工作簿创建多个VBAProjects

Ste*_*son 6 excel vba excel-vba excel-2010 vbe

我的工作簿有以下公开活动:

Private Sub Workbook_Open()
    ThisWorkbook.ChangeFileAccess xlReadOnly
End Sub
Run Code Online (Sandbox Code Playgroud)

然后这个按钮:

Sub UnlockDeveloper()
Dim pwd As String

pwd = InputBox("Enter developer password:", "Password")

If pwd = "password" Then
    If ThisWorkbook.ReadOnly = True Then
        ThisWorkbook.ChangeFileAccess xlReadWrite
    End If
Else
    MsgBox ("Incorrect password.")
End If

End Sub
Run Code Online (Sandbox Code Playgroud)

这通常很好,但有时运行UnlockDeveloper子会导致VBAProject在VBA窗口中出现两次,我无法知道哪个是真实文件.如果我在错误的位置进行更改,则只要关闭Excel,更改就会丢失.

截图

有人有任何想法如何防止这种情况?

Thu*_*ame 1

即使宿主文档已关闭,VBE 有时也会在 VBE 中保留“幽灵项目”。在本例中,该ChangeFileAccess方法是关闭工作簿(并为其保留 Ghost 项目),然后使用真实项目打开工作簿的新实例,但正如您所观察到的,很难区分 Ghost 和真实项目。

所以,根本问题是 Ghost 项目的持久性。

幽灵项目通常是由维护项目引用的加载项引起的。主机应用程序 (Excel) 关闭主机文档,并要求 VBE 删除该项目,但 VBE 发现某些内容仍然引用该项目,因此不会卸载该项目。

根据我的经验,通常是 COM 插件错误地保存了对项目的引用。您可以通过逐一禁用 COM 加载项来识别罪魁祸首,直到问题不再重现。然后重新启用不会导致问题的加载项。您可能需要检查 Excel和VBE的加载项。

在我的电脑上,罪魁祸首始终是 Power Query 加载项,禁用该加载项(并重新启动 Excel)总能解决问题,但是 YMMV。