Microsoft Excel ActiveX控件已禁用?

我有一些使用ActiveXcheckbox来控制某些活动的Excel工作表。 他们最近工作,但今天开始犯错误。 我被一位同事告知了这个消息,但是它仍在我的电脑上工作。 我检查了他对我的Excel版本,他是更新的。 我注意到有新的Windows更新,所以我做了更新。 我应用了待处理的更新后,现在不再适用于我的电脑。 我无法再检查ActiveXcheckbox,并且,作为尝试debugging的一部分,看来我甚至无法将ActiveX控件添加到任何工作表,甚至是新的工作表。 我收到一个错误对话框,上面写着“无法插入对象”。 (我仍然可以添加表单控件,而不是ActiveX。)任何其他人经历了最近的更新后呢? 有什么build议么?

谢谢,

麦克风

从其他论坛,我了解到,这是由于MS更新,一个很好的解决办法是简单地删除用户的configuration文件中的任何Temp子文件夹中的MSForms.exd文件。 例如:

C:\Users\[user.name]\AppData\Local\Temp\Excel8.0\MSForms.exd

C:\Users\[user.name]\AppData\Local\Temp\VBE\MSForms.exd

C:\Users\[user.name]\AppData\Local\Temp\Word8.0\MSForms.exd

当然,应用程序(Excel,Word …)必须closures才能删除此文件。

这是我在Microsoft Excel支持团队博客上find的最佳答案

对于某些用户,安装2014年12月更新后,窗体控件(FM20.dll)不再按预期工作。 有时候会遇到一些问题,比如当他们使用窗体控件打开现有的VBA项目的文件时,尝试将窗体控件插入到新的工作表中,或者运行可能使用这些组件的第三方软件。

您可能会收到错误,如:

“无法插入对象”“对象库无效或包含对无法find的对象定义的引用”

此外,您可能无法使用或更改工作表上的ActiveX控件的属性,或尝试通过代码引用ActiveX控件作为工作表的成员时收到错误。 更新后的步骤:

要解决此问题,您必须删除客户端计算机上控件types库(扩展程序文件)的caching版本。 为此,您必须在硬盘上search具有“.exd”文件扩展名的文件,并删除所有find的.exd文件。 这些.exd文件将在下次使用VBA时使用新控件时自动重新创build。 这些扩展程序文件将在用户的configuration文件下,也可能位于其他位置,如下所示:

%APPDATA%\微软\forms

%TEMP%\ Excel8.0

%TEMP%\ VBE

脚本解决scheme:

由于此问题可能会影响多台计算机,因此也可以创build脚本解决scheme来删除EXD文件,并使用策略作为login过程的一部分运行脚本。 您需要的脚本应该包含以下行,并且需要为每个USER运行,因为.exd文件是USER特定的。

del%temp%\ vbe \ *。exd

del%temp%\ excel8.0 \ *。exd

del%appdata%\ microsoft \ forms \ *。exd

del%appdata%\ microsoft \ local \ *。exd

del%appdata%\ Roaming \ microsoft \ forms \ *。exd

del%temp%\ word8.0 \ *。exd

del%temp%\ PPT11.0 \ *。exd

附加步骤:

如果上述步骤无法解决您的问题,则可以进行另一步testing(请参阅下面的警告):

  1. 在完全更新的计算机上,删除.exd文件后,使用编辑权限在Excel中打开该文件。

    打开应用程序的Visual Basic>通过向任何代码模块添加注释或编辑来修改项目>debugging>编译VBAProject。

    保存并重新打开该文件。 testing分辨率。 如果已解决,请将此更新的项目提供给其他用户。

    警告:如果此步骤解决了您的问题,请注意,在将此更新的项目部署到其他用户之后,这些用户还需要在其系统上应用更新,并删除.exd文件。

如果这不能解决您的问题,则可能是另一个问题,可能需要进一步的故障排除。

微软目前正在处理这个问题。 观看博客的更新。

资源

这是KB2553154 。 微软需要发布一个修补程序。 作为Excel应用程序的开发人员,我们无法访问所有的客户端计算机并从中删除文件。 我们受到微软引起的一些指责。

