Microsoft Office支持文章“Add or register an ActiveX control”说:
重要提示:并非所有ActiveX控件都可以直接在工作表中使用;一些只能在Microsoft Visual Basic for Applications(VBA)UserForms上使用。使用这些控件时,如果您尝试将这些控件添加到工作表,Excel将显示消息无法插入对象。
但是,我无法在任何需要必需和 的要求的任何地方找到记录,以便直接在工作表上使用该控件。
我创建了一个新的C ++ / ATL项目,我已经添加了一个ATL控件,接受了整个默认值。在编译,构建和注册控件之后,它出现在Excel的“更多控件”列表中(在Developer> Insert> ActiveX Controls> More Controls ...下访问),但在尝试插入工作表时,可以看到这个“无法插入对象“错误。
我必须做出哪些更改才能解决此问题?
OR
Excel对ActiveX控件的要求记录在哪里?
对于它的价值,我已经验证了向导生成的控件在其他情况下工作正常(使用ActiveX Control Test Container测试Visual C++ 2008 samples pack)。
此外,我知道documentation for the ATL Control wizard's "Appearance" tab描述了“可插入”复选框,如下所示:
选择此选项可使控件显示在Word和Excel等应用程序的“插入对象”对话框中。然后,任何支持嵌入对象的应用程序都可以通过此对话框插入您的控件。
但是,此复选框(只是将“可插入”子项添加到注册表中)仅导致控件出现在“插入”按钮中。文字>对象对话框 - 为避免疑问,我已尝试使用和不使用此选项,并且无论如何都会产生相同的错误。
我正在尝试在尝试插入工作(Forms 2.0)控件时插入我的控件时,比较Excel的执行路径的痕迹。加载类型库(OLE/COM Object Viewer能够从我的DLL中正确加载)时,关键区别似乎在VBE7.dll中 - 但在Excel执行了所有相同的读取后,它在写出EXD之前中止)...我现在正在挖掘一些装配,徒劳地希望我能解决它 - 但肯定是某人已经为Excel构建了一个工作控件并且知道我错过了什么可以免除我这种痛苦吗?!
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 Update 1)
功能
答案 0 :(得分:3)
要实现可插入MS Excel工作表的ATL ActiveX控件,请按照下列步骤操作:
确保您在C:\ Users \ $(UserName)\ AppData \ Local \ Temp \ Excel8.0中没有缓存的ActiveX控件信息* .exd文件,这可能是途中不明显的障碍
创建一个包含所有默认值的
2.1。添加x64配置作为现有Win32的副本 - 对于64位Excel,您将需要64位ActiveX控件
3.1。确保填写ProgID字段
3.2。在Interfaces页面上添加IPersistStreamInit
构建DLL并将其注册(regsvr32)
在Excel中,新控件在菜单Developer,...,More Controls
源代码:Subversion / Trac
更新:以下评论提出的问题:
...... Excel是否支持无窗口激活?
要查看操作中的控件操作,我们添加一些代码around there:
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
,这对于无窗口是必需的。
答案 1 :(得分:1)
我有一些ActiveX和COM技术的经验,但还没有深入到Excel的世界。据我所知,所有COM组件总是闻起来过于复杂,除非你确切知道自己在做什么,但并不总是能找到需要做的事情。
无论如何 - 我已经快速扫描/谷歌搜索了 - 这些是我能找到的链接:
从这里开始:http://itdocument.com/6551512544/
Excel 97&amp; 2000问题Excel 97&amp; 2000年问题 Q171280 Q171280 ,,错误消息“无法插入对象” EXCEL97。
ActiveX控件必须支持要插入的聚合ActiveX控件必须支持要插入的聚合 进入电子表格。如果他们不支持进入电子表格。如果他们不支持存在 聚合后,Excel将不允许插入它们。聚合后,Excel将不允许插入它们。 有关这方面的更多信息,请参见Q143432 Q143432中的更多相关信息 文章的底部。文章的底部。
任何通过尝试查找文章Q143432经常以非现有页面结束 - 但能够找到这篇文章:
https://support.microsoft.com/en-us/kb/143432
此处报告了与其使用相关的一些问题:
http://www.verycomputer.com/418_e81ed24b6ac0cb79_1.htm
我的建议是尽可能避免使用ActiveX技术,如果不可能的话 - 尝试上面的链接 - 或者可能会找到一些类似的开源代码示例。
以下是我设法找到的一些例子:
这是俄语: https://habrahabr.ru/post/149277/
这显然是某种方式谷歌翻译版本的同一页面: http://developers-club.com/posts/149277/
它是源代码 - 我想: https://github.com/Lovesan/MyActiveX
我希望这会对你有所帮助 - 但不确定 - 我自己没有尝试过。