在Excel工作表上直接使用ActiveX控件需要哪些要求?

Microsoft Office支持文章“ 添加或注册ActiveX控件 ”说:

重要提示:并非所有的ActiveX控件都可以直接在工作表上使用; 有些只能用于Microsoft Visual Basic for Applications(VBA)用户窗体。 当您使用这些控件时,如果您尝试将它们添加到工作表,Excel将显示消息无法插入对象

但是,我无法在任何地方find必要的足以使控件直接在工作表上使用的要求。

我创build了一个新的C ++ / ATL项目,我添加了一个ATL控件,接受整个默认值。 编译,构build和注册控件后,它出现在Excel的“更多控件”列表中(在开发人员>插入> ActiveX控件>更多控件…下访问),但试图插入到工作表中时,可以看到“不能插入对象“错误。

我必须做出什么修改才能解决这个问题?

要么

Excel对ActiveX控件的要求在哪里有logging?


对于它的价值,我已经validation了由向导生成的控件可以正常工作(使用从Visual C ++ 2008示例包构build的ActiveX控件testing容器进行testing )。

此外,我知道ATL控件向导的“外观”选项卡的文档描述了“可插入”checkbox,如下所示:

select此选项可让您的控件显示在Word和Excel等应用程序的“插入对象”对话框中。 您的控件可以通过任何支持embedded对象的应用程序通过此对话框插入。

但是,这个checkbox(只是简单地将“Insertable”子项添加到registry中)只会导致控件出现在Insert> Text> Object对话框中,为了避免疑惑,同样的错误产生的方式。

我试图插入一个工作(Forms 2.0)控件时试图插入我的控制对比当前正在比较Excel的执行path的痕迹。 关键区别似乎在于VBE7.dll加载types库(其中OLE / COM对象查看器能够从我的DLL正确加载 – 但Excel执行完所有相同的读取之后,它会在写出EXD之前中止)…我现在正在通过一些程序集挖空心思,希望我能弄明白 – 但是肯定有人为Excel创build了一个工作控件,并且知道我错过了什么可以使我免于这种痛苦?!


Microsoft Windows 10 Pro v1511(10.0.10586.164)64位
Microsoft Excel 2016 MSO(16.0.4312.1000)64位
Microsoft Visual Studio社区2015(14.0.24720.00更新1)

要实现可插入MS Excel工作表的ATL ActiveX控件,请按照下列步骤操作:

  1. 确保在C:\ Users \ $(UserName)\ AppData \ Local \ Temp \ Excel8.0中没有caching的ActiveX控件信息* .exd文件,这可能是一个不明显的障碍

  2. 使用所有默认值创build一个ATL DLL项目

2.1。 添加x64configuration作为已经存在的Win32的副本 – 对于64位Excel,您将需要64位ActiveX控件

  1. 使用向导添加ATL控件类

在这里输入图像说明

3.1。 确保填写ProgID字段

在这里输入图像说明

3.2。 在Interfaces页面上添加IPersistStreamInit

在这里输入图像说明

  1. 生成DLL并注册(regsvr32)

  2. 在Excel中,新的控件在菜单Developer,…,More Controls中可见

在这里输入图像说明

在这里输入图像说明

  1. 插入它,并从那里玩得开心

在这里输入图像说明

源代码: Subversion / Trac

更新 :从下面的评论问题:

… Excel是否支持无窗口激活?

为了看到操作中的控制操作,我们在这里添加一些代码:

CSample() { CTrace::SetLevel(4); 

 HRESULT OnDraw(ATL_DRAWINFO& di) { const CComQIPtr<IOleInPlaceSiteWindowless> pOleInPlaceSiteWindowless = m_spClientSite; ATLTRACE(_T("m_spClientSite 0x%p, pOleInPlaceSiteWindowless 0x%p, m_hWnd 0x%08X\n"), m_spClientSite, pOleInPlaceSiteWindowless, m_hWnd); 

这将打印出帮助识别窗口/无窗口模式的控件成员。 输出是(最终在激活对象之后或者从一开始就是):

 ... Sample.h(118) : atlTraceGeneral - m_spClientSite 0x0000027A9CA7B460, pOleInPlaceSiteWindowless 0x0000000000000000, m_hWnd 0x0105069C ... Sample.h(118) : atlTraceGeneral - m_spClientSite 0x0000027A9CA7B460, pOleInPlaceSiteWindowless 0x0000000000000000, m_hWnd 0x0105069C 

该控件可以激活窗口和无窗口(除非m_bWindowOnly设置为true,在这种情况下窗口模式被强制)。 跟踪显示控件处于窗口模式,并且该容器没有IOleInPlaceSiteWindowless ,这对于无窗口是必需的。

我有一些ActiveX和COM技术的经验,但没有深入Excel的世界深入挖掘。 为了最好地理解所有的COM组件,除非你确切地知道你在做什么,否则总是会有过于复杂的气味,但是并不总能find需要做的事情。

无论如何 – 我已经快速扫描/search – 这些是我能find的链接:

从这里: http : //itdocument.com/6551512544/

Excel 97&2000问题Excel 97&2000问题Q171280 Q171280,错误消息Excel 97中的“无法插入对象”。

ActiveX控件必须支持要插入的聚合ActiveX控件必须支持将聚合插入到电子表格中。 如果他们不支持进入电子表格。 如果他们不支持汇总,Excel将不允许插入它们。 汇总后,Excel将不允许插入它们。 关于这方面的更多信息,请参阅文章底部的Q143432 Q143432。 文章的底部。

任何通过尝试查询文章Q143432往往结束了不存在的页面 – 但能够find这篇文章:

https://support.microsoft.com/en-us/kb/143432

并在这里报告与它的使用有关的一些问题:

http://www.verycomputer.com/418_e81ed24b6ac0cb79_1.htm

然而,我的build议是尽可能地避免使用ActiveX技术,如果不可能的话 – 试试上面的链接 – 或者可能会find一些类似的开源代码示例。

以下是我设法find的一些例子:

这是俄语: https : //habrahabr.ru/post/149277/

这显然不知何故谷歌翻译版本相同的页面: http : //developers-club.com/posts/149277/

它的源代码 – 我认为: https : //github.com/Lovesan/MyActiveX

我希望这会帮助你,但是 – 不知道 – 没有自己尝试过。