質問

ユーザーがローカル管理者である必要なしに、Dotnet VSTO Excel アドインの特定の機能を VBA に公開する最善の方法は何でしょうか (例:COM登録なし、 HttpListener なし)?VBAからMicrosoft Message Queueを使用することは可能でしょうか?

役に立ちましたか?

解決

あなたの質問を「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 オブジェクトとしてインスタンス化することはできません。

以下に私がやった方法を示しますが、確かに少し複雑です。これは、XLA ファイルとして保存された VSTO ブックを使用したもので、ある意味、純粋な VSTO アドインよりも柔軟性があります。

  • regasm.exe を使用して、VBA コードによって参照されるタイプ ライブラリを生成する必要があります。

  • .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 に似ていますが、より使いやすいです)。

Webサイト:http://www.excel4net.com

ブログ:http://excel4net.blogspot.com

今後読む人のために参考までに:次の質問も参照してください。

VBA (Excel) から VSTO アプリケーション アドイン タイプにアクセスする

特に、そこで参照されているブログについては次のとおりです。

VSTO アドイン、COMAddIns および RequestComAddInAutomationService

オーバーライドすることで RequestComAddInAutomationService() これらすべての機能のエントリ ポイントを提供する Facade クラスを定義し、そのクラスを VBA に公開することで、必要な機能を公開できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top