ActiveX控件已禁用?

118

我有使用ActiveX复选框控制某些活动的Excel工作表。

今天它们开始出现错误。我的同事在运行较新版本的Excel时提醒了我,但在我的电脑上仍然可以正常工作。
我注意到有Windows更新,所以我进行了更新。现在它在我的电脑上不再起作用。

我无法再检查ActiveX复选框。

我无法向任何工作表添加ActiveX控件,甚至是新工作表。
我会收到一个错误对话框

无法插入对象。

我可以添加窗体控件,只是不能添加ActiveX控件。


6
我也遇到了这个问题,我们公司的所有用户都遇到了同样的情况。微软怎么可能发布一个会破坏Excel中ActiveX控件的更新?这太疯狂了。 - harryg
4
不,这是一个编程问题,应该在这里讨论。 - Harry Johnston
3
ActiveX控件是一种编程工具,对吧?你还会用它们做其他事情吗?如果OP只是询问特定第三方产品(碰巧使用VBA)停止工作的情况,那就不同了。但在这种情况下,似乎影响到他自己的代码了? - Harry Johnston
可能有帮助:Excel表单控件和ActiveX控件的区别 - ashleedawg
可能有帮助:Excel表单控件和ActiveX控件的区别 - ashleedawg
显示剩余3条评论
11个回答

158

从其他论坛上了解到,这是由于微软更新所致,一个好的修复方法是简单地从用户配置文件中的任何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 等)必须关闭才能删除此文件。


1
我有一台未更新的电脑。我打开了Excel,并成功添加了一个ActiveX按钮。我查找了C:\Users[user.name]\AppData\Local\Temp\Excel8.0\MSForms.exd,但没有Excel8.0文件夹。然后我运行了Windows更新。我再次尝试将ActiveX按钮添加到我的电子表格中,但失败了。我还注意到现在有了Excel8.0\MSForms.exd。我删除了它,并在不重新启动计算机的情况下重新打开了Excel,现在可以成功添加ActiveX按钮了。谢谢! - Mitchell Kaplan
2
谢谢!这个过程解决了我的电脑问题。我为那些发布大型公共版本的开发人员感到难过,因为这会导致问题...希望微软能够发布修复程序。 - Mike Pedersen
1
这对我没有起作用。我正在对我们的一台电脑进行系统还原,恢复到2014年12月7日,看看是否能解决问题。我还尝试根据下面的答案删除并替换一个按钮,但是会弹出“无法插入对象”或类似的提示框。 - mountainclimber11
1
对于Windows XP用户,可以在这里找到Temp子文件夹:C:\Documents and Settings\[user.name]\Local Settings\Temp\Excel8.0\MSForms.exd - bjtilley
2
在删除了上述文件后,它对我没有起作用,但是我发现这些文件在C:/Windows/Temp文件夹中,然后将其删除。然后我就能够解决这个问题了。 - QV1
显示剩余8条评论

35

以下是我在微软Excel支持团队博客上找到的最佳答案:

在安装2014年12月更新后,对于一些用户来说,表单控件(FM20.dll)不再按预期工作。出现问题的情况包括:打开带有现有VBA项目的文件时使用表单控件、尝试将表单控件插入到新工作表中或运行可能使用这些组件的第三方软件。

您可能会收到如下错误信息:

"无法插入对象" "对象库无效或包含对无法找到的对象定义的引用"

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

要解决此问题,您必须删除客户端计算机上缓存的控件类型库(扩展程序文件)版本。为此,您必须搜索硬盘以查找具有“ .exd”文件名扩展名的文件,并删除所有找到的.exd文件。下次使用VBA时,这些.exd文件将自动重新创建。这些扩展程序文件将位于用户的配置文件下,也可能在其他位置,例如以下位置:

%appdata%\Microsoft\forms

%temp%\Excel8.0

%temp%\VBE

脚本解决方案:

由于此问题可能会影响多台计算机,因此还可以创建一个脚本解决方案来删除EXD文件,并将该脚本作为策略的一部分在登录过程中运行。您需要的脚本应包含以下行,并且需要为每个用户运行,因为.exd文件是特定于用户的。

删除 %temp%\vbe\*.exd

删除 %temp%\excel8.0\*.exd

删除 %appdata%\microsoft\forms\*.exd

删除 %appdata%\microsoft\local\*.exd

删除 %appdata%\Roaming\microsoft\forms\*.exd

删除 %temp%\word8.0\*.exd

删除 %temp%\PPT11.0\*.exd

额外步骤:

如果上述步骤无法解决您的问题,则可以尝试另一个步骤(请参见下面的警告):

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

    打开 Visual Basic for Applications > 修改任何代码模块中的注释或编辑 > 调试 > 编译 VBAProject。

    保存并重新打开文件。测试是否已解决。如果已解决,请向其他用户提供此更新后的项目。

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

如果这无法解决您的问题,则可能是其他问题,需要进一步进行故障排除。

Microsoft 目前正在解决此问题。请关注博客以获取更新。

来源


3
请查看链接的来源,它现在已经更新了脚本解决方案。 - peterson
在我的计算机上,%appdata% 被定义为 "C:\Users<current user>\AppData\Roaming",因此没有 "%appdata%\microsoft\local" 目录。此外,"%appdata%\Roaming\microsoft\forms" 似乎是多余的,因为 "C:\Users<current user>\AppData\Roaming\Roaming\microsoft\forms" 也不存在于我的计算机上。 - pstraton

