在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控件,请按照下列步骤操作:
-
确保在C:\ Users \ $(UserName)\ AppData \ Local \ Temp \ Excel8.0中没有caching的ActiveX控件信息* .exd文件,这可能是一个不明显的障碍
-
使用所有默认值创build一个ATL DLL项目
2.1。 添加x64configuration作为已经存在的Win32的副本 – 对于64位Excel,您将需要64位ActiveX控件
- 使用向导添加ATL控件类
3.1。 确保填写ProgID字段
3.2。 在Interfaces页面上添加IPersistStreamInit
-
生成DLL并注册(regsvr32)
-
在Excel中,新的控件在菜单Developer,…,More Controls中可见
- 插入它,并从那里玩得开心
源代码: 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
我希望这会帮助你,但是 – 不知道 – 没有自己尝试过。