【问题标题】:Excel VBA Project has generated multiple Workbook objectsExcel VBA 项目已生成多个工作簿对象
【发布时间】:2013-08-16 12:11:34
【问题描述】:

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

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

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

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

例如,我有一个名为 wksInputs 的工作表,它现在已转换为 Workbook 对象,而原来的 wksInputs 现在称为 wksInputs1。

我无法删除 wksInputs 工作簿对象。

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

非常感谢。

【问题讨论】:

  • 您可以上传您的 VBA 项目文件夹列表的屏幕截图吗?上传到 imgur.com 之类的网站,并在您的帖子问题中包含链接/网址。
  • 大卫,很遗憾,我的办公室安全标准限制我上传到此类网站。我试图在上面添加一张图片,但 StackOverflow 说我没有必要的权限......让我试试别的,因为我知道它真的会帮助其他人看到问题......
  • 是的,如果没有看到你所看到的,这真的是不可能的。
  • 这些类型的问题可能是由 COM 插件引起的。尝试转到 Developer>COM Addins 并取消选中它们,看看它是否解决了它。
  • 我已经通过我的 iPad 将一张图片保存到我的公共 Dropbox 文件夹中。试试这个链接:link

标签: vba excel excel-2010


【解决方案1】:

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

注意:原始损坏文件保存为 .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 格式的习惯。

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

【讨论】:

  • 这里也一样。尝试后我还有额外的工作簿。
【解决方案2】:

当我将工作表作为参数传递给 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】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我也是这样做的,故意的,不知道有没有办法做到这一点,但不会遇到“ThisWorkbook1”的问题。
      【解决方案5】:

      我在 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。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多