15

这是 KB2553154 的问题。微软需要发布修复程序。作为Excel应用程序的开发人员,我们无法前往所有客户的计算机并删除文件。我们因为微软引起的问题而受到指责。


1
还有KB2596927和KB2726958,取决于您正在运行的Office版本。 - Harry Johnston

13

我是一名Excel开发人员,当这种情况发生时,我确实感到了痛苦。幸运的是,即使在Excel正在运行时,我仍然能够通过重新命名VBA中的MSForms.exd文件来找到解决方法,这也可以解决此问题。需要分发电子表格的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文件重命名为MSForms - Copy.exd。

然后在Workbook_Open事件的开头调用RenameMSFormsFiles子例程。

Private Sub Workbook_Open() 
  RenameMSFormsFiles  
End Sub
电子表格在打开时会尝试重命名MSForms.exd文件。显然,这不是完美的解决方案:
1. 受影响的用户仍将在打开电子表格并第一次运行VBA代码时遇到ActiveX控件错误。只有在执行一次VBA代码并重新启动Excel后才能解决该问题。通常当用户遇到损坏的电子表格时,第一反应是关闭Excel并尝试再次打开电子表格。 :) 2. 每次打开电子表格时都会重命名MSForms.exd文件,即使MSForms.exd文件没有问题。但是电子表格将正常工作。
至少目前,Excel开发人员可以继续使用此解决方法分发他们的工作,直到Microsoft发布修复程序。
我已在此处张贴了此解决方案。

谢谢Yi。这对我有用,但我不得不重新启动我的Excel 2010(这可能与我同时运行VBA编辑器有关吗?) - J. Chomel

5

在Windows 8.1中,我无法使用Windows搜索找到任何.exd文件。另一方面,使用命令提示符的dir *.exd /S命令可以在我的系统上找到一个文件。


3

我在KB及以上的建议并没有起作用。我发现,如果一个Excel 2007用户(无论是否安装了安全更新;不确定引起此问题的确切情况)保存文件,则原始错误将返回。

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

在我的情况下,我不能升级/更新各个位置的Excel文件的所有用户。由于某些用户保存Excel文件后问题会再次出现,我将不得不用其他控件替换ActiveX控件。


2
除了将文件另存为XLSX(删除所有代码),然后像您所做的那样重新粘贴 - 重新保存为XLSM之外,没有任何建议对我有用。微软真是个巨大的痛苦。重新安装Office对我也没有用,所以没人要浪费时间尝试那个。 - DontFretBrett

3
我找到的关于这个问题的最佳信息和更新来源在TechNet博客中的Microsoft Excel支持团队博客(如上所述):
- 单击链接:Form Controls stop working after December 2014 Updates (Updated March 10, 2015)
- 在2015年3月,除了自动修复和手动说明之外,还发布了热补丁,并且也可以通过Windows Update获得。
Microsoft的最新更新和修复:
- 单击链接:3025036 "Cannot insert object" error in an ActiveX custom Office solution after you install the MS14-082 security update 状态:2015年3月更新已发布热补丁以解决此问题。
有些用户在安装了2014年12月的MS14-082 Microsoft Office安全更新后,发现表单控件(FM20.dll)不再按预期工作。当他们打开带有现有VBA项目的文件时,使用表单控件尝试插入新工作表或运行可能使用这些组件的第三方软件时,会遇到问题。
您可能会收到以下错误:
- “无法插入对象”; - “对象库无效或包含对找不到的对象定义的引用”; - “用于创建此对象的程序是Forms。该程序未安装在您的计算机上,或者它未响应。要编辑此对象,请安装Forms或确保Forms中的任何对话框已关闭。” - 此外,您可能无法使用或更改工作表上的ActiveX控件的属性,或在尝试通过代码将ActiveX控件引用为工作表成员时收到错误。
手动和其他解决方法:
- 脚本解决方案: - 由于此问题可能影响多台计算机,因此还可以创建脚本解决方案以删除EXD文件,并将脚本作为登录过程的一部分使用策略运行。您需要的脚本应包含以下行,并且需要为每个用户运行,因为.exd文件是特定于用户的。
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

额外步骤:

如果上述步骤无法解决您的问题,可以尝试另一个步骤(请注意警告):

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

  2. 打开 Visual Basic for Applications > 修改项目,添加注释或对任何代码模块进行编辑 > 调试 > 编译 VBAProject。

  3. 保存并重新打开文件。测试是否已解决问题。

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

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


2

为终端用户提供简化的说明。请随意复制/粘贴以下内容。

当出现问题时,以下是解决方法:

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

您可能需要等待问题发生才能使此修复程序起作用。过早地应用它(在Windows更新安装到您的系统之前)是无效的。


1

1

我想提供一个对我来说是唯一有效的答案(我意识到可能只有我一个人)。我在一个宏中调用了一个代码,使用了功能区。它包含以下代码:

colStore = new Collection

我没有意识到它会抛出错误,所以我感到困惑并尝试了这里的所有方法。按钮停止工作,我无法让它正常工作。当我注意到错误并进行更正时:

Set colStore = new Collection

它又开始工作了。如果你问我,这绝对很奇怪,但也许能帮助一些像我一样绝望的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接