我是一名Excel开发人员,在发生这种情况时我确实感到很痛苦。 幸运的是,即使Excel正在运行,我也可以通过在VBA中重命名MSForms.exd文件来find解决方法,这也可以解决问题。 需要分发电子表格的Excel开发人员可以将以下VBA代码添加到他们的电子表格中,使其免于MS更新。

将此代码放在任何模块中。

 Public Sub RenameMSFormsFiles() Const tempFileName As String = "MSForms - Copy.exd" Const msFormsFileName As String = "MSForms.exd" On Error Resume Next 'Try to rename the C:\Users\[user.name]\AppData\Local\Temp\Excel8.0\MSForms.exd file RenameFile Environ("TEMP") & "\Excel8.0\" & msFormsFileName, Environ("TEMP") & "\Excel8.0\" & tempFileName 'Try to rename the C:\Users\[user.name]\AppData\Local\Temp\VBE\MSForms.exd file RenameFile Environ("TEMP") & "\VBE\" & msFormsFileName, Environ("TEMP") & "\VBE\" & tempFileName End Sub Private Sub RenameFile(fromFilePath As String, toFilePath As String) If CheckFileExist(fromFilePath) Then DeleteFile toFilePath Name fromFilePath As toFilePath End If End Sub Private Function CheckFileExist(path As String) As Boolean CheckFileExist = (Dir(path) <> "") End Function Private Sub DeleteFile(path As String) If CheckFileExist(path) Then SetAttr path, vbNormal Kill path End If End Sub 

RenameMSFormsFiles子例程尝试重命名C:\Users\[user.name]\AppData\Local\Temp\Excel8.0\C:\Users\[user.name]\AppData\Local\Temp\VBE\的MSForms.exd文件C:\Users\[user.name]\AppData\Local\Temp\VBE\文件夹复制到MSForms – Copy.exd。

然后在Workbook_Open事件的最开始处调用RenameMSFormsFiles子例程。

 Private Sub Workbook_Open() RenameMSFormsFiles End Sub 

电子表格将打开时尝试重命名MSForms.exd文件。 显然,这不是一个完美的解决scheme:

  1. 当第一次打开电子表格时,受影响的用户在运行VBA代码时仍然会遇到ActiveX控件错误。 只有在执行一次VBA代码并重新启动Excel之后,问题才得以解决。 正常情况下,当用户遇到一个破损的电子表格时,膝盖反应就是closuresExcel并尝试再次打开电子表格。 🙂
  2. 即使MSForms.exd文件没有问题,每次打开电子表格时都会重命名MSForms.exd文件。 但电子表格将工作得很好。

至less现在,Excel开发人员可以继续使用此变通办法分发他们的工作,直到Microsoft发布修补程序。

我在这里发布了这个解决scheme。

使用Windows 8.1,我无法使用Windowssearchfind任何.exd文件。 另一方面,cmd命令dir *.exd /S在我的系统上find了一个文件。

KB以上的build议对我来说不起作用。 我发现如果一个Excel 2007用户(有或没有安全更新;不确定是否导致这种情况的确切情况)保存该文件,原始错误返回。

我发现再次修复文件的最快方法是删除所有的VBA代码。 保存。 然后replaceVBA代码(复制/粘贴)。 保存。 在尝试这之前,我首先删除.EXD文件,否则在打开时出现错误。

在我的情况下,我不能升级/更新我的Excel文件在不同位置的所有用户。 由于问题在某些用户保存Excel文件后回来,我将不得不用其他的东西replaceActiveX控件。

简化的最终用户说明。 随意复制/粘贴以下内容。

下面是如何解决问题:

  1. closures所有的Office程序和文件。
  2. 打开Windows资源pipe理器并在地址栏中input%TEMP%,然后按Enter键。 这将带你进入系统临时文件夹。
  3. find并删除以下文件夹:Excel8.0,VBE,Word8.0
  4. 现在尝试再次使用您的文件,它应该没有任何问题。

