我们在公司的几台机器上使用一组Excel文件。这些文件包含一个VBA应用程序,该应用程序使用mscomct2.ocx
库中的几个ActiveX控件对象(即MonthView
和DateTimePicker
)。 ActiveX对象将显示在UserForm中。不幸的是,这些文件的可移植性似乎以一种非常特殊的方式受到限制。
似乎有两组机器:
MonthView
的Excel文件,并在任何A组PC上使用它。但是当我尝试在B组的任何机器上打开此文件时,我得到一个无法加载对象,因为它在此计算机上不可用错误。但是,在B组计算机上创建的具有相同ActiveX的文件在A计算机上正常工作。用一句话来说:在一台机器上创建的文件只能在其他A上工作,在B的工作中创建的文件无处不在!
这里最奇怪的是每台机器都有mscomct2.ocx
注册(再次:我可以在任何有问题的机器上使用MonthView
创建表单!)。 .ocx
本身就存在于每台机器上,并且存在整套注册表键(控件类,IID,类型库ID ...的CLSID)。此外,这些注册表项中的数据在A和B组计算机(GUID,ProgID,版本等)上似乎相同。某些机器上的描述字符串(如“Microsoft MonthView Control 6.0(SP6)”之类的值)略有不同,但这似乎不会影响这种情况(B组中的某些机器有不同的描述,但在它们上面创建的文件仍然可以在任何地方工作)。
当然,多亏了Murphy定律,我用来编辑这些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
...并遇到了更多麻烦。我做的是:
regsvr32 /u mscomct2.ocx
- 已成功完成mscomct2.ocx
替换为6.0.x.x版本的文件regsvr32 mscomct2.ocx
- 已成功完成完成这些步骤后,我尝试使用包含MonthView
的单一表单制作Excel文件。但是当我尝试在表单中放置一个控件时,我有一个错误 Class not registered 的消息框。这真的很奇怪,因为一切似乎都已注册:控件类,它的接口,类型库(是的,我已经检查了注册表以确定)。但仍然存在错误。
之后我再次执行取消注册/替换/注册过程以返回到我原来的6.1.x.x文件。这让我回到原来的SNAFU情况:我可以再次将ActiveX安装到用户表单并使用它,但是B组机器仍然对我的机器保存的文件给出了错误。
我认为带有ActiveX可移植性的文件和ocx
注册问题的问题以某种方式连接,但我不知道如何。也许在Excel VBA中注册ActiveX有一些额外的要求,我不知道......
我唯一需要的是让我的Excel文件中包含的ActiveX对象与其他机器兼容。任何人都可以帮我吗?
答案 0 :(得分:1)
我认为安装了一个组(可能是“A”):http://www.microsoft.com/download/en/details.aspx?id=10019,另一组没有。{/ p>