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个回答

0

我在一个特定的工作表中添加了带有VBA代码的组合框后出现了这个问题。 测试代码等都没有问题,直到我再次打开该工作表。 Stackoverflow和Microsoft提供了许多解决方法,但没有真正的解决方案。 我使用的是Excel 2010(荷兰语版),配合W10(从W7升级而来)。我认为问题出在Excel 2010上。 在我的情况下,我在通过VBA取消保护工作表的那一行上出现了错误,而这个模块已经很长时间没有更改过。

好吧,根据我的观点,情况是这样的: FM20.DLL存在安全问题,在2015年第一季度MS发布了更新。这个更新安装了一个新的FM20.DLL,但语言包(FM20NLD.DLL和FM20ENU.DLL)没有更新。可能如果您不使用语言包,就不会出现这个错误。在我看来,语言部分也应该得到更新(但目前没有可用的更新)。

好的,删除.exd文件可以暂时解决问题。这只是一个临时解决办法。 MS没有真正的解决方案,但重新编译代码可以“解决”问题。

这就是为什么一些人说:“添加注释问题就解决了。” 是的,添加注释会强制重新编译。
我同意,这仍然是一个变通方法,但不是暂时的解决办法。 所以: 1. 检查VBA代码中存在错误的部分 2. 添加注释以强制重新编译。 3. 再次保存项目
就是这样。

0

0
我有类似的问题。VBA(ActiveX)代码在20多台计算机上运行良好,已经工作了几年,但当新同事加入时,问题突然浮出水面,尽管Excel版本相同,但该代码在他的新笔记本电脑上无法工作,显示运行时错误“32809”。
我检查了所有ActiveX和宏的安全设置,都是正确的。我做了一些实验。我发现在我的电脑上创建的代码将无法在我的同事的新笔记本电脑上工作。但是,如果我在我的同事的新笔记本电脑上创建代码,则可以在我的电脑上工作。一旦我在我的电脑上保存了这个代码,它就不能再在我的同事的笔记本电脑上工作了。
通过详细检查错误,问题是所有在我的电脑上编写的代码,我的同事的Excel都无法识别。调试>>编译将显示编译错误,甚至无法识别“DIM…”。所有ActiveX控件、组合框、按钮等属性名称都被随机分配了一个新名称。例如,我有一个名为[AddNew]的按钮,在我的同事的新笔记本电脑上打开后,它被重新分配为[commandbutton54]。它甚至无法识别现有的工作表名称。
经过研究所有解决方案,我发现删除“*.exd”文件不起作用(即使清空回收站)。添加注释也不起作用...
最终的解决方案是:
步骤1:复制带有代码的工作表(不需要没有代码的工作表);
步骤2:删除原始工作表;
步骤3:将复制的工作表重命名为它们的原始名称;
它开始工作了。我发现所有的ActiveX控件在其属性中恢复了它们的原始名称。只需要花费一分钟。希望这能帮助那些面临同样问题的人。 注意: 无需将文件保存为*.txt或重命名为xlsx...

0
错误32,809:将损坏的工作表复制到新工作表并更改名称或删除损坏的工作表对我有效。此外,我还进入了与损坏工作表相关联的工作表模块,并从该模块中删除了与损坏工作表相关的编码。这也解决了我的问题。[工作表模块可以有根据特定工作表事件触发的例程。]所以在我的情况下,我认为是一个损坏的工作表模块,而不是工作表本身的损坏数据。

0

好的,这可能有点奇怪。无论如何,我的一个同事遇到了这个错误,我们尝试编辑VBA编译等等。但问题是,只需将Excel文件复制到桌面即可。然后它就可以工作了。Excel文件最初位于网络驱动器中。这个方法有效,这是我对这个问题的答案。


0

我已经从工作表中删除了所有的ActiveX控件,现在它可以顺利运行,没有任何错误信息。这就是我的解决方案。


我在工作表上有一个引起问题的ActiveX按钮。试图删除它会导致Excel崩溃。相反,我删除了它下面的公式=EMBED(etc...)并使用“剪切”来处理该按钮,而不是删除。这样就停止了崩溃,宏又开始工作了。关闭并重新打开后,我能够重新创建按钮。可能出现了某些损坏... - pgr

0

我的解决方案(可能不适用于你)

在出现错误的计算机上打开应用程序。以某种方式更改VB代码。(我在其中一个宏中添加了一行不相关的注释代码)

Sheets(sheetName).Select '无关紧要的注释

保存后,将会重新编译。关闭并重新打开——问题解决了。

希望这有意义且有所帮助。

Grant


-1

删除所有的*.exd实例,这对我解决了问题。


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