Задача. Есть например ms project 2016.
Нужно из vba вызвать dll net форму(net framework 4x) передать ей параметры. Поработать в форме(мини приложение).
получить данные по нажатию ок.
Данные могут передаваться получаться таблицами.
Да можно это сделать например как запуск exe c параметром. А по завершению записать в файл и считать например результат из файла средствами vba.
Но это как-то не серьезно.
Хотелось бы по человечески взять вызвать dll. Запустить методы передать получить параметры.
Куда смотреть где почитать пример хоть какой то?
Спасибо.
p.s. Использовать редактор форм самого vba не катит.
Это довольно сложное приложение с гридами с деревьями и много чего другого что
написание на vba приведет к очень длительному кодингу.
Да и хотелось бы vba использовать по минимуму. Все написано уже на C#
H>Да можно это сделать например как запуск exe c параметром. А по завершению записать в файл и считать например результат из файла средствами vba. H>Но это как-то не серьезно.
Почему? в linux например pid-файлы используются. еще часто через pipeline данные передаются в другую программу.
H>Хотелось бы по человечески взять вызвать dll. Запустить методы передать получить параметры.
Здравствуйте, Hermitap, Вы писали:
H>Куда смотреть где почитать пример хоть какой то?
Один из вариантов вам предложили чуть выше — сделать на базе вашего кода обычный COM-компонент, с поддержкой IDispatch (в .Net это не так и сложно) и использовать его.
Другой вариант, более специфичный для Office — это сделать не "просто COM", а VSTO-плагин.
На сколько я помню, программная модель (ну за исключением специфических API) у всех офисных приложений более-менее одинаково.
Поэтому, в качестве отправной точки можно посмотреть:
— вот эту статью Call code in VSTO Add-ins from other Office solutions
— и соответствующий ей пример
Т.е. идя в том, что вы:
— делаете на базе своего C# кода VSTO-плагин для офиса,
— в плагине экспортируете интерфейс + реализацию, через которые VBA будет вызывать ваш код и получать результат
— затем этот плагин вручную (или иным способом, за подробностями можно обратиться к Deploy an Office solution) ставится на машины пользователей
— всё, можно обращаться из VBA к C#/VB.Net коду
Почему мне кажется, этот вариант лучше чем "просто COM"
— готовые ("из коробки") решения для дерлоя
— вам доступен API самого Office. Тут только проверьте, на сколько реально объекты Office можно передавать при вызове VBA->VSTO, не уверен, что тут всё идеально. Но, например, вполне должно сработать что-то типа: вы вызываете из VBA некий код своего плагина, а он уже сам лезет в таблицы Project, достает что надо, показывает и даже меняет данные
— если вам всё же придется поддерживать это решение далее, вы сможете потихоньку перетаскивать код из VBA в VSTO. Конечно, MS намекает что обе технологии Obsolete, но их скриптовый API всё еще в подметки не годится тому, что можно сделать в VBA/VSTO (ну разве что он кроссплатформенный вплоть до браузера), а для MS Project его и вообще по-моему нет...
К сожалению, по разработке плагинов для MS Project информации очень мало.
Есть вот буквально такой раздел и в нем ссылка на API.
Но могу сказать, что если вы разобрались с этой моделью в VBA, проблем далее быть особо не должно. По крайней мере по своему опыту могу сказать, что с абсолютного 0 небольшой плагин для выгрузки нужных отчетов из MS Project я написал за пару дней и больше всего ушло времени именно на осмысление того, как устроено хранение в таблицах Project.
Здравствуйте, vaa, Вы писали:
vaa>повесить на сборку аттрибут ComVisible
Не все типы при этом будут ком совместимы. Проще всего использовать IReflect и через него делать обертки. https://infostart.ru/public/238584/
и солнце б утром не вставало, когда бы не было меня
Dim ctest2 As ClassLibrary2.Class1
Dim x As Integer
Set x = ctest2.Sum(1, 2)
и получаю ошибку Object rfequired
на строчке x =
Подключено правильно. Метод sum подсвечивается в подсказке значит все подключил правильно.
Почему не работает?
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Hermitap, Вы писали:
H>>и получаю ошибку Object rfequired МР>Логично, вы объявили переменную, но не создали экземпляр объекта.
МР>Попробуйте заменить первую строку на: МР>
МР> Dim ctest2 As New ClassLibrary2.Class1
МР>
Спасибо. Все заработало.
Тупая ошибка. Я никогда с vba до этого не сталкивался
[ComVisible(true)]
[ProgId("NetObjectToIDispatch45")]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[Guid("DFDADA57-B22C-4276-928A-8B91C9891FF1")]
public class NetObjectToIDispatch45
Из 1С вызов такой
врап=новый COMОбъект("NetObjectToIDispatch45");
и солнце б утром не вставало, когда бы не было меня
Спасибо.
Я совершенно не связан с 1c. Мне нужно вызвать C# либу из VBA (MS Project)
С# либа подключается к SAP через SAP NET Connector и работает с данными SAP и обменивается данными sap=>project>sap.
Я знаю что vba можно подключить к SAP. Но мне не хотелось много форм рисовать на vba если есть все готовое уже на C#.
Почему мне прислали почти все ссылки на 1C я не понял. Вроде не говорил что я 1сник.
Все что нужно у меня получилось. (Благодаря ответам) Прикрутил форму к MS PROJECT и сделал нужную передачу данных.
Хотя пока не все понимаю как работает. Что такое ProgId зачем нужен и зачем вообще интерфейс делать.
вот из этого примера https://aakinshin.net/ru/posts/wrap-cs-in-com/
Зачем сделан был ICalculator? (риторический вопрос) С COM не работал.
Я знаю что такое интерфейсы. Но не понимаю зачем он нужен именно в данном случае. Вероятно требование com библиотеки
H> Dim ctest2 As ClassLibrary2.Class1
H> Dim x As Integer
H> Set x = ctest2.Sum(1, 2)
H>
H> и получаю ошибку Object rfequired H> на строчке x = H> Подключено правильно. Метод sum подсвечивается в подсказке значит все подключил правильно. H> Почему не работает?
H>если без set то ошибка 91 variable not set
Возможно в VBA 1 это не int а double. Проверь в отладчике
public int Sum(object a, object b)
{
return (int)a + (int)b;
}
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Hermitap, Вы писали: H>Хотя пока не все понимаю как работает. Что такое ProgId зачем нужен и зачем вообще интерфейс делать.
ProgId нужен для позднего связывания. То есть ты тип знаешь заранее. Если не надо, то IDispath прекрасно подходит.
То есть ты можешь просто вызвать CreateObject(ProgId)
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Hermitap, Вы писали:
H>Спасибо. Все заработало. H>Тупая ошибка. Я никогда с vba до этого не сталкивался
Всегда пожалуйста.
Но я бы всё же порекомендовал подумать о полноценном VSTO-плагине. Да, там чуть больше работы и несколько больше нюансов, но, имхо — игра стоит свеч (при условии, конечно, что код в .Net имеет какую-то офисную специфику. Иначе да, смысла её туда тащить не много, и можно обойтись обычным COM)
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Hermitap, Вы писали:
H>>Спасибо. Все заработало. H>>Тупая ошибка. Я никогда с vba до этого не сталкивался МР>Всегда пожалуйста. МР>Но я бы всё же порекомендовал подумать о полноценном VSTO-плагине. Да, там чуть больше работы и несколько больше нюансов, но, имхо — игра стоит свеч (при условии, конечно, что код в .Net имеет какую-то офисную специфику. Иначе да, смысла её туда тащить не много, и можно обойтись обычным COM)
Да спасибо. Я уже посмотрел что это и как это. Взял на заметку. Пока я прикрутил все что мне нужно.
Будут новые задачи. Обращу внимание. Выглядит интересно.
По крайней мере на неделе другой посмотрю в свободное время. Попытаюсь что-то сделать и посмотреть как работает.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Hermitap, Вы писали:
H>>Спасибо. Все заработало. H>>Тупая ошибка. Я никогда с vba до этого не сталкивался МР>Всегда пожалуйста. МР>Но я бы всё же порекомендовал подумать о полноценном VSTO-плагине. Да, там чуть больше работы и несколько больше нюансов, но, имхо — игра стоит свеч (при условии, конечно, что код в .Net имеет какую-то офисную специфику. Иначе да, смысла её туда тащить не много, и можно обойтись обычным COM)
Попробовал покрутить VSTO. Весч!!!
Почти все с ходу заработало.
Осталось разобраться с управлением прожектом с его api и научиться управлять примерно так же как из vba.
Если по excel есть доки то по проджекту пока данных мало. Займет время.
Пока времени мало разобраться. Но очень инетересно. Буду использовать.
А так спасибо за хорошую наводку. Буду разбираться дальше
Здравствуйте, Hermitap, Вы писали:
H>Если по excel есть доки то по проджекту пока данных мало. Займет время. H>Пока времени мало разобраться. Но очень инетересно. Буду использовать. H>А так спасибо за хорошую наводку. Буду разбираться дальше
Увы, да — на сколько я помню нормальных примеров в документации (такого же уровня как по Word или Excel) я по-моему так и не нашел.
Смотрел на найденные примеры в Internet + на документацию по API.
На сколько мне помнится (дело было почти 10 лет назад) всё хранится как набор таблиц и всё API это обращение к этим таблицам (ну и плюс общеофисное, типа работы с Ribbon и показа окошек). А дальше уже нужно разбираться как именно и что хранится в таблицах.
Причем, вроде даже основная таблица всего одна — это сами элементы работ. В ней просто куча стандартных полей + можно добавлять свои.
Но (!), возможно, это просто я не нашел другого способа, а так (беглым взглядом), вроде основные понятия типа Task, Calendar, Resource есть и в нормальной модели.
Здравствуйте, Михаил Романов, Вы писали:
МР>На сколько мне помнится (дело было почти 10 лет назад) всё хранится как набор таблиц и всё API это обращение к этим таблицам (ну и плюс общеофисное, типа работы с Ribbon и показа окошек). А дальше уже нужно разбираться как именно и что хранится в таблицах. МР>Причем, вроде даже основная таблица всего одна — это сами элементы работ. В ней просто куча стандартных полей + можно добавлять свои. МР>Но (!), возможно, это просто я не нашел другого способа, а так (беглым взглядом), вроде основные понятия типа Task, Calendar, Resource есть и в нормальной модели.
А не помните, столкнулся с таким маленьким неудобством. Через vba я могу сохранить проект в XML а через C# не могу. Нет формата XML в константе параметра метода Saveas.
Смириться или есть другой способ?