您可能需要等到发生问题才能使此修复程序正常工作。 提前应用(在将Windows更新安装到系统之前)将无济于事。

有关此问题的最佳信息来源和更新信息,请参阅TechNet博客»Microsoft Excel支持团队博客(如上所述):

表单控制在2014年12月之后停止工作更新(2015年3月10日更新)

在2015年3月 ,除了自动修复程序和手动指示信息外, 还发布一个修补程序 ,而且它也可以在Windows Update上使用。

来自Microsoft的最新更新和修复: 在安装MS14-082安全更新之后,在ActiveX自定义Office解决scheme中出现3025036“无法插入对象”错误

状态:2015年3月10日更新:

针对此问题的修补程序已于2015年3月发布的Office 2007,2010和2013版更新中发布。

有关问题的一般信息:

对于某些用户,2014年12月安装MS14-082 Microsoft Office安全更新后,表单控件(FM20.dll)不再按预期方式工作。有时遇到问题,例如使用表单控件打开包含现有VBA项目的文件时,尝试将表单控件插入新工作表或运行可能使用这些组件的第三方软件。

https://technet.microsoft.com/en-us/library/security/ms14-082.aspx

您可能会收到错误,如:“不能插入对象”; “对象库无效或包含对无法find的对象定义的引用”; “用来创build这个对象的程序是Forms,这个程序没有安装在你的计算机上,或者它没有响应,为了编辑这个对象,安装Forms或者确保Forms中的任何对话框都是closures的。 […]此外,您可能无法使用或更改工作表上的ActiveX控件的属性,或尝试通过代码将ActiveX控件作为工作表的成员引用时收到错误。

手动和其他解决scheme:

脚本解决scheme:

由于此问题可能会影响多台计算机,因此也可以创build脚本解决scheme来删除EXD文件,并使用策略作为login过程的一部分运行脚本。 您需要的脚本应该包含以下行,并且需要为每个USER运行,因为.exd文件是USER特定的。

 del %temp%\vbe\*.exd del %temp%\excel8.0\*.exd del %appdata%\microsoft\forms\*.exd del %appdata%\microsoft\local\*.exd del %temp%\word8.0\*.exd del %temp%\PPT11.0\*.exd 

附加步骤:

如果上述步骤无法解决您的问题,则可以进行另一步testing(请参阅下面的警告):

  1. 在完全更新的计算机上,删除.exd文件后,使用编辑权限在Excel中打开该文件。

  2. 打开应用程序的Visual Basic>通过向任何代码模块添加注释或编辑来修改项目>debugging>编译VBAProject。

  3. 保存并重新打开该文件。 testing分辨率。

如果已解决,请将此更新的项目提供给其他用户。

警告:如果此步骤解决了您的问题,请注意,在将此更新的项目部署到其他用户之后,这些用户还需要在其系统上应用更新,并删除.exd文件。

我终于在官方的Microsoft KB上find了这个答案:

http://support.microsoft.com/kb/3025036/EN-US

这里没有新的信息比我们在以前的答案,但至less它承认,微软意识到这个问题。

我知道很多答案已经发布了,但没有一个答案独立为我的网站工作。 所以这里是对我有用的东西:

步骤1:卸载以下更新 – KB2920789,KB2920790,KB2920792,KB2920793,KB2984942,KB2596927

步骤2:隐藏这些更新,以免在随后的重新启动时安装

步骤3:从C:\ Users \ <> \ AppData \ Local \ Temp中删除文件夹Excel8.0

第4步:重新启动workstatiion(我也会确保上面提到的KBs不会无意中得到应用)

我想提供一个对我来说唯一的答案(我意识到我可能是唯一一个)。 我曾用一个function区来调用一个macros。 它有以下代码:

 colStore = new Collection 

我不知道它会抛出一个错误,所以我很困惑,并尝试在这里的一切。 该button刚刚停止工作,我不能得到它的工作。 当我注意到错误并将其更正为:

 Set colStore = new Collection 

它再次开始工作。 如果你问我,绝对奇怪,但也许它帮助那些和我一样绝望的人。