Относительно того, есть ли способ обойти COM или VBA, я не думаю, что это возможно (по крайней мере, без каких-либо очень грязных уловок). Причина в том, что Office может выполнять внешний код (то есть, надстройку) только через COM. Даже VSTO все еще использует старый COM-интерфейс IDTExtensibility2. IDTExtensibility2 - это интерфейс COM, который должны быть реализованы всеми надстройками для приложений Microsoft Office.
До появления VSTO надстройкам Office приходилось самостоятельно реализовывать этот интерфейс IDTExtensibility2. В такой надстройке на основе COM (или управляемой надстройке, видимой для COM) вы можете просто добавить свой UDF, как описано здесь .
Однако теперь с VSTO существует дополнительный уровень абстракции: VSTO использует так называемый Solution Loader , реализующий IDTExtensibility2, который является dll, предоставляемым средой выполнения VSTO. Это означает, что ваша надстройка больше не видна COM. Следовательно, если вы добавили UDF в свою надстройку VSTO, она не будет видна Office.
Пол Стаббс объясняет в своем блоге, как делать с VSTO и VBA: Как создавать UDF Excel в управляемом коде VSTO
Создайте класс со своими функциями в VSTO
<System.Runtime.InteropServices.ComVisible(True)>
Public Class MyManagedFunctions
Public Function GetNumber() As Integer
Return 42
End Function
End Class
Подключите свой класс к 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()
в ячейке, когда Excel запускает ячейку
значение должно быть 42.