Dotnet VSTO Excel アドインの特定の機能を VBA に公開するには、ユーザーがローカル管理者である必要はありません (つまり、COM 登録なし、 HttpListener なし)。VBA から Microsoft メッセージ キューを使用することはできますか?
4 に答える
あなたの質問を「COM 登録なしで .Net アセンブリの機能を Excel に公開するにはどうすればよいですか」と広く解釈できる場合、優れた解決策は Excel の XLL インターフェイスを使用することです。基本的に、xll shim と関連する .Net dll をデプロイします。xll が読み込まれると、dll に反映され、その中の関数が Excel に公開されます。
オープン ソースの実装は、http://exceldna.typepad.com/blog/2006/01/introducing_exc.htmlにあります。
商用のクローズド ソースですが、より機能豊富なこちらの http://www.managedxll.com/
VSTO は既定のアプリケーション ドメインで実行されないため、単純に COM オブジェクトとしてインスタンス化することはできません。
これが私が行った方法ですが、これは確かに少し複雑です。これは、いくつかの点で純粋な VSTO アドインよりも柔軟性が高い XLA ファイルとして保存された VSTO ブックを使用していました。
VBA コードによって参照される regasm.exe を使用して、タイプ ライブラリを生成する必要があります。
.NET オブジェクト モデルにルート ファクトリ クラスを作成します。これにより、VBA で使用する任意のクラス (Office オブジェクト モデルの "Application" クラスのようなもの) をインスタンス化できます。
次に、このファクトリ クラスのインスタンスへの参照を VBA に渡す方法を見つける必要があります。VBA がこのファクトリ クラスのインスタンスへの参照を取得すると、そのメソッドを呼び出して、.NET オブジェクト モデル内の他のオブジェクトをインスタンス化できます。
インスタンスを VBA に渡すには、次のように VBA コードでマクロを定義します。
コード例:
Private m_objMyFactory As Object
Public Sub RegisterFactory(MyFactory As Object)
On Error GoTo ErrHandler
Set m_objMyFactory = MyFactory
Exit Sub
ErrHandler:
MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description
Exit Sub
End Sub
- 次に、VSTO ThisWorkbook_Open イベント ハンドラーにコードを追加します。これにより、ファクトリ オブジェクトがインスタンス化され、ファクトリ オブジェクトへの参照を渡す上記のマクロが呼び出されます。
コード例:
void ThisWorkbook_Open()
{
try
{
ThisApplication.Run("RegisterFactory",
new MyNamespace.MyFactory(),
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
}
catch (Exception ex)
{
MessageBox.Show("Load error: " + ex.ToString());
}
}
これを確実に機能させるために考慮すべき問題が他にもいくつかあります。これを追跡することに興味がある場合は、私に知らせてください。詳細を投稿します。
Excel4Net に興味があるかもしれません (ExcelDNA や ManagedXll に似ていますが、使いやすいです)。
ウェブサイト: http://www.excel4net.com
将来の読者のための参考のために:この質問も見てみたいかもしれません:
VBA (Excel) から VSTO アプリケーション アドイン タイプにアクセスする
特に、そこで参照されているブログ:
VSTO アドイン、COMAddIns および RequestComAddInAutomationService
RequestComAddInAutomationService()をオーバーライドすることで、すべての機能のエントリ ポイントを提供する Facade クラスを定義し、そのクラスを VBA に公開することで、必要な機能を公開できます。