Относительно того, есть ли способ вокруг COM или VBA, я не думаю, что это возможно (по крайней мере, не без каких-либо очень грязных трюков). Причина в том, что единственный способ, которым Office может выполнять внешний код (т. Е. Надстройка), - через COM. Даже VSTO по-прежнему использует старый интерфейс COM IDTExtensibility2. IDTExtensibility2 - это COM-интерфейс, который должен реализовывать все надстройки для приложений Microsoft Office.
Перед VSTO надстройкам Office должен был реализовать этот интерфейс IDTExtensibility2. В такой надстройке, основанной на COM (или управляемой надстройкой COM-видимости), вы можете просто добавить свой UDF, как описано here.
Однако теперь с VSTO существует дополнительный слой абстракции: VSTO использует так называемый Solution Loader, реализующий IDTExtensibility2, который является dll, предоставляемым средой VSTO. Это означает, что надстройка больше не видима COM. Следовательно, если вы добавили UDF в свою надстройку VSTO, он не будет виден Office.
Пол Стаббс объясняет в своем блоге, как это сделать с VSTO и VBA: How to create Excel UDFs in VSTO managed code
Создать класс со своими функциями в VSTO
<System.Runtime.InteropServices.ComVisible(True)>
Public Class MyManagedFunctions
Public Function GetNumber() As Integer
Return 42
End Function
End Class
Wire вверх ваш класс VBA в ВСТО
Private Sub ThisWorkbook_Open() Handles Me.Open
Me.Application.Run("RegisterCallback", New MyManagedFunctions)
End Sub
Создание Крюка для управляемого кода и обертки для функций в VBA
В модуле VBA в таблице или документе
Dim managedObject As Object
Public Sub RegisterCallback(callback As Object)
Set managedObject = callback
End Sub
Public Function GetNumberFromVSTO() As Integer
GetNumberFromVSTO = managedObject.GetNumber()
End Function
Теперь вы можете ввести =GetNumberFromVSTO()
в клетке, когда первенствовать начинается ячейка значение должно быть 42.
Привет - спасибо. Да, я знаю, что, используя некоторые VBA и COM, украшающие мой класс, я могу это сделать, но это не отвечает на вопрос, учитывая предостережения этого вопроса. – ng5000
Я отредактировал свой ответ, чтобы объяснить, почему я думаю, что вокруг COM или VBA нет никакого пути. –