H>Да можно это сделать например как запуск exe c параметром. А по завершению записать в файл и считать например результат из файла средствами vba. H>Но это как-то не серьезно.
Почему? в linux например pid-файлы используются. еще часто через pipeline данные передаются в другую программу.
H>Хотелось бы по человечески взять вызвать dll. Запустить методы передать получить параметры.
Здравствуйте, Hermitap, Вы писали:
H>Если по excel есть доки то по проджекту пока данных мало. Займет время. H>Пока времени мало разобраться. Но очень инетересно. Буду использовать. H>А так спасибо за хорошую наводку. Буду разбираться дальше
Увы, да — на сколько я помню нормальных примеров в документации (такого же уровня как по Word или Excel) я по-моему так и не нашел.
Смотрел на найденные примеры в Internet + на документацию по API.
На сколько мне помнится (дело было почти 10 лет назад) всё хранится как набор таблиц и всё API это обращение к этим таблицам (ну и плюс общеофисное, типа работы с Ribbon и показа окошек). А дальше уже нужно разбираться как именно и что хранится в таблицах.
Причем, вроде даже основная таблица всего одна — это сами элементы работ. В ней просто куча стандартных полей + можно добавлять свои.
Но (!), возможно, это просто я не нашел другого способа, а так (беглым взглядом), вроде основные понятия типа Task, Calendar, Resource есть и в нормальной модели.
Здравствуйте, 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.
Задача. Есть например ms project 2016.
Нужно из vba вызвать dll net форму(net framework 4x) передать ей параметры. Поработать в форме(мини приложение).
получить данные по нажатию ок.
Данные могут передаваться получаться таблицами.
Да можно это сделать например как запуск exe c параметром. А по завершению записать в файл и считать например результат из файла средствами vba.
Но это как-то не серьезно.
Хотелось бы по человечески взять вызвать dll. Запустить методы передать получить параметры.
Куда смотреть где почитать пример хоть какой то?
Спасибо.
p.s. Использовать редактор форм самого vba не катит.
Это довольно сложное приложение с гридами с деревьями и много чего другого что
написание на vba приведет к очень длительному кодингу.
Да и хотелось бы vba использовать по минимуму. Все написано уже на C#
Здравствуйте, 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 есть доки то по проджекту пока данных мало. Займет время.
Пока времени мало разобраться. Но очень инетересно. Буду использовать.
А так спасибо за хорошую наводку. Буду разбираться дальше
Здравствуйте, Михаил Романов, Вы писали:
МР>На сколько мне помнится (дело было почти 10 лет назад) всё хранится как набор таблиц и всё API это обращение к этим таблицам (ну и плюс общеофисное, типа работы с Ribbon и показа окошек). А дальше уже нужно разбираться как именно и что хранится в таблицах. МР>Причем, вроде даже основная таблица всего одна — это сами элементы работ. В ней просто куча стандартных полей + можно добавлять свои. МР>Но (!), возможно, это просто я не нашел другого способа, а так (беглым взглядом), вроде основные понятия типа Task, Calendar, Resource есть и в нормальной модели.
А не помните, столкнулся с таким маленьким неудобством. Через vba я могу сохранить проект в XML а через C# не могу. Нет формата XML в константе параметра метода Saveas.
Смириться или есть другой способ?
H>А не помните, столкнулся с таким маленьким неудобством. Через vba я могу сохранить проект в XML а через C# не могу. Нет формата XML в константе параметра метода Saveas.
Увы, такое я не делал.
У меня была задача сделать, по-сути, кастомный отчет на базе готового проекта (если не ошибаюсь — я из MS Project выгружал списки задач по ребятам из команды — что-то в этом роде).
H>Смириться или есть другой способ?
Я посмотрел описание метода SaveAs и даже для VBA, в списке форматов PjFileFormat XML нет.
В самом описании говорят, что, можно указывать не параметр Format, а FormatID, правда пишут, что
Several FormatID strings are obsolete; if you try to use them, they result in run-time error 1004.
Но как раз среди этих FormatID, есть формат "MSProject.xml" — Project XML file
Поэтому, я бы попробовал так:
— для начала разобраться, как указывается формат выгрузки в VBA. Если через параметр Format, то тупо попробовать в C# передать такое же значение константы
— если не проканает — попробовать Format не указывать, а указать в FormatId == "MSProject.xml"
А вообще может и не стоит завязываться на их XML. Я подозреваю он представляет собой дамп каких-то внутренних структур — работать с таки будет себе дороже (ну разве что вам это нужно чтобы скормить кому-то, кто этот формат понимает).
Здравствуйте, Михаил Романов, Вы писали: МР>Я посмотрел описание метода SaveAs и даже для VBA, в списке форматов PjFileFormat XML нет.
МР>В самом описании говорят, что, можно указывать не параметр Format, а FormatID, правда пишут, что МР>
Several FormatID strings are obsolete; if you try to use them, they result in run-time error 1004.
МР>Но как раз среди этих FormatID, есть формат "MSProject.xml" — Project XML file
Мне зачем надо было. XML текстовый формат. А мне надо проект бы отдельно сохранить в базе данных построчно. (Не в project server)
И загнать текстовый файл в таблицу проще чем родной формат проджекта. XML удобен. Но если что будет не так я обычный файл проекта конвертировал бы в base64 и загнал бы его в таблицу Ну это так пока что тестирование возможностей. На возможные будущие интеграции.
Здравствуйте, Hermitap, Вы писали:
H>Мне зачем надо было. XML текстовый формат. А мне надо проект бы отдельно сохранить в базе данных построчно. (Не в project server) H>И загнать текстовый файл в таблицу проще чем родной формат проджекта. XML удобен. Но если что будет не так я обычный файл проекта конвертировал бы в base64 и загнал бы его в таблицу Ну это так пока что тестирование возможностей. На возможные будущие интеграции.
Честно говоря, в такой постановке выглядит немного странно. Сохранять файл в БД — я бы понял, если бы это была бы база какой-нибудь системы ECM/СЭД, но здесь, я так понимаю, что-то более специфическое...
Но ладно, я всё равно не готов погружаться в вашу задачу — вы в любом случае владеете контекстом на порядок лучше меня.
Единственный момент, который сразу же всплывает — а почему всё же не хранить бинарный файл целиком, используя предназначенные для этого binary типы полей?
Есть какие-то ограничения со стороны СУБД?
Ну и даже если с binary почему-то не катит, то вариант сконвертировать в base64 и сохранить файл так выглядит предпочтительнее, имхо, т.к. я почти на 100% уверен при сохранении в другие форматы через SaveAs наверняка что-то будет теряться.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Hermitap, Вы писали:
МР>Единственный момент, который сразу же всплывает — а почему всё же не хранить бинарный файл целиком, используя предназначенные для этого binary типы полей? МР>Есть какие-то ограничения со стороны СУБД?
почти. Это SAP и немного старенький. Последний апдейт был 15 лет назад. Там все сложно в общем.
Здравствуйте, Hermitap, Вы писали:
H>почти. Это SAP и немного старенький. Последний апдейт был 15 лет назад. Там все сложно в общем.
Ясно.
Да, тогда, похоже, только крутиться...
Но я всё же за то, чтобы не делать лишних конвертаций файла. Почти наверняка и размер увеличится и что-то да потеряется.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Hermitap, Вы писали:
H>>почти. Это SAP и немного старенький. Последний апдейт был 15 лет назад. Там все сложно в общем. МР>Ясно. МР>Да, тогда, похоже, только крутиться... МР>Но я всё же за то, чтобы не делать лишних конвертаций файла. Почти наверняка и размер увеличится и что-то да потеряется.