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

时间:2014-12-23 11:38:45

标签: excel vba excel-vba 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.ReadOnly = True Then
        ThisWorkbook.ChangeFileAccess xlReadWrite
    End If
Else
    MsgBox ("Incorrect password.")
End If

End Sub

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

screenshot

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

1 个答案:

答案 0 :(得分:1)

VBE有时会在VBE中保留“Ghost Projects”,即使主文档已关闭。在这种情况下,ChangeFileAccess方法正在关闭工作簿(并为其保留Ghost项目),然后使用真实项目打开工作簿的新实例,但是当您观察,很难区分Ghost和真实项目。

因此,底层问题是Ghost项目的持久性。

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

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

在我的电脑上,罪魁祸首一直是Power Query Add-in,禁用加载项(并重启Excel)一直解决了问题,但YMMV。