Могут ли надстройки общаться? Подключение надстроек / зависимости надстроек

Могут ли надстройки обмениваться данными?

У меня есть надстройка Excel, которая взаимодействует с API. В этой надстройке он может принимать упакованные XML-данные в виде строки и маршрут API в виде URL / I в виде строки, а затем отправлять его данные POST:

Function PostApiXmlToXml(XML as String, URL as String) as String
   'Post to Url that XML data
   'PostApiXmlToXml = the XML response
End Function

Проблема в том, что нужно много разных маршрутов и функций. И не все пользователи должны / имеют право использовать все маршруты.

Я либо просто даю всем доступ ко всем функциям, но если они попытаются отправить кому-то, у кого нет доступа к нему, ответят неавторизованным.

Или есть способ добавить надстройку для каждой функции, которая подключается к основной надстройке связи?

например эта отдельная надстройка имеет функцию, зависящую от первой:

Function CalculateSomething(x as double, y as double, z as double) as double
    Xml = "<x>" + x + "</x>" &_
           "<y>" + y + "</y>" &_
           ""  ""       "" "" 
    route = "www.api.com/api/controller/func"
    CalculateSomething = PostApiXmlToXml(xml,route)
End Function

Основная проблема заключается в том, что пользователи могут выбирать новые функции, когда захотят, поэтому я хочу максимально упростить для пользователя загрузку еще одной надстройки, которая предоставит им доступ. В будущем будет добавлено еще много функций.

Возможно ли это, или я все делаю неправильно?

Люди порекомендовали бы пойти по маршруту VSTO? (Никакого опыта в этом нет)


person Christopher Dermody-Lawrence    schedule 21.10.2015    source источник
comment
VBA не использует оператор return. Это VBA или что-то другое, например VB.NET?   -  person David Zemens    schedule 21.10.2015
comment
если они попытаются отправить на адрес, к которому у них нет доступа, ответят неавторизованным - будет ли API возвращать ошибку в этом случае (т. е. результат ошибки из XML-ответа?) или вы пытаетесь контролировать это исключительно с помощью надстройки?   -  person David Zemens    schedule 21.10.2015
comment
Короткий ответ: да, надстройки могут взаимодействовать друг с другом (т. Е. Функция в Add_In_1 может вызывать функцию в Add_In_2, а с помощью библиотеки Extensibility вы, вероятно, даже можете делать довольно сложные вещи. , но на самом деле это выглядит как проблема для решения с управляемым кодом, особенно если вы ожидаете, что в будущем потребуется добавить еще много функций, маршрутов и т. д.)   -  person David Zemens    schedule 21.10.2015
comment
@DavidZemens Да, XML будет содержать сообщение об ошибке, и у меня есть настраиваемая функция, которая разбивает XML. Если XML содержит ошибку, он вернет ее в виде строки, если нет, он вернет ответ. Нет ли способа добавить ссылку на конкретную надстройку вверху, например «using» или «импорт», аналогично тому, как это делается в .net? или я мечтатель   -  person Christopher Dermody-Lawrence    schedule 21.10.2015


Ответы (1)


есть ли способ добавить надстройку для каждой функции, которая подключается к основной надстройке связи?

Предположим, что CalculateSomething находится в одной надстройке, а другая ваша функция PostApiXmlToXml находится в Module1 отдельной надстройки (назовем ее просто «MainAddIn.xlam», которая уже установлена ​​на машине пользователя)

Function CalculateSomething(x as double, y as double, z as double) as double
    Xml = "<x>" + x + "</x>" &_
           "<y>" + y + "</y>" &_
           ""  ""       "" "" 
    route = "www.api.com/api/controller/func"
    CalculateSomething = _
        Application.Run("MainAddIn!Module1.PostApiXmlToXml", xml, route)
End Function

Примечание: вам необходимо указать VBProject и Module по имени в Run инструкции.

Чтобы проверить, установлен ли надстройка, вы можете использовать такую ​​функцию:

Function IsAddInInstalled(name$) As boolean
Dim a
Dim ret as Boolean
For each a in Application.AddIns
    if (a.Name = name) then
        ret = True
        Exit For
    End If
Next

If not ret Then MsgBox "Please install " & name
IsAddInInstalled = ret
End Function

Решение, где вызывать эту функцию, - это отдельная история. Конечно, вы можете вызывать его внутри каждой процедуры в своей надстройке Dependent, но, вероятно, было бы лучше поместить его в процедуру Workbook_Open только один раз:

Sub Workbook_Open()
    Call IsAddInInstalled("MainAddIn.xlam")
End Sub

Таким образом, каждый раз, когда пользователь открывает Excel, он будет проверять доступность «основной» надстройки и поднимать окно сообщения, если оно недоступно.

person David Zemens    schedule 21.10.2015
comment
Большое спасибо, я полагаю, я мог бы просто добавить к этому сообщение об ошибке и вывести, пожалуйста, установите MainAddIn.xlam, какой тип обработки ошибок / ответа у него есть? - person Christopher Dermody-Lawrence; 21.10.2015
comment
Вы могли бы это сделать, за исключением того, что я не уверен, что произойдет, если в MainAddIn возникнет ошибка, вероятно, лучше вместо этого выполнить проверку активных надстроек (см. Дополнительную вспомогательную функцию, которую я добавил в ответ) - person David Zemens; 21.10.2015