首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何处理来自嵌入式Excel.OleObjects或Excel.Shapes的事件

如何处理来自嵌入式Excel.OleObjects或Excel.Shapes的事件
EN

Stack Overflow用户
提问于 2014-03-13 11:49:15
回答 5查看 3.1K关注 0票数 18

我正在研究一个旧的VBA程序的C#和现在的VB.NET端口。它有很多像CommandButton甚至图片这样的MSForms/OleObjects嵌入其中。

我的第一个想法是将所有按钮声明为Microsoft.Vbe.Interop.Forms.CommandButton,但这导致了一个COM异常,即System._COM type不能转换为...Forms.CommandButton。如果我尝试更通用的this solution版本,我没有找到任何项,如果我尝试遍历所有的VBComponet,我注意到它们都是workbook中的工作表,但没有任何控件:

代码语言:javascript
复制
foreach (VBComponent xxx in Globals.ThisWorkbook.VBProject.VBComponents) {
    Interaction.MsgBox(xxx.Name);
    Interaction.MsgBox(xxx.ToString);
}

因此,并不是所有这些控件都在.VBComponets中,但我可以在thisworkbook.worksheets(n).OLEobjects中找到它们作为OLEobjects (这与我的直觉相反,但我可能一开始就不理解系统)。

如何处理此类对象的操作?

我假设我需要使用Excel.OLEObjectEvents_Event接口,但我似乎不知道如何使用。如果我尝试使用delegates创建自定义事件,似乎无法将它们分配给OleObjects。如果我使用ActionClickEventHandler.CreateDelegate,我会得到各种各样的错误,这让我觉得那是个死胡同。

微软的official documentation似乎没有什么帮助,尽管它确实向我介绍了我正在研究的Verbidea。到目前为止,这只产生了类似于“应用程序无法启动”的COM错误。

即使只是尝试使用两个标准事件.GotFocus中的一个,我也总是拉出0x80040200错误。示例:

代码语言:javascript
复制
Excel.OLEObject ButtonCatcher = Globals.ThisWorkbook.Worksheets(1).OLEObjects("CommandButton1");
ButtonCatcher.GotFocus += CommandButton1_Click;

在第二行抛出COMException Exception from HRESULT: 0x80040200。该按钮处于启用状态,这是我在查找code number from the office dev site.后选中的

在包含控件的工作表的代码中尝试更多的generic approach

代码语言:javascript
复制
object CommandButtonStart = this.GetType().InvokeMember("CommandButton1", System.Reflection.BindingFlags.GetProperty, null, this, null);

抛出一个缺少方法的错误。

任何帮助都是非常感谢的,这似乎是显而易见的,我错过了它。

**编辑:我还发现我可以将这些控件转换为Excel.Shape,但这实际上并不能让我更接近于从VSTO运行函数或sub。我正在使用Excel.Shape.OnAction,但这需要调用一个VBA子。假设,只要VSTO是COM可见的,我就可以调用VBA子,而VBA子调用来自VSTO的子。这似乎真的很拐弯抹角,我只想在万不得已的情况下才这么做。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22368680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档