7

複雑なことを行うパブリック メソッド Foo() を持つ C# Excel アドイン プロジェクト「MyExcelAddIn」があります。テスト目的で、このアドインは Foo() に接続されたツールバー ボタンも定義するので、これをテストして、ボタンをクリックすると Foo() が呼び出され、目的の動作を実行することを確認できます。これで問題ありません。

ここで、C# Windows フォーム プロジェクトからこのメソッドを呼び出したいと思います。Windows フォーム プロジェクトでは、Excel インスタンスを作成して表示し、VSTO アドインが実行されており、ボタンが表示され、機能することを確認できます。しかし、Windows フォーム プロジェクトからプログラムで Foo() を呼び出す方法がわかりません。私は少しググって、「MyExcelAddIn」COMAddInオブジェクトを取得するところまで行きましたが、Foo()を呼び出す方法がわかりません。

次のようになります。

// Create Excel and make it visible
Application excelApp = new Application();
excelApp.Visible = true;

// I know my VSTO add-in is running because I can see my test button
// Now get a reference to my VSTO add-in
Microsoft.Office.Core.COMAddIns comAddIns = _excelApp.COMAddIns;
object addinName = "MyExcelAddIn";
Microsoft.Office.Core.COMAddIn myAddin = comAddIns.Item(ref addinName);
// This works, but now what? How do I make a call on myAddin?
// Note that myAddin.Object is null...

そこで、Windows フォーム アプリケーションから Foo() を呼び出すために何ができるかを知りたいと思います。私は Windows フォーム アプリケーションとアドインの両方を完全に制御しており、両方 (特にアドイン) に変更を加える必要があると思いますが、その方法がわかりません。

これは VS2008 C# アプリケーションであり、Excel 2003 を使用していることに注意してください。

4

4 に答える 4

5

アプリケーション レベルのアドインを構築している場合、これが答えになると思います: MSDN VSTO の記事

それには2つのステップがあります: (記事より)

  1. アドインで、オブジェクトを他のソリューションに公開します。
  2. 別の解決策では、アドインによって公開されたオブジェクトにアクセスし、オブジェクトのメンバーを呼び出します。

他の解決策は次のとおりです。(再び記事から)

  • アドインとは異なるプロセスで実行されているソリューション (これらの種類のソリューションは、アウトプロセス クライアントとも呼ばれます)。これらには、Windows フォームやコンソール アプリケーションなどの Office アプリケーションを自動化するアプリケーションや、別のプロセスで読み込まれるアドインが含まれます。
于 2009-05-14T04:53:36.557 に答える
1

これを行うためにSendMessageWin32APIを使用しています。私のC#アドインは、WinFormアプリが見つけることができる一意のウィンドウタイトルを持つ「NativeWindow」を作成します。

于 2009-03-14T16:21:26.580 に答える
0

あなたのメソッドFooはどういうわけかExcelと相互作用すると思います。それ以外の場合は、Fooメソッドを使用してクラスを含むアセンブリへの参照を追加し、Excelをインスタンス化せずにそこから呼び出すことができます。

私が考えることができる他の唯一の方法は、excelAppオブジェクトを介してCommandBarButtonへの参照を取得することです。CommandBarButtonには、ボタンのクリックに似たExecuteというメソッドがあります。このようなもの:

        Excel.Application excelApp = new Excel.Application(); 
        CommandBarButton btn = excelApp.CommandBars.FindControl(...) as CommandBarButton;
        btn.Execute();
于 2009-02-13T07:45:29.867 に答える