COMとVBAのどちらを回避する方法があるかについては、それが可能だとは思いません(少なくとも、非常に汚いトリックがなければ)。その理由は、Officeが外部コード(つまり、アドイン)を実行できる唯一の方法はCOM経由であるためです。VSTOでさえ、その下にある古いIDTExtensibility2COMインターフェイスをまだ使用しています。IDTExtensibility2は、MicrosoftOfficeアプリケーションのすべてのアドインが実装する必要のあるCOMインターフェイスです。
VSTOの前は、OfficeアドインはこのIDTExtensibility2インターフェイスを自分で実装する必要がありました。このようなCOMベースのアドイン(またはCOMに表示されるマネージドアドイン)では、ここで説明するようにUDFを追加するだけです。
ただし、VSTOでは、抽象化の追加レイヤーがあります。VSTOは、VSTOランタイムによって提供されるdllであるIDTExtensibility2を実装するいわゆるソリューションローダーを使用します。これは、アドインがCOMに表示されなくなったことを意味します。したがって、UDFをVSTOアドインに追加した場合、Officeには表示されません。
Paul Stubbsは、ブログでVSTOとVBAの操作方法を説明してい ます。VSTOマネージコードでExcelUDFを作成する方法
VSTOの関数を使用してクラスを作成します
<System.Runtime.InteropServices.ComVisible(True)>
Public Class MyManagedFunctions
Public Function GetNumber() As Integer
Return 42
End Function
End Class
クラスをVSTOの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になります。