Excel VBA 运行时错误 '32809' - 试图理解它

16

我在工作中的一个同事修改了我们的一个宏工作簿,现在只有我在尝试运行它时会收到可怕的“运行时错误32809”。这个最新版本在他的电脑和我们测试过的另一位同事的电脑上都能正常运行。之前的版本在我们所有的电脑上都能正常运行,它们都运行着Excel 2010。

当宏尝试选择名为“Info”的工作表索引1时,就会出现这个错误。我知道选择/激活不是必需的,但现在我正在使用这个工作簿,而且正试图找出为什么只有我会收到这个错误。

我已经尝试了:

  1. 重新启动/电源循环
  2. 保存副本
  3. 使用CCleaner清理临时文件
  4. 在线研究
  5. 检查ActiveX控件(使用表单控件)

所有这些尝试都没有成功。然后我在即时窗口里进行了一些操作,发现甚至一个简单的:

Debug.Print ThisWorkbook.Worksheets(1).Name

程序运行时出现错误,使我相信工作表已经崩溃了。我在工作表中添加了一些事件,包括_Activate和_Change,但是即使确认过了,它们也没有触发。

Application.EnableEvents = True

我添加了一个简单的测试子程序,如下:

Public Sub Test()

    Dim ws As Worksheet
    Dim sheetNum As Integer

    For Each ws In ThisWorkbook.Worksheets
        ws.Select           ' Selects all Sheets Without Error
        Debug.Print ws.Name ' Prints All Worksheet Names Fine
    Next ws

    Set ws = ThisWorkbook.Worksheets(1)
    ws.Select               ' Selects Sheet 1 Without Error

    ' Prints all but sheetNum = 1, Run-time Error 32809
    For sheetNum = 7 To 1 Step -1
        Debug.Print ThisWorkbook.Worksheets(sheetNum).Name
    Next sheetNum

    ' Run-time Error 32809
    ThisWorkbook.Worksheets(1).Select

End Sub

是否有人遇到过类似的情况或知道什么原因导致此错误仅在某些计算机上发生?


这是因为工作表已经损坏了。试试这个方法。创建一个新的工作表,将所有内容从旧工作表复制到新工作表中,最后删除旧工作表。它会起作用的。我刚刚测试过了。 - Siddharth Rout
嗨,Siddharth - 感谢您的回复。这是我选择的短期解决方案,但不幸的是,尝试删除现有工作表会导致 Excel 崩溃,因此我只是将其重命名。问题仍然存在:为什么只有在我的电脑上打开时才会出现损坏? - Anthony
抱歉,我无法回答这个问题。事实上,我使用了此文件进行测试,并成功重现了该问题。即使更改子程序的名称,问题仍然存在。删除并重新创建它可以解决问题。 - Siddharth Rout
除了@SiddharthRout的解决方案之外,最后,如果那不能解决问题,您还可以导出模块并将其删除/保存/关闭/打开,重新导入,保存。最后,如果所有其他解决方案都失败了,并且仍然只在您的计算机上发生此问题,我建议您尝试重新安装Excel。 - peege
18个回答

11

在我的情况下,以下方法有所帮助:

  1. 将文件保存为.xlsx(无宏)- 保存时所有宏都会被清除;
  2. 使用宏的源文件打开并将模块复制到.xlsx文件中;
  3. 将文件另存为.xlsm - 执行完全重新编译。

之后一切恢复正常。我有一个拥有200多个工作表和50多个宏的文件,对每个模块进行注释并没有起作用,但这种解决方案起了作用。


1
很棒的解决方案。对我有用! - Karl Hoaglund
这对我很有效,不过有一个注意点。在重新另存为 xlsm 之前不要关闭 xlsx 文件,这样可以保留所有的 VBA 代码,而无需复制和粘贴。 - Gregor y

