VSTO の新機能 : VBA との相互運用 (インターオペラビリティ)


【環境】
Microsoft Office 2007 Enterprise
Visual Studio Codename Orcas (Beta 1)

Orcas  でみる VSTO の新機能

  1. リボンのデザインサポート
  2. Word コンテントコントロールのデータバインド
  3. ClickOnce
  4. Outlook フォーム リージョン (ここから Beta 1 を使っています、、、)
  5. VBA との相互運用
  6. SharePoint ワークフローの作成と配置の自動化

こんにちは。 

今日は、昨日から再開した Orcas の VSTO 新機能の続きとして、VBA との相互運用の新機能についてご紹介します。
現状 (Visual Studio 2005) の Application.Run (または Application.RunOld) など VSTO のマネージコードから VBA で作成したマクロを実行できますが、この逆をおこなえるという仕組みです。

既にご紹介しました通り Orcas の ClickOnce サポートなどにより配置の問題などもクリアされ、VSTO は情報システム部門の方など専属の部門で展開される企業システムの1つの選択肢 (BI 的なプラットフォーム) として利用する上での課題はかなりクリアされてきていますが、それでも、Visual Studio を買わなければ使えない!と考えるエンドユーザ寄りのパワーユーザ的な方々(例えば、エンドユーザ部門に居ながら、自らコードを作成して機能拡張がおこなえる高度なスキルを持ったエンドユーザの方々)にとっては、VSTO はまだ敷居の高い存在となっており、VBA はまだまだ必要とされることでしょう。 
札幌の CLT ラウンチイベント (こちら) で今村丈史さんからも、こうした背景を含めた、的を得たご説明がありましたが、VSTA が Excel、Word などの主要アプリで使えない現状では、この相互運用機能は重要な位置付けとなります。こうした VBA を使われるエンドユーザ側の利用者の方(会社専属の開発者でないパワーユーザの方)に .NET が提供する高度な仕組み (Web サービスとの連携、等々) をエクスポーズする方法として、この機能は有効に利用できることでしょう。

では、さっそく方法を簡単にご紹介してイメージをつかんでもらいましょう。

実は、後述している EnableComCallers プロパティですが、これは VB プロジェクトのみで設定可能です。Visual C# のコードを呼び出す方法は、以下を参照してください。(この理由について以下に掲載されていますが、簡単に言うと、言語間でのアーキテクチャの相違に寄ります。)

http://msdn2.microsoft.com/en-us/library/bb157883(VS.90).aspx

  1. まず、VSTO 呼び出しをおこなえるようにするため、VBA プロジェクトの属性を変更する必要があります(後ほど VBA の ThisWorkbook や Sheet1 などのモジュールをみて頂くとわかりますが、VBA 側にコードが追加されます)。このため、手順としては先に VBA プロジェクトを作成し、VSTO 側からこの属性を変更するという手続きが必要となります。
    VSTO のプロジェクトを作成して、その中でVBAプロジェクトを先に作成して保存するという方法でも良いですが、今回は、VBA プロジェクトを含んだ既存のブックやドキュメントを先に作成しておき、これを VSTO のプロジェクトで使うドキュメントとして取り込んでみましょう。
    • Excel を起動し、[表示] - [マクロ] メニューなどから新しくマクロモジュールを作成します。(あるいは [開発] タブを表示してマクロを編集可能にしてマクロを作成します。)
    • マクロが使えるように、[Excel オプション] (または [Word オプション]) から [セキュリティーセンターの設定] ボタンを押して、作成したマクロが有効になるように設定 (例えば、信頼できるロケーションとして追加する、など) しておいてください。
    • Visual Studio Codename Orcas を起動し、プロジェクトの新規作成で、[Visual Basic] - [Office] - [2007] の [Excel Workbook] のプロジェクトを選択します。
    • ウィザードの [Select a Document for Your Application] の画面で、[Copy an existing document] をチェックし、先ほど作成したブックを選択します。(初回利用時は、セキュリティに関する設定画面 (VBA を有効にするかどうか) が表示されるので、[Yes] を押して先に進めてください。)
    • 今回は Sheet1 のホストアイテムを使ってVSTO呼び出しをおこなえるようにしましょう。
      まず、ソリューションエクスプローラから、Sheet1.vb をクリックではなく、ダブルクリックしてください。表示されるプロパティペインの [EnableComCallers] を True に変更します。(ThisWorkbook に対して設定することもできます。)
  2. Sheet1.vb のコードを表示し、テスト用に以下の Public のメソッドを作成します。

    Public Sub MyTestMethod()
        MessageBox.Show("Hello, VSTO World !");
    End Sub
  3. プロジェクトをリビルドします。
  4. 通常は発行などおこないますが、今回はテストのため、binDebug 下の xlsm ファイルをそのまま開いてみましょう。(ブックがコピーされて場所が変更された関係で、また該当のロケーションを有効にする必要があるかもしれません。上述の方法で再度マクロを有効にしておいてください。)
  5. Excel 上で [開発] タブを表示し、リボンから [開発] タブの中の [Visual Basic] を選択して VBA のエクスプローラを表示します。
    モジュールの上で、例えば、以下のようなプロシジャを作成してみましょう。

    Sub Macro1()
        Sheet1.CallVSTOAssembly.MyTestMethod
    End Sub
  6. マクロの再生をおこなうと、正しく実行されることがわかります。

この仕組みが使えるのは、現在の計画では、Word と Excel のみで、Word の場合は、.docm、.dotm、.doc、.dot で
また Excel の場合は、.xlsm、.xltm、.xls、.xlt でこの方法を利用することができます。(当然のことながら、docx、xlsx はマクロが有効なドキュメントではないので不可能です。)

※ ここでは、Visual Studio Codename Orcas の Beta 1 を使用しています。使用されているクラスや機能は予告なく変更されることがありますのでご容赦ください。

追記 : 上記はドキュメント レベルの VSTO プロジェクトですが、VBA から AddIn の関数を呼び出すには、VBA 上で Application.COMAddIn オブジェクトを使用します。下記にコードが記載されていますので、参考にしてください。

[MSDN] アプリケーション レベルのアドインのコードを VBA から呼び出す
http://msdn.microsoft.com/ja-jp/library/bb608614.aspx

 

関連ナンバー

 

Skip to main content