Microsoft Excel ActiveX 控件已禁用?
Posted
技术标签:
【中文标题】Microsoft Excel ActiveX 控件已禁用?【英文标题】:Microsoft Excel ActiveX Controls Disabled? 【发布时间】:2015-02-09 06:15:43 【问题描述】:我有一些 Excel 工作表使用 ActiveX 复选框来控制某些活动。他们最近工作,但今天开始出错。一位同事向我发出了警告,但它仍在我的计算机上运行。我对照我的检查了他的 Excel 版本,他的版本较新。我注意到有新的 Windows 更新,所以我进行了更新。在我应用挂起的更新后,它现在不再在我的计算机上运行。我无法再检查 ActiveX 复选框,并且,作为尝试调试的一部分,我什至无法将 ActiveX 控件添加到任何工作表,甚至是新工作表中。我收到一个错误对话框,上面写着“无法插入对象”。 (我仍然可以添加表单控件,只是不能添加 ActiveX。)最近更新后还有其他人遇到这种情况吗?有什么建议吗?
谢谢,
迈克
【问题讨论】:
具体是什么控制?还是你的意思是所有的activeX? 我的三个同事似乎也有这个问题。我认为他们的电子表格使用 ActiveX 控件 - 组合框和按钮。其中一位正在使用他的电脑,因此没有得到更新。当他把它拿回来时,它成功地运行了控制。也就是说,直到他的电脑自动更新。现在没有了。我们也不能将 ActiveX 控件添加到他们的工作表中。 我和我公司的所有用户都遇到了这个问题。 MS 怎么可能发布破坏 Excel 中 ActiveX 控件的更新?这太疯狂了。 @vba4all: 不,这是一个编程问题,属于这里。 @vba4all:ActiveX 控件是一种编程工具——不是吗?你还会用它们做什么?例如,如果 OP 询问某个已停止工作的特定第三方产品(恰好使用 VBA),情况会有所不同。但在这种情况下,受影响的似乎是他自己的代码? 【参考方案1】:从其他论坛,我了解到这是由于 MS 更新,一个好的解决方法是从用户配置文件中的任何 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,并能够添加一个 ActiveX 按钮。我查找了 C:\Users[user.name]\AppData\Local\Temp\Excel8.0\MSForms.exd,但没有 Excel8.0 文件夹。然后我运行 Windows 更新。我再次尝试在我的电子表格中添加一个 ActiveX 按钮,但没有成功。我还注意到我现在拥有 Excel8.0\MSForms.exd。我删除了它并且没有重新启动重新打开 Excel,现在可以添加 ActiveX 按钮。谢谢! 谢谢!!此过程解决了我的计算机上的问题。我觉得对于拥有大型公开发布的开发人员来说,这会破坏......希望 MS 会发布一个修复程序。 这对我不起作用。我正在我们的一台电脑上将系统恢复到 2014 年 12 月 7 日,看看是否能修复它。我还尝试删除一个按钮并根据下面的答案替换它,但我收到了一个弹出窗口“无法插入对象”或类似的东西。 对于 Windows XP 用户 Temp 子文件夹可以在这里找到:C:\Documents and Settings\[user.name]\Local Settings\Temp\Excel8.0\MSForms.exd 删除上述文件后,它对我不起作用,但后来我在 C:/Windows/Temp 文件夹中找到了这些文件,并将其删除。然后我就可以解决这个问题了。【参考方案2】:这是我在 Microsoft Excel 支持团队博客上找到的最佳答案
对于某些用户,Forms Controls (FM20.dll) 不再作为 预计安装 2014 年 12 月更新后。问题是 有时经历过,例如当他们使用现有 VBA 打开文件时 使用表单控件的项目,尝试将表单控件插入到 新的工作表或运行可能使用这些的第三方软件 成分。
您可能会收到如下错误:
"无法插入对象" "对象库无效或包含引用 到无法找到的对象定义”
此外,您可能无法使用或更改 工作表上的 ActiveX 控件或在尝试 通过代码将 ActiveX 控件称为工作表的成员。 更新后的步骤:
要解决此问题,您必须删除缓存的 控制客户端计算机上的类型库(扩展文件)。去做 为此,您必须在硬盘上搜索具有“.exd”的文件 文件扩展名并删除您找到的所有 .exd 文件。这些 .exd 文件将在您使用新版本时自动重新创建 控制您下次使用 VBA 的时间。这些扩展文件将是 在用户的个人资料下,也可能在其他位置,例如 以下:
%appdata%\Microsoft\forms
%temp%\Excel8.0
%temp%\VBE
脚本解决方案:
因为这个问题可能会影响多台机器,所以也是 可以创建脚本解决方案来删除 EXD 文件和 使用策略将脚本作为登录过程的一部分运行。剧本 您需要包含以下几行,并且需要 为每个用户运行,因为 .exd 文件是特定于用户的。
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
附加步骤:
如果上述步骤不能解决您的问题,可以采取另一个步骤 已测试(请参阅下面的警告):
在完全更新的机器上并删除 .exd 文件后,在 Excel 中以编辑权限打开文件。
打开 Visual Basic for Applications > 通过向任何代码模块添加注释或某种类型的编辑来修改项目 > 调试 > 编译 VBA 项目。
保存并重新打开文件。测试分辨率。如果解决,请将此更新后的项目提供给其他用户。
警告:如果此步骤解决了您的问题,请注意,在将此更新后的项目部署给其他用户后,这些用户将 还需要在他们的系统和 .exd 文件上应用更新 也被删除了。
如果这不能解决您的问题,则可能是另一个问题,并且 可能需要进一步的故障排除。
Microsoft 目前正在解决此问题。观看博客 更新。
Source
【讨论】:
检查链接源,它现在已经更新了脚本解决方案 在我的机器上,%appdata%被定义为“C:\Users\\AppData\Roaming\”,所以没有“%appdata%\microsoft\local\”目录.此外,"%appdata%\Roaming\microsoft\forms\" 似乎是多余的,因为 "C:\Users\它是KB2553154。 Microsoft 需要发布修复程序。作为 Excel 应用程序的开发人员,我们无法访问我们所有的客户计算机并从它们上删除文件。我们因 Microsoft 造成的某些事情而受到指责。
【讨论】:
还有 KB2596927 和 KB2726958,具体取决于您运行的 Office 版本。【参考方案4】:我是一名 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 文件。显然,这不是一个完美的解决方案:
-
当第一次打开电子表格运行 VBA 代码时,受影响的用户仍然会遇到 ActiveX 控件错误。仅在执行一次 VBA 代码并重新启动 Excel 后,问题才得以解决。通常,当用户遇到损坏的电子表格时,下意识的反应是关闭 Excel 并尝试再次打开电子表格。 :)
每次打开电子表格时都会重命名 MSForms.exd 文件,即使 MSForms.exd 文件没有问题。但是电子表格可以正常工作。
至少目前,Excel 开发人员可以继续使用此解决方法分发他们的工作,直到 Microsoft 发布修复程序。
我已经发布了这个解决方案here。
【讨论】:
谢谢易。它对我有用,但我不得不重新启动我的 Excel 2010(这可能与我同时运行 VBA 编辑器的事实有关?)【参考方案5】:在 Windows 8.1 中,我无法使用 Windows 搜索找到任何 .exd 文件。另一方面,cmd 命令 dir *.exd /S
在我的系统上找到了一个文件。
【讨论】:
【参考方案6】:KB 及以上的建议对我不起作用。我发现如果一个 Excel 2007 用户(有或没有安全更新;不确定导致此问题的确切情况)保存文件,就会返回原始错误。
我发现再次修复文件的最快方法是删除所有 VBA 代码。保存。然后替换 VBA 代码(复制/粘贴)。保存。在尝试此操作之前,我先删除 .EXD 文件,否则打开时会出错。
就我而言,我无法在不同位置升级/更新我的 Excel 文件的所有用户。由于某些用户保存 Excel 文件后问题又出现了,我将不得不用其他东西替换 ActiveX 控件。
【讨论】:
除了将文件保存为 XLSX(删除所有代码),然后像您一样重新粘贴 - 重新保存为 XLSM 之外,没有其他建议对我有用。微软的巨大痛苦。重新安装 Office 也没有为我解决问题,所以没有人会浪费你的时间去尝试【参考方案7】:我可以在 TechNet 博客 » Microsoft Excel 支持团队博客(如上所述)中找到有关此问题的最佳信息和更新来源:
Form Controls stop working after December 2014 Updates (Updated March 10, 2015)
在 2015 年 3 月发布了一个修补程序,除了自动修复和手动说明之外,它也可以在 Windows 更新中使用。
来自 Microsoft 的最新更新和修复: 3025036 "Cannot insert object" error in an ActiveX custom Office solution after you install the MS14-082 security update
状态:2015 年 3 月 10 日更新:
此问题的修补程序已在 Office 2007、2010 和 2013 的 2015 年 3 月更新中发布。
有关问题的一般信息:
对于某些用户,在 2014 年 12 月安装 MS14-082 Microsoft Office 安全更新后,表单控件 (FM20.dll) 不再按预期工作。有时会遇到问题,例如当他们使用表单打开现有 VBA 项目的文件时控件,尝试将表单控件插入新工作表或运行可能使用这些组件的第三方软件。
https://technet.microsoft.com/en-us/library/security/ms14-082.aspx
您可能会收到以下错误: “无法插入对象”; “对象库无效或包含对无法找到的对象定义的引用”; “用于创建此对象的程序是 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
附加步骤:
如果上述步骤不能解决您的问题,可以测试另一个步骤(请参阅下面的警告):
在完全更新的计算机上并删除 .exd 文件后,在 Excel 中以编辑权限打开文件。
打开 Visual Basic for Applications > 通过向任何代码模块添加注释或某种类型的编辑来修改项目 > 调试 > 编译 VBAProject。
保存并重新打开文件。测试分辨率。
如果解决,请将此更新后的项目提供给其他用户。
警告:如果此步骤解决了您的问题,请注意,在将此更新后的项目部署给其他用户后,这些用户还需要在他们的系统上应用更新并删除 .exd 文件。
【讨论】:
【参考方案8】:针对最终用户的简化说明。随意复制/粘贴以下内容。
出现问题时如何解决:
-
关闭所有 Office 程序和文件。
打开 Windows 资源管理器并在地址栏中键入 %TEMP%,然后按 Enter。这将带您进入系统临时文件夹。
找到并删除以下文件夹:Excel8.0、VBE、Word8.0
现在再次尝试使用您的文件,它应该没有任何问题。
您可能需要等到问题发生才能使此修复生效。过早地应用它(在您的系统上安装 Windows 更新之前)将无济于事。
【讨论】:
【参考方案9】:我终于在微软官方 KB 上找到了这个答案:
http://support.microsoft.com/kb/3025036/EN-US
这里没有比我们在之前的答案中获得的新信息,但至少它承认微软已经意识到了这个问题。
【讨论】:
【参考方案10】:我知道已经为此发布了许多答案,但没有一个答案独立地适用于我的网站。所以这对我有用:
第 1 步:卸载以下更新 - KB2920789、KB2920790、KB2920792、KB2920793、KB2984942、KB2596927
第 2 步:隐藏这些更新,以便在后续重新启动时不会安装它们
步骤 3:从 C:\Users\\AppData\Local\Temp 删除文件夹 Excel8.0
第 4 步:重新启动工作站(我还要确保上述 KB 不会无意中被应用)
【讨论】:
【参考方案11】:我想提供一个唯一对我有用的答案(我意识到我可能是唯一一个)。我使用功能区调用了一个宏。它有以下代码:
colStore = new Collection
我不知道它会引发错误,所以我很困惑并尝试了这里的所有内容。该按钮刚刚停止工作,我无法让它工作。当我注意到错误并将其更正为:
Set colStore = new Collection
它又开始工作了。如果你问我,这绝对很奇怪,但也许它可以帮助像我一样绝望的人。
【讨论】:
以上是关于Microsoft Excel ActiveX 控件已禁用?的主要内容,如果未能解决你的问题,请参考以下文章
使用 .Net Framework 编写的 Microsoft Access 报表 ActiveX 控件
将控件(ActiveX或非ActiveX)添加到图表(Excel VBA)
vbscript 使用Microsoft ActiveX Data Objects 2.8库连接到SQL数据源