5
我也遇到了这个问题,已经有一段时间了。实际上,这是由于微软在12月份开始通过Windows Update进行的一些Microsoft Office更新所导致的。这引起了相当大的头痛,更不用说由于这个问题而丢失的工作效率。
其中一个更新破坏了表单,你需要像UHsoccer所说的那样清除Office缓存。
此外,另一个答案线程Suddenly several VBA macro errors, mostly 32809有一个链接指向MS博客,详细介绍了此问题。
另一个更新会导致另一个错误,即如果你创建或修改其中一个表单(即使只是保存表单数据),它将更新电子表格的内部结构。当给其他人时,如果没有更新,就会导致上述错误。
解决方案(如果你正在与他人在同一个电子表格上工作)?遗憾的是,要么让你所有的合作者使用Office更新,然后让他们清除Office缓存,要么回滚到12月'14之前的更新,通过系统还原(或手动删除它们)。
我知道,这不是什么好的解决方案,对吧?我也不高兴。
只是作为背景,我更新了我的机器,跟上了更新,而我处理的其中一家公司没有。在圣诞节前,我一直在努力解决这个问题,没有任何还原点,最终不得不放弃并重新格式化。
现在,一个月后,该公司的IT部门更新了他们的工作站。毫不意外地,他们也开始遇到类似的问题(更不用说当我收到他们的电子表格时,我也遇到了同样的问题)。
现在,我们都使用相同的更新,一切都很好。

我安装了微软的安全更新在这里,对于Excel 2010一切都很好。 - DrMarbuse

1
这对我很有用,我使用Excel 2010,在打开一个启用宏的.xlsm文件时遇到了相同的错误。
- 在关闭错误对话框后,进行“另存为”制表符分隔的.txt文件。对于

...仅活动工作表。

...函数未保存。

点击确定
- 然后再次“另存为”,但这次选择启用宏的.xlsm格式。(是否覆盖原始文件并不重要,但另存为其他文件会更安全。)
- 关闭Excel。
- 打开新保存的.xlsm文件。在我的情况下,错误消息消失了,宏正在工作。

奇怪的是这个方法对我起作用了。我按照詹姆斯在那台破解代码的机器上概述的步骤进行操作,之后它就开始工作了。注意!您会失去项目的数字签名,因此您需要启用所有宏或每次打开工作簿时处理安全警告。如果您不想走这条路,办公室更新也可以解决问题。使用Windows更新安装您找到的每个办公室更新。 - kuklei

1
我遇到了类似(几乎无法解释的)行为
在目录C:\Users\username\AppData\Local\Temp下找到一个参考,可以删除.exd文件。每个Excel8.0和VBE目录中都有一个。典型名称是MSForms.exd。
谷歌搜索“Excel exd”或“KB 2553154”。从我的角度来看,这是一个完全不可接受的情况,至少已经存在一个月了。

1

看起来32809是一个通用的错误信息。经过一段时间的挣扎,我发现我没有在工作簿选项卡下方点击“启用宏”安全按钮。一旦我这样做了,一切都正常了。


1
在我的情况下,错误发生在执行宏时: Sheets("own sheet one").Select
将工作表复制到另一个名称为“oso”的工作表中,然后删除原始工作表并将新工作表重命名为“own sheet one”
Excel 2013

1
我在为客户开发应用程序时遇到了这个问题。在我的电脑上工作时,代码/表单等都运行得很好,但是当加载到客户的系统中时,在我的应用程序中会出现此错误。
我的解决方法是通过删除VBA模块和表单来将工作簿与表单和代码分离。这样做后,我的客户复制了“裸”工作簿和模块和表单。将表单和代码导入启用宏的工作簿后,应用程序再次正常工作。

0

我导出了VBA模块 - 重新保存了文件,然后再次导入模块,一切正常。


0

我按照以下步骤操作,成功解决了问题:

  1. 安装Office 2013(我没有尝试过2010版本,但我认为它也可以)。
  2. 安装Office 2013 SP1。
  3. 运行Windows更新并安装所有Office和Windows更新。
  4. 重新启动计算机。
  5. 完成。

这在我的两台不同电脑上都有效。希望这对你也有用!


0

我也遇到了同样的问题,发现这是微软漏洞的问题。

当我安装这些更新补丁时,它对我有用。您可以在 www.microsoft.com 上找到这些补丁。

  1. 如果您的 Office 2010 版本是 SP1,则需要先下载并安装 Office SP2 包。更新补丁名称为 KB2687455。

  2. 安装更新补丁 KB2965240。

    此安全更新解决了 Microsoft Office 中的漏洞,如果攻击者成功地说服用户在受影响的 Office 版本中打开或预览特制的 Microsoft Excel 工作簿,则可能允许远程代码执行。成功利用漏洞的攻击者可以获得与当前用户相同的用户权限。

  3. 安装更新补丁 KB2553154。

    Microsoft Office 2010 32 位版存在安全漏洞,当打开恶意修改的文件时,可能会允许任意代码运行。此更新解决了该漏洞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接