从 Excel 2013 降级到 Excel 2010 时丢失 VBA

从 Excel 2013 降级到 Excel 2010 时丢失 VBA

我使用的是 Windows 7。过去我使用的是 Excel 2003。我安装了 Office 2013,发现我的 Office 2003 完好无损,我可以运行两个版本。我使用 Excel 2013 和 VBA 代码更新了一些工作表。

我被告知需要使用 Office 2010(我不会解释原因),所以我卸载了 Office 2013 并安装了 Office 2010(企业许可证)。当我在 2010 中打开使用 Excel 2013 修改的电子表格时,我收到一条 Microsoft Visual Basic for Applications 消息:

类未注册。正在查找 CLSID 为 (AC9F2F90-E877-11DE-9F68-00AA00574A4F) 的对象

当我点击“确定”时,我收到 Excel 消息

Excel 发现无法读取的内容电子表格名称.xls。是否恢复此工作簿的内容?

如果我选择“是”,则会收到一条消息,内容如下

Excel 能够通过修复或删除不可读内容来打开文件。Visual Basic 项目丢失。对数据透视表进行了修复,从工作簿中删除了一个或多个无效的条件格式,并且 ActiveX 控件丢失。

现在找不到 VBA 代码。工作簿打开后看起来正常,但运行 VBA 的按钮不起作用,打开 VBA ( Alt+ F11) 时,我看不到任何模块。

我尝试FM20.dll使用 regsrv32.exe 运行并收到一条消息:

模块 fm20.dll 加载失败。请确保二进制文件存储在指定路径或对其进行调试以检查二进制文件或相关 .DLL 文件是否存在问题。找不到指定的模块”。

但是我从 FM20.dll 所在的子目录运行了 regsrv32。

我推测我的问题与丢失 Visual Basic 项目和/或 ActiveX 控件有关。

我需要做什么才能找到删除 Excel 2013 并安装 Excel 2010 之前存在的 VBA 代码?

答案1

我遇到了类似的问题。我使用了另一台尚未“升级”到 2013 的计算机上的另一个 fm20.dll 文件。fm20.dll 的注册很顺利,我的问题也消失了。似乎 fm20.dll 文件已损坏。任何具有用户窗体的 VBA 似乎都受到了影响。我收到的 Excel 2010 错误是:“此工作簿的 Visual Basic for Applications (VBA) 宏已损坏并已被删除。宏损坏很可能存在于当前文件中。要恢复宏,请打开此文件的备份副本(如果有)。”一个简单的测试,打开一个只有代码的 VBA 工作簿,成功了,还有一个带有用户窗体的简单文件,上面有一个没有代码的标签,失败了,这导致我找到了 fm20.dll 文件。我尝试在问题系统上注册 fm20.dll 文件时收到相同的消息,说文件坏了。从良好的系统复制了新的 fm20.dll,注册顺利,问题消失。

答案2

Office 2013 安装 VBA 7.1。同时,还安装了 FM20.dll 的更新版本 - 而 FM20.dll 又依赖于 VC10 可再发行组件 - 特别是 msvcr100.dll。卸载 VBA 7.1 时 - 它不会删除 FM20.dll - 但附带的应用程序很可能会删除 VC10 可再发行组件。如果删除,FM20.dll 就会损坏。这并不是说它损坏了 - 只是不完整。(我使用 Visual Studio 工具 Depends.exe 追踪了这个问题)

问题是重新安装使用 VBA 6.x 的应用程序不会覆盖这个较新版本的 FM20.dll,因此文件仍然损坏。

看起来这是 VBA 7.1 安装程序中的一个错误,它没有清理此文件。您必须选择解决方法。删除 FM20.dll 并修复旧应用程序 - 或安装 VC10 可再发行组件。

答案3

这篇博文帮助我纠正了这个错误:
https://dynamicsgpland.blogspot.in/2009/11/vba-error-class-not-registered-looking.html

VBA 错误:类未注册。正在查找 CLSID 为:{AC9F2F90-E877-11CE-9F68-00AA00574A4F} 的对象

我知道,我知道,这是一个非常明显的错误,对吧?我的意思是,真的,在 Dynamics GP 世界中,有谁不会嘲笑你询问这个明显的类 ID?

因此,我最近为一个新项目创建了一个新的开发虚拟服务器,我已经做过几十次了,没有任何问题。但出于某种原因,这次我在 Dynamics GP 中遇到了一些奇怪的问题。其中之一是这个 VBA 错误:

在此处输入图片描述

这是在全新的 Windows Server 2008 x64 虚拟服务器、SQL Server 2005 SP3 和 Dynamics GP 10 FP1 上发生的,已安装 SP4。我没有安装 Visual Studio 或 Office,我很确定这是导致错误的原因。

每当我尝试将用户表单文件导入 VBA,或者每当我尝试插入新的用户表单时,就会发生错误。

我后来发现,此错误显然是 MBS KB 文章 961568 中描述的错误的一种变体:

“加载期间发生错误”或当您导入具有用户表单的包文件时:控件 frmXXX 的类 {C62A69F0-16DC-11CE-9E98-00AA00574A4F} 不是已加载的控件类。

当时,我知道这可能意味着 DLL 未在服务器上注册,但是尽管这些可爱的 GUID 令人赏心悦目,但它们并没有向普通人传达哪个 DLL 未注册的信息。

为了方便起见,我切换到我知道 VBA 中的用户表单没有任何问题的服务器,并在注册表中搜索该 GUID。搜索结果告诉我,问题在于 FM20.dll 文件未注册。

在谷歌上搜索该文件名后,我了解到 FM20.dll 是允许 VBA 与 Windows 窗体配合使用所需的文件。这篇可爱的知识库文章描述了它的用法,但强调 FM20.dll“不可重新分发”(他们不得不将“不”全部大写并加粗,以便我们这些对小写非加粗版本的“不”一词不清楚和困惑的人能够理解),并且只能通过安装恰好分发它的几个 Microsoft 应用程序之一来获取它。

一个高薪律师团队花费了数千美元的可计费小时数才想出这个绝妙的方案,它肯定能阻止某人复制单个 DLL 文件并手动注册它。为了避免激怒那些暑期实习法律学者,我没有简单地从另一台机器复制 DLL 并将其注册到我的新服务器上。相反,我使用同一篇 KB 文章中的链接下载了非常流行的“Microsoft ActiveX Control Pad”,它为我安装了梦寐以求的 FM20.dll。

(当然,MBS KB 文章说只需从 MS Office CD 复制 FM20.dll 文件即可。MBS,我们是不是在违反规则?)

这样,错误就消失了,我能够将用户表单插入并将表单文件导入到我的 VBA 项目中。

值得注意的是——如果您使用的是 Windows Server 2008 x64,则 32 位文件安装在 C:\Windows\SysWOW64 目录中。

相关内容