Solution
我已使用 Microsoft Windows Common Controls 6.0 (Service Pack 6) 将 Treeview Active X 控件添加到我们的电子表格之一,即MSCOMCTL.OCX
它住在C:\Windows\SysWOW64\
KB2881029(Microsoft Office 2010 32 位版本的安全更新)(MS16-004),于 2016 年 1 月 15 日(或前后)从 Microsoft 推出,安装了新版本的MSCOMCTL.OCX
(v6.1.98.46) 于 2015 年 12 月 9 日“创建”,但在更新时“已访问”(即安装在计算机上)。
这使得工作簿“失去”了对MSCOMCTL.OCX
(“丢失”上的引号,因为引用仍然被勾选但不再起作用;工作簿由于“编译错误:不支持对象库功能”或“自动化错误”而无法编译)。
看来更新通过添加 SubKey 2.0 修改了以下注册表项,但将其保留为空,并且不注册新的MSCOMCTL.OCX
:
HKEY_CLASSES_ROOT\TypeLib\{831FDD16-0C5C-11D2-A9FC-000F8754DA1}\
解决该问题需要三个步骤:
-
MSCOMCTL.OCX
需要从提升的命令提示符处取消注册并重新注册,如下所示:
C:\Windows\system32>Regsvr32 /u C:\\Windows\SysWOW64\MSCOMCTL.OCX
C:\Windows\system32>Regsvr32 C:\\Windows\SysWOW64\MSCOMCTL.OCX
注册新的时MSCOMCTL.OCX
(版本 6.1.98.46)通过 REGSVR32,一个新密钥被添加到注册表中:
KEY_CLASSES_ROOT\TypeLib\{831FDD16-0C5C-11D2-A9FC-000F8754DA1}\2.2
如果已经存在名为 2.1 的子密钥,则它会输入一个引用,其中 2.2 现在是要使用的密钥。但它对空的 2.0 SubKey 没有任何作用!
如果有一个 2.0(或 2.1)SubKey 中没有任何内容,则使用该 OCX 的任何对象都应该无法创建,因为它将使用 2.0(或 2.1)版本,它不能也不会检查 2.2版本。
-
通过删除错误或被取代的密钥 2.0 和 2.1 来清理注册表,仅保留最新且有效的密钥 2.2。这可以通过注册表编辑器选择 HKEY_CLASSES_ROOT、Edit/Find/MSCOMCTRL.OCX 来完成。
(注意:此步骤似乎是可选的,因为我已经检查过仅执行步骤 1 和 3 即可使工作簿再次工作。但这感觉是正确的做法)
-
在 Excel 工作簿 VBA 项目中,需要取消引用并重新引用 Microsoft Windows Common Controls 6.0 (Service Pack 6)。重新引用不仅仅是重新勾选框的问题,您需要使用“浏览”,然后选择MSCOMCTL.OCX
in C:\Windows\SysWOW64\
(注意,在浏览器窗口中,您需要将文件类型从“dll”更改为“OCX”(或“all”))
Daniel Alexander Karr(请参阅下面的帖子)善意地分享了他编写的自动执行步骤 1 和 2 的脚本(请注意,需要以管理员身份运行)。
感谢 Daniel 和 wmelonman 帮助我们理解问题并找到解决方案。
原帖
与这篇 3 年前的帖子中描述的类似(由于 Office Service Pack 3.0 Forms 引起的 VBA Automation 错误),我的一本工作完美的工作簿一天天停止工作......
在昨晚进行的更新列表中,以下是 Office 更新:
- KB3114563(Microsoft Office 2010 32 位版本的定义更新)
- KB2881029(Microsoft Office 2010 32 位版本的安全更新)
- KB3114555(Microsoft Office 2010 32 位版本更新)
- KB3114553(Microsoft Office 2010 32 位版本的安全更新)
- KB3114564(Microsoft Excel 2010 32 位版本的安全更新)
还有其他更新,但都是一般的 Microsoft Windows 更新,不是特定于 Office 的,希望它们与此处无关。
我的理解是,“自动化错误”是由于项目未编译所致,因为我从 Microsoft Windows Common Controls 6.0 (Service Pack 6) 引用的表单之一上存在 2 个“附加”ActiveX 控件,即MSCOMCTL.OCX
它住在C:\Windows\SysWOW64\
不幸的是取消注册并重新注册MSCOMCTL.OCX
正如上述帖子中所解释的没有解决问题。
我也尝试删除所有*.exd
,但我的上面没有C:
drive.
可能相关的其他信息:
- The
MSCOMCTL.OCX
文件版本是6.1.98.46
,创建并最后修改于 2015-12-09,但在昨天 (2016-01-15) 凌晨 3.33 访问,即更新发生的时间大约相同(最新更新为凌晨 3:14)。
- 一旦通过了最初的“自动化错误”消息,我将收到一条附加消息“编译错误:不支持对象库功能”,突出显示与附加控件相关的代码行。
- 我通过创建一个空白表单并尝试添加一个来验证这些是“导致”问题的原因。我收到错误消息“由于错误 800a0011,无法完成操作”。
- 这些附加控件是 Microsoft TreeView Control 6.0 (SP6) 和 Microsoft ImageList Control 6 (SP6)。
- 我可以添加 Microsoft TreeView 控件版本 5.0 (SP2) 和 Microsoft ImageList 控件版本 5.0 (SP2),而不会引发错误(尽管我没有尝试让它们工作)。
有谁知道类似的事故MSCOMCTL.OCX
继昨天的 Microsoft 更新之后?这可能证实这可能是我的问题的根源。
有谁知道修复方法吗?
有谁知道如何向 Microsoft 报告此问题(如果确实是问题的根源)?
最后,对于那些感兴趣的人来说,有一种方法可以避免 Microsoft 更新弄乱 ActiveX 控件...不使用它们!这就是JPK为他所做的TreeView.