【问题标题】:ActiveX control in a Excel file gives "Could not load an object..." error on some machinesExcel 文件中的 ActiveX 控件在某些计算机上出现“无法加载对象...”错误
【发布时间】:2012-04-29 11:17:55
【问题描述】:

我们在公司的几台机器上使用了一组 Excel 文件。这些文件包含一个 VBA 应用程序,它利用了来自mscomct2.ocx 库(即MonthViewDateTimePicker)的几个ActiveX 控件对象。 ActiveX 对象将显示在用户窗体中。不幸的是,这些文件的可移植性似乎以一种非常特殊的方式受到限制。

似乎有 2 组机器:

  • A 组:我可以在这样的机器上创建一个包含MonthView 的 Excel 文件,并在任何 A 组 PC 上使用它。但是当我尝试在 B 组的任何机器上打开此文件时,我收到 Could not load an object because it is not available on this machine 错误。但是,在 B 组机器上创建的具有相同 ActiveX 的文件在 A 机器上可以正常工作。
  • B 组: 在这些机器上创建的带有相关 ActiveX 的文件在任何地方都可以工作(即在任何 A 和 B 机器上)。但是,正如我之前所说,当打开A机器上保存的带有ActiveX的文件时,B机器会出现上述错误。

一句话:在A机器上创建的文件只能在其他A机器上工作,在B机器上创建的文件无处不在

这里最奇怪的是每台机器都注册了mscomct2.ocx(再说一次:我可以用MonthView在任何有问题的机器上创建表单!)。 .ocx 本身位于每台机器上,并且存在整套注册表项(用于控件类的 CLSID、IID、typelib ID...)。此外,这些注册表项中的数据在 A 组和 B 组机器(GUID、ProgID、版本等)上似乎相同。某些机器上的描述字符串(如“Microsoft MonthView Control 6.0 (SP6)”之类的值)略有不同,但这似乎不会影响情况(B组中的一些机器有这样的描述不同,但在它们上创建的文件仍然可以在任何地方工作)。

自然,由于墨菲定律,我用来编辑这些 Excel 文件的机器属于 A 组,所以这里保存的文件对于 B 机器“不可移植”...

操作系统和 Excel 版本似乎不会影响这种情况。例如,其中一台 B 机器在 Win 7 64 位 (Excel 2007) 下工作,而大多数其他 A 和 B 组机器是 Win XP Prof (32 位) SP3,安装了 Excel 2003。所以看起来 OS 和 Excel 版本不影响兼容性,问题与 ActiveX 有某种联系。

我发现A组和B组之间唯一与ActiveX相关的区别是mscomct2.ocx的文件版本:至少有几台A机器有6.1.x.x版本,而B组有6.0.x.x。我不明白这种差异如何导致问题(ActiveX 毕竟是 COM 对象,根据注册表键值,暴露的 typelib、com 对象和接口似乎在所有情况下都是相同的)。尽管如此,我还是尝试用 6.0.x.x 版本替换我的 6.1.x.x ocx ......但遇到了更多麻烦。我所做的是:

  1. regsvr32 /u mscomct2.ocx - 成功完成
  2. mscomct2.ocx 替换为 6.0.x.x 版本的文件
  3. regsvr32 mscomct2.ocx - 成功完成

在这些步骤之后,我尝试制作一个包含MonthView 的单一表单的 Excel 文件。但是当我试图在表单中放置一个控件时,我得到了一个带有错误 Class not registered 的消息框。这真的很奇怪,因为一切似乎都已注册:控件类、它的接口、typelib(是的,我已经检查了注册表以确定)。但错误仍然存​​在。

之后,我再次执行取消注册/替换/注册过程以返回到我原来的 6.1.x.x 文件。这让我回到了最初的 SNAFU 情况:我可以再次将 ActiveX 安装到用户表单并使用它,但是 B 组机器仍然在我机器保存的文件上报错。

我认为文件与 ActiveX 的可移植性问题和ocx 注册问题有某种联系,但我不知道如何联系。在 Excel VBA 中注册 ActiveX 可能还有一些我不知道的额外要求...

我唯一需要的是让我的 Excel 文件中包含的 ActiveX 对象与其他机器兼容。谁能帮我解决这个问题?

【问题讨论】:

    标签: excel vba com activex


    【解决方案1】:

    我认为一组(可能是“A”)安装了这个:http://www.microsoft.com/download/en/details.aspx?id=10019,另一组没有。

    【讨论】:

    • 好的。 1. 这个怎么样? microsoft.com/download/en/… rel.notes 说它包括失败的 controlz 的 6.1 版本.. 2. 您也可以尝试像您一样将 6.0 文件移动到 6.1 系统,但也可以使用另一个 OCX 重复您的步骤 1-3 ,“comctl32.ocx”。附:问题肯定是 VB 6.0 时代的 DLL 地狱。查看此线程:windows-installer-xml-wix-toolset.687559.n2.nabble.com/…
    • 1.我无法在我们的 PC 上安装此更新:它需要安装“Visual Basic 6 产品”。显然 Excel 中使用的 VB 不算在内。我什至在安装了完整 VS2005(包括 VB)的机器上尝试了这个文件——同样的东西。 2. 也没有效果 :( 无论如何感谢您的帮助 - +1 为您的关注。
    • P.S.我希望我在尝试降级 ocx 时至少知道哪个类“未注册”。有没有办法学习?
    • OK,那么您可以尝试解压缩 MSI(通过从命令行运行“msiexec /a VB60SP6-KB926857-x86-ENU.msi TARGETDIR=C:\Temp\VB6Controls /qb” ),它会给你 8 个 OCX 文件:comct232.ocx mschrt20.ocx mscomct2.ocx msdatgrd.ocx MSFlxGrd.Ocx mshflxgd.ocx msmask32.ocx mswinsck.ocx,并尝试将它们全部注册。包含的 mscomct2.ocx 文件版本为 6.1.98.12,产品版本为 6.01.9812。
    • P.S.您可以为此使用 ProcessMonitor 实用程序:technet.microsoft.com/en-us/sysinternals/bb896645。只需设置过滤器,使其仅包含为您提供消息框的过程,尝试注册服务器,查看消息框,然后停止记录注册表,并从下到上阅读日志。然而,相对。该更新的说明说他们修复了一些安全问题,所以我会尝试升级控件而不是降级..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2023-03-26
    • 2017-05-08
    相关资源
    最近更新 更多