我正在研究一个旧的VBA
程序的C#
和现在的VB.NET
端口。它有很多像CommandButton
甚至图片这样的MSForms/OleObjects
嵌入其中。
我的第一个想法是将所有按钮声明为Microsoft.Vbe.Interop.Forms.CommandButton
,但这导致了一个COM
异常,即System._COM type
不能转换为...Forms.CommandButton
。如果我尝试更通用的this solution版本,我没有找到任何项,如果我尝试遍历所有的VBComponet
,我注意到它们都是workbook
中的工作表,但没有任何控件:
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似乎没有什么帮助,尽管它确实向我介绍了我正在研究的Verb
的idea。到目前为止,这只产生了类似于“应用程序无法启动”的COM错误。
即使只是尝试使用两个标准事件.GotFocus
中的一个,我也总是拉出0x80040200错误。示例:
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:
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的子。这似乎真的很拐弯抹角,我只想在万不得已的情况下才这么做。
https://stackoverflow.com/questions/22368680
复制相似问题