Excel文件中的ActiveX控件给出;无法加载对象…”;某些机器上的错误

Excel文件中的ActiveX控件给出;无法加载对象…”;某些机器上的错误,excel,vba,com,activex,Excel,Vba,Com,Activex,我们在公司的几台机器上使用一套Excel文件。这些文件包含一个VBA应用程序,该应用程序使用mscomct2.ocx库中的两个ActiveX控件对象(即MonthView和DateTimePicker)。ActiveX对象将以用户形式显示。不幸的是,这些文件的可移植性似乎受到了非常特殊的限制 似乎有两组机器: A组:我可以在这样的计算机上创建一个包含MonthView的Excel文件,并在任何A组PC上使用它。但是当我尝试在B组的任何计算机上打开此文件时,我得到一个无法加载对象的错误,因为它在

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

似乎有两组机器:

  • A组:我可以在这样的计算机上创建一个包含
    MonthView
    的Excel文件,并在任何A组PC上使用它。但是当我尝试在B组的任何计算机上打开此文件时,我得到一个无法加载对象的错误,因为它在此计算机上不可用。但是,在B组计算机上创建的具有相同ActiveX的文件在A组计算机上正常工作
  • B组:在这些机器上创建的带有ActiveX的文件在任何地方都可以工作(即在任何A和B机器上)。但是,正如我前面所说,当打开保存在机器上的带有ActiveX的文件时,B机器会给出上面提到的错误
一句话:在一台机器上创建的文件只在其他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组机器中的一台在Win7 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
ocx
。。。遇到了更多的麻烦。我所做的是:

  • regsvr32/u mscomct2.ocx
    -已成功完成
  • mscomct2.ocx
    替换为6.0.x.x版本的文件
  • regsvr32 mscomct2.ocx
    -已成功完成
  • 在这些步骤之后,我尝试用一个包含
    MonthView
    的表单创建一个Excel文件。但是,当我试图在表单中放置控件时,我得到了一个messagebox,其错误类未注册。这真的很奇怪,因为所有的东西似乎都被注册了:控件类、它的接口、typelib(是的,我已经检查了注册表以确定)。但错误仍然存在

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

    我假设ActiveX可移植性文件的问题和ocx注册的问题在某种程度上是相互联系的,但我不知道如何联系。也许在Excel VBA中注册ActiveX还有一些附加要求,我不知道


    我唯一需要做的就是让ActiveX对象在我的Excel文件中与其他机器兼容。有人能帮我吗?

    我想有一组(可能是“A”)安装了这个:,另一组没有。

    好的。1.这个怎么样?相关说明说,它包括6.1版本的controlz,但失败了。。2.您也可以尝试将6.0文件移动到您的6.1系统,就像您所做的那样,但也可以使用另一个OCX“comctl32.OCX”重复步骤1-3。问题当然是VB6.0时代的DLL地狱。。检查这个线程:1。我无法在我们的电脑上安装此更新:它需要安装“Visual Basic 6产品”。显然,Excel中使用的VB不起作用。我甚至在安装了完整VS2005(包括VB)的机器上尝试了这个文件——同样的东西。2.也没有效果:(无论如何,谢谢你的帮助-+1谢谢你的关心。另外,我希望我至少知道当我试图降级ocx时哪个类是“未注册”的。有没有办法了解这一点?好的,那么你可以尝试解包MSI(通过运行“msiexec/a VB60SP6-KB926857-x86-chs.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。您可以使用ProcessMonitor实用程序实现这一点:。只需设置过滤器,使其仅包含process提供一个messagebox,尝试注册服务器,查看messagebox,然后停止登录注册表,从下到上读取日志。但是,