10

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

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

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

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

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

例子

我无法删除 wksInputs Workbook 对象。

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

非常感谢。

4

7 回答 7

2

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

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

  1. 打开一个空白的 Excel 工作簿
  2. 开发人员选项卡 > 宏安全 > 禁用所有宏而不通知
  3. 关闭 Excel
  4. 双击损坏的文件,例如 MyFile.xlsm
  5. 文件 > 另存为... > MyFile.xlsb(不是 .xlsm),选择.xlsb格式就是诀窍
  6. 开发人员选项卡 > 宏安全 > 启用所有宏(或您喜欢的任何安全级别)
  7. 关闭 Excel
  8. 双击 MyFile.xlsb

该文件现已修复!如果需要,您可以将 MyFile.xlsb 文件重新保存为 .xlsm。根据我的经验,.xlsm 文件很容易损坏,因此我将养成始终使用 .xlsb 格式的习惯。

希望有人觉得这有帮助:)

于 2016-09-26T17:48:17.897 回答
1

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

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

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

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

调用 BuildCodeStrings("IC Accounts", sAccounts)
子 BuildCodeStrings(sSource As String, s As String)

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

设置 wsSource = ThisWorkbook.Sheets(sSource)

我不知道是什么导致了这个问题,但这个解决方法对我有用。

于 2014-05-27T17:28:53.073 回答
1

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

我将 *.xlsm 文件保存为 *.xlsb。当我重新打开 *.xlsb 文件时,所有工作簿对象仍在文件中。我合理地假设文件中的错误最终会导致问题,并辞职将所有内容复制到新文件中。

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

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

它可能是一次性的,但它可能值得一试......

于 2019-10-04T14:05:26.753 回答
1

您可以通过执行“转换为 .zip 和解压缩技巧”来引入此行为,然后将vbaProject.bin文件(宏代码文件)替换为来自具有不同工作表结构的不同项目的 vbaProject.bin。不知道这是否是发生在 OP 身上的事情,但这就是发生在我身上的事情。

于 2019-12-18T23:14:11.680 回答
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. 保存并测试一切是否正常

这对我有用,我相信它也适用于 Excel。

于 2018-03-02T16:34:43.687 回答
0

与 Office365 有同样的问题,发现了一个错误,我的公共常量和函数的参数名称相同。在函数中更改参数名称后,它没有再次发生。

于 2018-10-31T07:28:05.720 回答
0

我的错误是当我将工作表传递给一个函数,然后稍后在 for 循环中将该变量名用作循环变量时引起的(因为我是一个糟糕且懒惰的程序员。)我在模块中有 Option Explicit 所以我没有'认为它不知道如何处理这些引用。

作为完全修改工作簿的替代方法:

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

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

于 2021-03-24T23:28:25.817 回答