Excel VBA项目已生成多个Workbook对象

时间:2013-08-16 12:11:34

标签: excel vba excel-vba excel-2010

我负责一个非常大的Excel 2010电子表格,其中包含各种外部数据源的链接,包括Bloomberg,带有vba模块的65个工作表以及对其他vba加载项的引用。

我注意到VBA项目已经获得了多个工作簿对象。

有标准的ThisWorkbook。但是,许多工作表也已由Excel转换为Workbook对象,将原始工作表保留为前一个工作表的副本,减去代码。

这似乎不是任何人行动的结果。实际上,我认为不可能拥有多个Workbook对象!

例如,我有一个名为wksInputs的工作表,现在已经变成了一个Workbook对象,原来的wksInputs现在称为wksInputs1。

example

我无法删除wksInputs Workbook对象。

请有人帮忙解释一下这里发生了什么,以及我如何能够解决问题......?

非常感谢。

7 个答案:

答案 0 :(得分:2)

这是我的解决方案,它始终如一地工作,您无需手动将工作表和代码复制到空白工作簿。我已经在几个损坏的工作簿上测试了这个方法,这些工作簿在启动时给出了“自动化错误 - 灾难性故障”错误。

注意:原始损坏的文件已保存为 .xlsm

  1. 打开一个空白的Excel工作簿
  2. 开发人员标签>宏安全>禁用所有宏而不通知
  3. 关闭Excel
  4. 双击损坏的文件,例如MyFile.xlsm
  5. 文件>另存为...> MyFile.xlsb(不是.xlsm),选择 .xlsb 格式是什么诀窍
  6. 开发人员标签>宏安全>启用所有宏(或您喜欢的任何级别的安全性)
  7. 关闭Excel
  8. 双击MyFile.xlsb
  9. 该文件现已修复!如果需要,您可以将MyFile.xlsb文件重新保存为.xlsm。根据我的经验.xlsm文件很容易被破坏,所以我将养成一直使用.xlsb格式的习惯。

    希望有人发现这有用:)

答案 1 :(得分:1)

我对具有多个工作簿对象的文件存在相同的问题,并且在打开时会生成“自动化错误-灾难性故障”错误。

我将* .xlsm文件另存为* .xlsb。当我重新打开* .xlsb文件时,所有工作簿对象仍在文件中。我合理地认为文件中的错误最终会导致问题,然后辞职将自己复制到新文件中。

但是,当我关闭* .xlsb文件并重新打开原始的* .xlsm文件时,所有对象都消失了,并且该文件没有生成“自动化错误-灾难性故障”错误。

我承认很奇怪,但是问题仍然存在于* .xlsb文件中,但是原始的* .xlsm文件(我试图保存的文件)很好。

这可能是一个过,但值得一试...

答案 2 :(得分:0)

当我将工作表作为参数传递给Sub时,我的代码中出现此问题,如下所示:

  

调用BuildCodeStrings(Sheet2,sAccount)
  Sub BuildCodeStrings(wsSource As Worksheet,s As String)

为了解决这个问题,我创建了一个新的工作簿,将原版中所有合法工作表中的所有数据复制到我的新工作簿中的同名工作表中。然后将原始代码复制到新工作簿中。

然后我将子程序调用更改为

  

致电BuildCodeStrings(" IC Accounts",sAccounts)
  Sub BuildCodeStrings(sSource As String,s As String)

并在我的子程序BuildCodeString中添加了一行代码:

  

设置wsSource = ThisWorkbook.Sheets(sSource)

我不知道导致此问题的原因,但这种解决方法对我有用。

答案 3 :(得分:0)

我在PowerPoint(2007)中遇到了同样的问题,其中“Slide1”为空,无法删除。 @Scoox的答案为我指出了一个解决方案:

  1. 将所有VBA模块导出为文本(.bas)文件
  2. 将.pptm(或.xlsm)文件另存为.pptx(或.xlsx)
  3. 关闭PowerPoint(或Excel)
  4. 打开此.pptx / .xlsx并将其另存为.pptm / .xlsm
  5. 导入原始VBA文本(.bas)文件
  6. 手动将所有按钮重新关联到原始宏功能
  7. 添加原始文件中的所有外部参考
  8. 保存并测试一切正常
  9. 这对我有用,我相信它也适用于Excel。

答案 4 :(得分:0)

与Office365发生相同的问题,发现一个错误,其中我对公共常量使用相同的名称,对函数使用参数。在函数中更改了参数名称后,便不再发生。

答案 5 :(得分:0)

您可以通过执行"convert to .zip and unzip trick",然后将vbaProject.bin文件(宏代码文件)替换为具有不同工作表结构的不同项目中的vbaProject.bin来引入此行为。不知道这是OP发生的事情,而是我发生的事情。

答案 6 :(得分:0)

我的错误是由于我将工作表传递给函数,然后稍后在 for 循环中使用该变量名作为循环变量(因为我是一个糟糕且懒惰的程序员。)我在模块中有 Option Explicit所以我认为它不知道如何处理参考文献。

作为完全重写工作簿的替代方法:

  1. 将所有工作表复制到新工作簿
  2. 将所有模块、表单和类也复制到其中
  3. 将其另存为 .xlsm
  4. 将两个文件名(新的和旧的)都更改为 .zip
  5. 将文件“xl/vbaProject.bin”从新的复制到旧的
  6. 将文件名改回 .xlsm

这听起来好像您只是复制了所有内容,但这意味着您无需检查链接、命名范围、条件格式或数据验证以确保正确复制所有内容。