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

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

似乎有两组机器:

  • A组:我可以在这样的机器上创build一个包含MonthView的Excel文件,并在任何A组PC上使用它。 但是,当我尝试在组B的任何一台机器上打开这个文件,我得到一个无法加载一个对象,因为它不是在这个机器上的错误。 但是,在B组机器上创build的具有相同ActiveX的文件在A机器上正常工作。
  • B组:带有在这些机器上创build的ActiveX的文件在任何地方都可以工作(即在任何A和B机器上)。 但是,正如我前面所说的,当机器上保存的ActiveX文件打开时,B机器给出上述错误。

在一个句子中: 在一台机器上创build的文件只能在其他A上工作,无处不在B上创build的文件

这里最奇怪的是每台机器都有mscomct2.ocx注册(再一次:我可以在任何机器上使用MonthView创build表单)。 .ocx本身就位于每台机器上,并且存在整套registry项(CLSID用于控件类,IID,typelib ID …)。 此外,这些registry项中的数据在A和B组机器上(GUID,ProgID,版本等)似乎是相同的。 在某些机器上,描述string(如“Microsoft MonthView Control 6.0(SP6)”的值)略有不同,但这似乎并不影响这种情况(B组中的一些机器具有不同的描述,但在其上创build的文件仍然可用)。

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

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

我发现A和B组之间唯一与ActiveX相关的区别是mscomct2.ocx的文件版本:A机器中至less有几个版本是6.1.xx,而B组是6.0.xx我看不出有什么区别导致问题(毕竟ActiveX是COM对象,并且根据registry键值,暴露的typelib,com对象和接口在所有情况下似乎是相同的)。 尽pipe如此,我试图用6.0.xx版本取代我的6.1.xx ocx ,并且遇到了更多麻烦。 我所做的是:

  1. regsvr32 /u mscomct2.ocx – 已成功完成
  2. 用6.0.xx版本的文件replace了mscomct2.ocx
  3. regsvr32 mscomct2.ocx – 已成功完成

完成这些步骤之后,我尝试使用包含MonthView单个窗体创build一个Excel文件。 但是当我试图放置一个控件的forms,我有一个错误类没有注册的消息框。 这真是奇怪,因为一切似乎都被注册了:控制类,它的接口,typelib(是的,我已经检查过registry)。 但仍然有错误。

之后,我再次取消注册/replace/注册过程回到我原来的6.1.xx文件。 这使我回到原来的SNAFU情况:我可以再次安装ActiveX到用户窗体并使用它,但B组机器仍然给我的机器保存的文件上的错误。

我认为文件与ActiveX可移植性的问题和ocx注册的问题以某种方式连接,但我不知道如何。 也许还有一些额外的要求,我不知道在Excel VBA中注册一个ActiveX …

我唯一需要的是让我的Excel文件中包含的ActiveX对象与其他机器兼容。 任何人都可以帮助我吗?

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