Я работаю над портами C#
и теперь VB.NET
старой программы VBA
. В него встроено множество MSForms/OleObjects
, таких как CommandButton
или даже изображения.
Моей первой мыслью было объявить все кнопки как Microsoft.Vbe.Interop.Forms.CommandButton
, но это привело к исключению COM
, что System._COM type
нельзя привести к ...Forms.CommandButton
. Если я попробую более общую версию этого решения, я не найду никаких элементов, и если я попытаюсь пройти все VBComponet
, я отмечу, что все они являются листами в workbook
, но ни один из элементов управления:
foreach (VBComponent xxx in Globals.ThisWorkbook.VBProject.VBComponents) {
Interaction.MsgBox(xxx.Name);
Interaction.MsgBox(xxx.ToString);
}
Таким образом, все эти элементы управления отсутствуют в .VBComponets
, но я могу найти их как OLEobjects в thisworkbook.worksheets(n).OLEobjects
(для меня это противоречит здравому смыслу, но я, вероятно, не понимаю систему для начала с).
Как мне обработать действие Click от такого объекта?
Я предполагаю, что мне нужно использовать интерфейс Excel.OLEObjectEvents_Event
, но я не могу понять, как это сделать. Если я пытаюсь сделать пользовательские события с delegates
, я не могу назначить их на OleObjects
. Если я использую ActionClickEventHandler.CreateDelegate
, я могу получить огромное количество ошибок, которые заставляют меня думать, что это тупик.
официальная документация от MS не кажется такой полезной, хотя она и познакомила меня с идеей из Verb
, которую я изучаю. До сих пор это вызывало только ошибки COM по типу "Приложение не удалось запустить".
Даже просто пытаясь использовать одно из двух стандартных событий, .GotFocus
, я всегда получаю ошибку 0x80040200.
Пример:
Excel.OLEObject ButtonCatcher = Globals.ThisWorkbook.Worksheets(1).OLEObjects("CommandButton1");
ButtonCatcher.GotFocus += CommandButton1_Click;
Создает исключение COMException Exception from HRESULT: 0x80040200
во второй строке. Кнопка включена, что я и проверил после просмотра кода с сайта разработчика Office.
Попытка более универсального подхода в коде для листа, содержащего элементы управления:
object CommandButtonStart = this.GetType().InvokeMember("CommandButton1", System.Reflection.BindingFlags.GetProperty, null, this, null);
Выдает ошибку недостающего метода.
Любая помощь очень ценится, кажется, это должно быть очевидно, и я скучаю по ней.
** Редактировать: я также обнаружил, что я могу привести эти элементы управления в Excel.Shape
, но это на самом деле не приближает меня к запуску функции или подпрограммы из VSTO. Я играю с Excel.Shape.OnAction
, но для этого требуется саб VBA. Предположительно, я мог бы вызвать сабвуфер VBA, который вызывает сабвуфер из VSTO, если VSTO был видимым COM. Это кажется очень сложным, и я бы хотел сделать это только в крайнем случае.