Excel VBA“自动化错误”由于2016年1月Office Update,可能由MSCOMCTL.OCX(Microsoft Windows公共控件6.o(Service Pack 6))引起的
解
我已经使用Microsoft Windows公共控件6.0(Service Pack 6),即MSCOMCTL.OCX
居住在C:\Windows\SysWOW64\
在2016-01-15(或其附件)上从Microsoft推出的KB2881029(Microsoft Office 2010 32位版本的安全更新)(MS16-004)安装了MSCOMCTL.OCX
(v6.1.98.46)的新版本在2015-12-09“创build”,但在更新时“已访问”(即安装在计算机上)。
这使得工作簿“失去”对MSCOMCTL.OCX
引用(引用标记为“丢失”,因为引用仍然打勾,但不再起作用;工作簿因“编译错误:对象库function不受支持”而不编译“自动化错误”)。
看来,更新通过添加一个SubKey 2.0修改以下registry项,但保留为空,并且不注册新的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
当通过REGSVR32注册新的
MSCOMCTL.OCX
(版本6.1.98.46)时,一个新的密钥被添加到registry中:KEY_CLASSES_ROOT \types库\ {831FDD16-0C5C-11D2-A9FC-000F8754DA1} \ 2.2
如果有一个已经存在的名为2.1的子密钥,它将input一个引用,2.2现在是使用的密钥。 但是它不会对空的2.0子密钥做任何事情!
如果有一个2.0(或2.1)SubKey没有任何东西,使用该OCX的任何对象将无法创build,因为它会使用2.0(resp 2.1)版本,它不能也不检查2.2版。
-
通过删除错误或被取代的键2.0和2.1来清理registry,只留下最新的工作键2.2。 这可以通过selectHKEY_CLASSES_ROOT,编辑/查找/ MSCOMCTRL.OCX从registry编辑器完成。
(注意:这一步似乎是可选的,因为我已经检查过只做第一步和第三步使工作簿再次工作,但感觉是正确的)
-
在Excel工作簿VBA项目中,需要重新引用和重新引用Microsoft Windows公共控件6.0(Service Pack 6)。 重新引用不仅仅是重新勾选框的问题,您需要使用“浏览”,并select
MSCOMCTL.OCX
在C:\Windows\SysWOW64\
(注意,在浏览器窗口中,您需要将文件types从“dll”更改为“OCX”(或“all”))
丹尼尔·亚历山大·卡尔(请参阅下面的进一步文章)已经亲切地分享了他写的脚本自动执行步骤1和步骤2(注意需要以pipe理员身份运行)。
感谢Daniel和wmelonman在帮助你理解问题和寻求解决scheme方面的帮助。
原始post
类似于这个3年前的文章(VBA自动化由于表单造成的Office Service Pack 3.0错误)所描述的 ,我的一个完美的工作簿从一天停止工作到下一个…
在昨晚进行的更新列表中,以下是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位版的安全更新)
还有其他的更新,但一般的微软Windows更新,不是特定于Office,他们希望在这里不相关。
我的理解是,“自动化错误”是由于该项目没有编译,因为我从Microsoft Windows公共控件6.0(Service Pack 6)引用的一个表单上存在2个“附加”ActiveX控件, MSCOMCTL.OCX
居住在C:\Windows\SysWOW64\
不幸的是,取消注册和重新注册MSCOMCTL.OCX
如前面提到的post所解释的,并没有解决问题。
我也尝试删除所有*.exd
,但是没有任何在我的C:
驱动器上。
可能相关的其他信息:
-
MSCOMCTL.OCX
文件版本是6.1.98.46
,创build并上次修改2015-12-09,但在昨天(凌晨三点三十五分)访问(2016-01-15),即大约在同一时间更新发生(最后一个3:14 )。 - 一旦传递了初始的“自动化错误”消息,我将得到一个额外的消息,“编译错误:不支持对象库function”,突出显示与附加控件关联的代码行。
- 我已经通过创build一个试图添加一个空白表单来validation这些是“造成”的问题。 我收到错误信息“由于错误800a0011而无法完成操作”。
- 这些额外的控件是Microsoft TreeView控件6.0(SP6)和Microsoft ImageList控件6(SP6)。
- 我可以添加Microsoft TreeView控件,版本5.0(SP2)和Microsoft ImageList控件,版本5.0(SP2),而不会引发错误(我没有尝试让它们工作)。
有谁知道与昨天的微软更新之后的MSCOMCTL.OCX
类似的事故吗? 这可能证实这可能是我的问题的根源。
有谁知道一个修复?
有谁知道如何报告给微软(如果确实是问题的根源)?
最后,对于那些感兴趣的,有一种方法来避免微软更新搞乱ActiveX控件…不使用它们! 这是JPK为他的TreeView所做的。
我们的Business-ERP-Software Faktura-XP自从昨天就遇到了同样的问题,我们调查了这个问题,并为它创build了一个补丁,也许它会帮助某人:
http://www.faktura-xp.de/faktura-xp-download/update-und-patch-oeffentlich.html#toggle-id-4
在我们的情况下,TreeViewControl停止工作,但它将是与自动相同的问题。 如果密钥{831FDD16-0C5C-11D2-A9FC-000F8754DA1}具有空的2.1或2.0条目,则公用控件将停止工作,Microsoft将MSCOMCTL.OCX更新为版本2.2。 解决scheme:删除密钥2.0和2.1,离开2.2,取消注册mscomctl.ocx并重新注册。
我们的补丁将完成这一切,只不过是尽可能简单地为我们的客户,只需点击下一步并closures。
编辑了解更多信息:
HKEY_CLASSES_ROOT\TypeLib\{831FDD16-0C5C-11D2-A9FC-000F8754DA1}\2.2
是通过REGSVR32注册新的MSCOMCTL.OCX(版本6.1.98.46)时新创build的
当有一个名为2.1的子密钥时,它input一个引用,2.2现在是使用的密钥。
如果有一个没有任何内容的2.1 SubKey,你的对象将无法创build,因为它将使用2.1版本,不能也不会检查2.2版本。
删除这个密钥,如果需要的话,你很好走。
进一步的testing显示2.0子密钥已经过时,可能会导致问题。
大多数系统与Microsoft Windows 7有这个问题。 对于我们的软件,没有人在Windows 8.1或Windows 10之后在当前更新之后调用问题。
这里有一个类似的问题:远古XP上的Ancient Access 97应用程序( 不再那么长时间了,松了一口气 )退出,说“ Error 91:Object variable or With block variable not set ”。 当Mscomctl.ocx中的进度条控件被处理时,检查显示它发生了。
我发现KB2881029(MS16-004)是罪魁祸首。 它安装新版本的MSCOMCTL.OCX。 在没有这个更新的机器上,Access应用程序工作正常。 但它不适合删除,至less这是我们的WSUS告诉我,当我要去的时候。 无论如何,我们不想活着没有安全更新。
在阅读了有关HKCR \ TypeLib {831FDD16 …的答案之后,我试图删除当时仍安装更新之前填充\ 2.0子项才发现,即使使用不存在的\ 2.0子项更新确实创build空的在安装。 做得好,微软…!
感谢您的贡献,
我发现在Excel VBA项目中取消引用和重新引用Microsoft Windows公共控件6.0(Service Pack 6)将最终使其工作。
!!!…但…!!!
只需取消勾选/重新勾选勾选框就太简单了! 为了重新引用它,你需要使用“浏览”,并selectMSCOMCTL.OCX在c:\ Windows \ SysWOW64 \
(注意,在浏览器窗口中,您需要将文件types从“dll”更改为“OCX”(或“all”))
我试过在没有运行Daniel Alexander的Patch的计算机上执行此操作(要取消注册并重新注册MSCOMCTL.OCX,并从registry中删除旧的空的2.0密钥),并且它不起作用,所以我期望以上步骤是必需的。 我将尝试彻底testing哪些步骤是必要的,并编辑这个答案,逐步阐明整个过程,但是暂时运行Daniel Alexander的补丁(AS ADMINISTRATOR!),并重新引用Microsoft Windows Common Controls 6.0(Service包6)在Excel VBA项目似乎工作。
这个问题已经在这里详细描述了:
“安装安全更新MS16-004后错误消息或访问崩溃”
MS:文章ID:3139567
(上次审阅时间:02/16/2016 19:15:00 – 修订版本:3.0)