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

ThisWorkbook.ChangeFileAccess xlReadWrite在VBA窗口中为工作簿创建多个VBA项目,vba,excel,excel-2010,vbe,Vba,Excel,Excel 2010,Vbe,“我的工作簿”有以下打开事件: Private Sub Workbook_Open() ThisWorkbook.ChangeFileAccess xlReadOnly End Sub 然后按下这个按钮: Sub UnlockDeveloper() Dim pwd As String pwd = InputBox("Enter developer password:", "Password") If pwd = "password" Then If ThisWorkbook

“我的工作簿”有以下打开事件:

Private Sub Workbook_Open()
    ThisWorkbook.ChangeFileAccess xlReadOnly
End Sub
然后按下这个按钮:

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
通常,这一切都可以正常工作,但有时运行UnlockDeveloper子模块会导致VBA项目在VBA窗口中出现两次,我无法知道哪个是真正的文件。如果我在错误的位置进行了更改,则在关闭Excel后,更改将立即丢失


有人知道如何防止这种情况吗?

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

因此,根本问题是Ghost项目的持久性

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

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


在我的电脑上,罪魁祸首一直是Power Query外接程序,禁用外接程序(并重新启动Excel)总是可以解决问题,但YMMV。

非常有趣的问题,我回忆起几年前在Dicks博客上看到过类似的事情,发现这清楚地说明了问题的各种原因,以及在某些情况下行之有效的变通办法。至于为什么会发生这种情况,还有一个原因。我找不到一个直接的解决方案,但我认为可能有用?是否会使您的编码过时?我已经在Excel 2016 for Windows和Excel 2011 for mac下进行了尝试。我无法重新制作此问题。它似乎按预期工作:第一次加载时以只读方式打开,一旦在按钮上键入正确的密码,它将启用读写功能。当我进入VBA开发者时,那里只有一个项目。我注意到Excel关闭了现有的一个,并在读写模式下输入正确的密码后再次打开它。