我正在研究C#
和VB.NET
端口的舊VBA
程序。它有很多MSForms/OleObjects
嵌入它像CommandButton
甚至圖像。如何處理來自嵌入式Excel.OleObjects或Excel.Shapes的事件
我首先想到的是所有的按鈕聲明爲Microsoft.Vbe.Interop.Forms.CommandButton
但導致COM
異常的System._COM type
不能轉換爲...Forms.CommandButton
。如果我嘗試的this solution更寬泛的版本,我沒有找到任何物品,如果我嘗試去通過所有VBComponet
的I注意,他們是在workbook
所有的牀單,但沒有控件:
foreach (VBComponent xxx in Globals.ThisWorkbook.VBProject.VBComponents) {
Interaction.MsgBox(xxx.Name);
Interaction.MsgBox(xxx.ToString);
}
因此,所有這些控件不是.VBComponets
,但我可以找到爲他們OLEobjects在thisworkbook.worksheets(n).OLEobjects
(這是counterintutive給我,但我可能不瞭解系統開始)。
如何處理來自此類對象的Click操作?
我假設我需要使用Excel.OLEObjectEvents_Event
接口,但我似乎無法弄清楚如何。如果我嘗試使用delegates
進行自定義事件,我似乎無法將它們分配到OleObjects
。如果我使用ActionClickEventHandler.CreateDelegate
,我可以得到各種各樣的錯誤,這使我認爲這是一個死路一條。
來自MS的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函數或子。我在玩Excel.Shape.OnAction
,但這需要調用VBA子。據推測,只要VSTO可以看到COM,我就可以調用一個VBA從VSTO調用子接口。這似乎真的很圓滿,我只想做它作爲最後的手段。
是否建立他們是否是在工作表上的ActiveX控件?常規窗體控件(非activeX)不會顯示事件,只能通過onAction方法調用subs。您可能遇到哪些問題? – SWa
幫助我的無知。我發現VBA嵌入Office軟件程序(或其他採用它的程序)中。 VBA不是獨立的。那麼,「舊的VBA程序」是什麼? – Smandoli
只是旁觀,但根據我的旅行社,所有的好的「最後的度假勝地」都是「真正圓滿的」。這幾乎是一個規則。 – Smandoli