无法关闭工作簿,因为Excel 2010认为它仍在被引用

时间:2011-11-11 01:34:15

标签: excel excel-vba reference vba

我有一个Excel 2010宏应用程序,它由多个工作簿文件组成。

FileName(ProjectName)
VFApp.xlsm(VFAppVBA)
VFReportClasses.xlsm(VFReportVBA)
VFImportClasses.xlsm(VFImportVBA)
VFDataClasses.xlsm(VFDataVBA)
ZShared.xlsm(ZSharedVBA)

  • 共享由所有其他工作簿引用。
  • 数据由App,Report和&导入。
  • 报告和导入均由App。
  • 引用

我试图在App文件关闭时关闭所有引用的文件。这适用于除ZShared.xlsm之外的所有内容。为此,我得到'此工作簿目前由另一个工作簿引用,无法关闭。 错误。

我在网上找到的唯一半帮助信息是http://support.microsoft.com/kb/211856http://support.microsoft.com/default.aspx?scid=kb;en-us;159794。我在ZShared的所有类中添加了一些日志记录。它的所有实例都被正确终止,并且我没有任何指向ZShared的工作簿对象。

我甚至尝试重命名文件,如(http://www.allquests.com/question/3996335/Upgrading-Add-ins-from-XL2003-to-XL2007.html)。

奇怪的是,如果我在打开VFApp.xlsm之前手动打开VFDataClasses.xlsm,那么ZShared将正确关闭而不会出现错误。如果我只打开VFApp.xlsm并让它打开所有其他引用的文件,我会收到上述错误。

任何人都有任何建议可以找出为什么Excel认为工作簿仍然被引用?

确认:

  • 每个工作簿通过工具引用其他工作簿 - >引用。
  • ZShared由公共类和具有公共subs,函数和常量的模块以及3个全局变量组成。
  • 我知道,我没有做任何事情来引用ZShared的工作簿或其他Excel对象。
  • 全局变量在ZShared中,因此我不必在每个引用ZShared的App中重新创建它们。它们通过公开InitializeGlobalClassesTerminateGlobalClasses
  • 处理
  • 我在每个类中添加了m_InstanceId并调试了所有Class_InitializeClass_Terminate的日志记录,因此我100%确定所有类的实例都正确终止。

我想知道Excel是否有可能基于使用With语句或某些未正确清除的语句创建对工作簿的隐藏引用。另一方面,只有在应用程序启动时ZShared尚未打开时,才会发生这种情况。

1 个答案:

答案 0 :(得分:0)

我从未找到过为什么Excel认为该文件仍被引用的答案。作为解决方案,我最终做了两件事。

  • 将ZShared工作簿隐藏在Excel中,以便普通用户无法看到它。
  • 将ZShared设置为只读,这样即使人们仍然打开它,我也可以用更新的版本替换该文件。

如果有人知道如何查看Excel内部的方法以了解其参考垃圾收集无效的原因,我很想知道。