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}\ 

解决这个问题需要三个步骤:

  1. 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. 通过删除错误或被取代的键2.0和2.1来清理registry,只留下最新的工作键2.2。 这可以通过selectHKEY_CLASSES_ROOT,编辑/查找/ MSCOMCTRL.OCX从registry编辑器完成。

    (注意:这一步似乎是可选的,因为我已经检查过只做第一步和第三步使工作簿再次工作,但感觉是正确的)

  3. 在Excel工作簿VBA项目中,需要重新引用和重新引用Microsoft Windows公共控件6.0(Service Pack 6)。 重新引用不仅仅是重新勾选框的问题,您需要使用“浏览”,并selectMSCOMCTL.OCXC:\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)

https://support.microsoft.com/en-us/kb/3139567