我有使用ActiveX复选框控制某些活动的Excel工作表。
今天它们开始出现错误。我的同事在运行较新版本的Excel时提醒了我,但在我的电脑上仍然可以正常工作。
我注意到有Windows更新,所以我进行了更新。现在它在我的电脑上不再起作用。
我无法再检查ActiveX复选框。
我无法向任何工作表添加ActiveX控件,甚至是新工作表。
我会收到一个错误对话框
无法插入对象。
我可以添加窗体控件,只是不能添加ActiveX控件。
我有使用ActiveX复选框控制某些活动的Excel工作表。
今天它们开始出现错误。我的同事在运行较新版本的Excel时提醒了我,但在我的电脑上仍然可以正常工作。
我注意到有Windows更新,所以我进行了更新。现在它在我的电脑上不再起作用。
我无法再检查ActiveX复选框。
我无法向任何工作表添加ActiveX控件,甚至是新工作表。
我会收到一个错误对话框
无法插入对象。
我可以添加窗体控件,只是不能添加ActiveX控件。
从其他论坛上了解到,这是由于微软更新所致,一个好的修复方法是简单地从用户配置文件中的任何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 等)必须关闭才能删除此文件。
以下是我在微软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
额外步骤:
如果上述步骤无法解决您的问题,则可以尝试另一个步骤(请参见下面的警告):
在更新完全的计算机上,删除 .exd 文件后,使用 Excel 以编辑权限打开文件。
打开 Visual Basic for Applications > 修改任何代码模块中的注释或编辑 > 调试 > 编译 VBAProject。
保存并重新打开文件。测试是否已解决。如果已解决,请向其他用户提供此更新后的项目。
警告:如果此步骤解决了您的问题,请注意,在将此更新后的项目部署到其他用户之前,这些用户也需要对其系统应用更新并删除 .exd 文件。
如果这无法解决您的问题,则可能是其他问题,需要进一步进行故障排除。
Microsoft 目前正在解决此问题。请关注博客以获取更新。
这是 KB2553154 的问题。微软需要发布修复程序。作为Excel应用程序的开发人员,我们无法前往所有客户的计算机并删除文件。我们因为微软引起的问题而受到指责。
我是一名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文件。显然,这不是完美的解决方案:在Windows 8.1中,我无法使用Windows搜索找到任何.exd文件。另一方面,使用命令提示符的dir *.exd /S
命令可以在我的系统上找到一个文件。
我在KB及以上的建议并没有起作用。我发现,如果一个Excel 2007用户(无论是否安装了安全更新;不确定引起此问题的确切情况)保存文件,则原始错误将返回。
我发现修复文件的最快方法是删除所有的VBA代码。保存。然后替换VBA代码(复制/粘贴)。保存。在尝试这之前,我首先删除.EXD文件,否则我会在打开时遇到错误。
在我的情况下,我不能升级/更新各个位置的Excel文件的所有用户。由于某些用户保存Excel文件后问题会再次出现,我将不得不用其他控件替换ActiveX控件。
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
额外步骤:
如果上述步骤无法解决您的问题,可以尝试另一个步骤(请注意警告):
在完全更新的计算机上并删除 .exd 文件后,使用编辑权限在 Excel 中打开文件。
打开 Visual Basic for Applications > 修改项目,添加注释或对任何代码模块进行编辑 > 调试 > 编译 VBAProject。
保存并重新打开文件。测试是否已解决问题。
如果解决了问题,请将此更新后的项目提供给其他用户。
警告:如果此步骤解决了您的问题,请注意,在将此更新后的项目部署到其他用户之前,这些用户也需要在其系统上应用更新并删除 .exd 文件。
为终端用户提供简化的说明。请随意复制/粘贴以下内容。
当出现问题时,以下是解决方法:
您可能需要等待问题发生才能使此修复程序起作用。过早地应用它(在Windows更新安装到您的系统之前)是无效的。
我最终在官方微软KB上找到了这个答案:
这里没有比之前回答中更多的信息,但至少它承认微软已经意识到了这个问题。我想提供一个对我来说是唯一有效的答案(我意识到可能只有我一个人)。我在一个宏中调用了一个代码,使用了功能区。它包含以下代码:
colStore = new Collection
我没有意识到它会抛出错误,所以我感到困惑并尝试了这里的所有方法。按钮停止工作,我无法让它正常工作。当我注意到错误并进行更正时:
Set colStore = new Collection
它又开始工作了。如果你问我,这绝对很奇怪,但也许能帮助一些像我一样绝望的人。