某些计算机无法识别 ActiveSheet 对象

ActiveSheet object not recognized on some computers

我有一个 Excel 2007 VBA 项目,它在我的计算机和其他一些计算机上运行良好,但在某些计算机上它在引用 ActiveSheet 对象的行上遇到错误 32809。我发现在受影响的计算机上,无法识别 ActiveSheet 对象。 ActiveWorkbook 对象工作正常。

在受影响的计算机上,如果我创建一个新的工作簿,引用 ActiveSheet,并激活受影响的工作簿,ActiveSheet 对象工作正常;我可以获得 ActiveSheet 的名称 属性。

在我的电脑上 VBA 可以正常编译。但在受影响的计算机上,编译在 "Option Explicit" 行停止并且 returns 错误:

"Contains references to object definitions that could not be found."但是“引用”对话框中的选定条目看起来很正常。

在受影响的计算机上,我们检查了更新,但它们是最新的;我假设 IT 远程处理更新。

我的想法是:

有什么想法吗?

更新:

示例代码,根据要求:

Sub main()
    Debug.Print ActiveSheet.Name
End Sub

更新#2:

考虑到可能是工作簿损坏,我从头开始重建了工作簿。但是新的工作簿也有同样的问题。

在发生错误的计算机上,我将文件的副本保存为 xlsx,没有宏。然后我关闭并打开该文件以确保宏已经消失。然后我从原始文件中复制了所有 VBA 。然后我用宏重新保存为 xlsm。

该文件在受影响的计算机上运行良好,在原始计算机上也运行良好。

但是,在原来的电脑上,如果我保存了文件,然后将其复制到受影响的电脑上,又回到了原来的问题。

所以无论如何这给了我一个笨拙的解决方法。接下来我将尝试知识库文章 3025036,安装 MS14-082 安全更新后出现 "Cannot insert object" 错误。不同的错误消息,但值得一试。

你能post 代码吗? 另外要检查的一件事是,您没有在未验证其类型的情况下尝试将 Excel.ActiveSheet 对象放入工作表对象中。 Activesheet 也可以是图表对象(即图表 Sheet)。

Sub Example()
    Dim ws As Excel.Worksheet
    'Risks Error:
    Set ws = Excel.ActiveSheet
    'Safer:
    If TypeOf Excel.ActiveSheet Is Excel.Worksheet Then
        Set ws = Excel.ActiveSheet
    Else
        'Do something else:)
    End If
End Sub

为了防止损坏,copy/paste 将所有内容都放入一个新工作簿中,导出您的代码模块并将它们重新导入到新工作簿中,然后进行编译。如果这解决了它,那么它可能是腐败。

此问题仅在删除所有列表框控件后才消失。列表框控件已经存在了很长时间,并且在受影响的机器上运行良好;我不确定是什么突然改变使它们无法在某些计算机上工作。

作为解决方法,我将在运行时尝试 deleting/creating 列表框,而不是使用相同的列表框控件。这样,它始终是在那台计算机上创建的新列表框。

更新:

事实证明问题出在错误的 Office 更新上 -- 从 MS14-082 安全更新更新 KB2596927。 11 月份更新发布时我们没有遇到任何问题,但最近我们的公司 IT 尝试从所有计算机中删除 KB2596927。但是,删除在某些上并不成功。 KB2596927 在我的和其他一些上仍然存在,但从一些上消失了。

我发现,如果在出现问题的计算机上,我删除了 VBA 并将其添加回去,它就可以在该计算机和我们所有的计算机上运行。但是我一在电脑上修改了VBA并保存,发了练习册,问题又来了

所以我删除了 KB2596927 Office 更新,并解决了这个问题。现在我可以在我的电脑上修改工作簿中的VBA,并分发工作簿,并且可以正常工作。

我有同样的问题。 VBA 编译器在行中显示问题:

ActiveSheet.Shapes("Key_1").Visible = False

并且它没有重新组织功能(还有形状)。

我很简单的解决了这个问题!

我复制了相同的 sheet(价格 list_2018)到“价格 list_2018 (2)

然后我删除了 sheet "price list_2018" 然后

我将 "price list_2018 (2)" 重命名为 "price list_2018" ...非常简单!

问题已解决!

谢谢...